TFS API 将多个测试点和结果添加到一个测试中 运行

TFS API Add multiple test points and results to one test run

我正在使用 TFS API 添加一个测试 运行 并想向一个测试添加多个测试点 运行 并向其中的每个测试点添加一个测试结果测试 运行。当我在添加第二个测试点后尝试检索测试结果时,我只得到一个测试结果(对应于第一个测试点的那个)。

我在 Windows7 上的 Visual StudioEnterprise 2015 中使用 C# 4.5.2 我的代码是:

设置测试运行(我在测试开始时运行这一次):

    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 的场景之后,它在尝试找到与该测试点对应的测试结果时抛出异常(仅测试结果查询 returns一个测试结果对应于我第一次添加的第一个测试点 运行 该方法)。

当我 运行 使用第二个不同 ID 的方法时,这是抛出异常的行: var tfsTestResult = testRun.QueryResults().Single(r=>r.TestPointId==testPoint.Id); 如果我 运行 使用与第一次相同的 ID 再次使用该方法。 例外情况是:

An exception of type 'System.InvalidOperationException' occurred in System.Core.dll but was not handled in user code

Additional information: Sequence contains no matching element

如果没有匹配的测试结果,我尝试跳过更新测试结果的位,看起来在 MTM 中没有添加第二个测试点,所以我想这是相关的。

我终于发现我想做的事情目前是不可能的。保存 TestRun 后,您不能再添加任何 TestPoint 条目。 将多个测试点添加到测试 运行 的唯一方法是在保存测试 运行 之前将它们全部添加。 参考: TFS API: Cannot add testpoint after testrun is saved

https://blogs.msdn.microsoft.com/nidhithakur/2011/04/08/tfs-programatically-importing-testcase-results-to-mtm/

Ideally, you should be able to add the results while adding the test point to the run but the run.Save() API is only working for single Save right now. So, you will need to add all the testpoints, save the test run and then iterate over the run collection to add results individually.

我更改了我的代码以在 运行 期间存储测试结果,然后将它们批量添加到新的 TestRun 并在所有测试完成后保存 TestRun。 我的新代码是:

    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(investigateRelease1TestPlanId);
    foreach (MtmTestResultInfo result in testResults)
    {
        var testPoints = testPlan.QueryTestPoints("SELECT * FROM TestPoint WHERE TestCaseID = '" + result.TestCaseId + "'");
        var testPoint = testPoints.First();
        testRun.AddTestPoint(testPoint, null);
    }

    testRun.DateStarted = dateStarted;
    testRun.DateCompleted = dateCompleted;
    TimeSpan timeTaken = dateCompleted - dateStarted;
    testRun.State = TestRunState.Completed;
    testRun.Save();
    //cannot add comment until after test run is saved
    testRun.Comment = "my comment"

    var tfsTestResults = testRun.QueryResults();
    foreach (MtmTestResultInfo result in testResults)
    {
        ITestCaseResult tfsTestResult = tfsTestResults.Single(r => r.TestCaseId == result.TestCaseId);
        tfsTestResult.DateStarted = result.DateStarted;
        tfsTestResult.DateCompleted = result.DateCompleted;
        tfsTestResult.Outcome = result.Outcome;
        tfsTestResult.Comment = result.Comment;
        tfsTestResult.ErrorMessage = result.ErrorMessage;
        tfsTestResult.RunBy = testRun.Owner;
        tfsTestResult.Duration = result.DateCompleted - result.DateStarted;
        tfsTestResult.State=TestResultState.Completed;

        tfsTestResult.Save();
        testRun.Save();
    }

    testRun.Save();

支持class存储测试结果:

public class MtmTestResultInfo
{
    public DateTime DateStarted { get; set; }
    public DateTime DateCompleted { get; set; }
    public TestOutcome Outcome { get; set; }
    public int TestCaseId { get; set; }
    public string Comment { get; set; }
    public string ErrorMessage { get; set; }

}