2

TFS API を使用してテスト ランを追加していますが、テスト ランに複数のテスト ポイントを追加し、テスト ランの各テスト ポイントに 1 つのテスト結果を追加したいと考えています。2 番目のテスト ポイントを追加した後でテスト結果を取得しようとすると、返されるテスト結果は 1 つだけです (最初のテスト ポイントに対応するもの)。

Windows 7 の Visual StudioEnterprise 2015 で C# 4.5.2 を使用しています。コードは次のとおりです。

テスト実行のセットアップ (テストの開始時にこれを 1 回実行します):

    TfsConfigurationServer configurationServer =
        TfsConfigurationServerFactory.GetConfigurationServer(tfsUri);
    CatalogNode collectionNode = configurationServer.CatalogNode.QueryChildren(
       new[] { CatalogResourceTypes.ProjectCollection },
       false, CatalogQueryOptions.None).Single();
    Guid collectionId = new Guid(collectionNode.Resource.Properties["InstanceId"]);
    TfsTeamProjectCollection teamProjectCollection = configurationServer.GetTeamProjectCollection(collectionId);
    ITestManagementService testManagementService = teamProjectCollection.GetService<ITestManagementService>();
    ITestManagementTeamProject testProject = testManagementService.GetTeamProject(teamProjectName);
    ITestPlan testPlan = testProject.TestPlans.Find(TestPlanId);
    ITestRun testRun = testPlan.CreateTestRun(true);
    testRun.DateStarted = DateTime.Now;
    testRun.IsAutomated = true;
    testRun.Title = "Automated test run " + testRun.DateStarted.ToString();
    testRun.State = TestRunState.InProgress;

テスト結果をテスト実行に追加します (各テスト シナリオが終了した後にこれを実行します)。

    public void AddTestResult(int testCaseId, string testResult,DateTime startedTime, DateTime endedTime, ITestRun testRun)
    {
        if (testRun == null)
        {
            CreateTestRun();
        }


        TfsConfigurationServer configurationServer =
            TfsConfigurationServerFactory.GetConfigurationServer(tfsUri);
        ReadOnlyCollection<CatalogNode> collectionNodes = configurationServer.CatalogNode.QueryChildren(
           new[] { CatalogResourceTypes.ProjectCollection },
           false, CatalogQueryOptions.None);
        var collectionNode = collectionNodes.Single();
        // List the team project collections

        // Use the InstanceId property to get the team project collection
        Guid collectionId = new Guid(collectionNode.Resource.Properties["InstanceId"]);
        TfsTeamProjectCollection teamProjectCollection = configurationServer.GetTeamProjectCollection(collectionId);
        ITestManagementService testManagementService = teamProjectCollection.GetService<ITestManagementService>();
        ITestManagementTeamProject testProject = testManagementService.GetTeamProject(teamProjectName);

        ITestPlan testPlan = testProject.TestPlans.Find(TestPlanId);

        var testPoints = testPlan.QueryTestPoints("SELECT * FROM TestPoint WHERE TestCaseID = '" + testCaseId + "'");
        var testPoint = testPoints.First();
        testRun.AddTestPoint(testPoint,null);
        testRun.TestEnvironmentId = testPlan.AutomatedTestEnvironmentId;
        testRun.Save();

        var tfsTestResult = testRun.QueryResults().Single(r=>r.TestPointId==testPoint.Id);
        tfsTestResult.State = TestResultState.Completed;
        tfsTestResult.DateCompleted = endedTime;
        tfsTestResult.DateStarted = startedTime;

        tfsTestResult.Duration = endedTime - startedTime;

        if (testResult == "passed" && tfsTestResult.Outcome!=TestOutcome.Failed)
        {   // ^ if multiple specflow scenarios have been run with the same test case ID then don't set it to pass if a previous one in this test run has failed
            tfsTestResult.Outcome = TestOutcome.Passed;
        }
        else
        {
            tfsTestResult.Outcome = TestOutcome.Failed;
        }
        tfsTestResult.Save();

        testRun.Save();

    }

最初のシナリオでは問題なく動作しますが、別の testCaseId を使用した次のシナリオの後、そのテスト ポイントに対応するテスト結果を見つけようとすると例外がスローされます (テスト結果クエリは、最初のテストに対応する 1 つのテスト結果のみを返します)。メソッドを初めて実行したときに追加したポイント)。

これは、2 番目の異なる ID でメソッドを実行したときに例外をスローする行ですtestRun.QueryResults().Single(r=>r.TestPointId==testPoint.Id); 。例外は次のとおりです。

タイプ 'System.InvalidOperationException' の例外が System.Core.dll で発生しましたが、ユーザー コードで処理されませんでした

追加情報: シーケンスには一致する要素がありません

一致するテスト結果がなく、MTM で 2 番目のテスト ポイントが追加されていないように見える場合は、テスト結果を更新するビットをスキップしてみました。これは関連していると思います。

4

1 に答える 1