如何使用Team Foundation Server API创建测试运行和结果?

我找到了几个关于使用TFS API检索测试结果的示例,但没有关于以编程方式创建结果的文档。 我的目标是创建一个轻量级的替代方法,使用Microsoft Test Manager来运行手动测试。 有任何人对此有经验吗? 那里有没有我错过的例子吗?

这是我到目前为止所拥有的:

ITestCaseResult CreateNewTestCaseResult(ITestSuiteEntry testCaseEntry) { var run = testCaseEntry.TestSuite.Plan.CreateTestRun(false /* not automated */); run.AddTest(testCaseEntry.TestCase.Id, suiteEntry.TestSuite.DefaultConfigurations[0].Id, suiteEntry.TestSuite.Plan.Owner); run.Save(); // so that results object is created return run.QueryResults()[0]; } 

我不确定这是否是启动新运行的正确方法,我不确定如何记录测试的每个操作的结果。

2012年8月15日更新:

下面的示例现已集成到我的开源TFS测试步骤编辑器工具中。 在最新版本中,它获得了将测试结果发布到TFS的能力。 请参阅GitHub上的源代码。


我现在有用于发布测试结果的工作代码。 请注意,以下代码接受ITestPoint(这表示特定套件中的测试用例)并且具有一些内部类(未包括在内),它们仅为每个步骤提供结果和附件路径。

 var tfsRun = _testPoint.Plan.CreateTestRun(false); tfsRun.DateStarted = DateTime.Now; tfsRun.AddTestPoint(_testPoint, _currentIdentity); tfsRun.DateCompleted = DateTime.Now; tfsRun.Save(); // so results object is created var result = tfsRun.QueryResults()[0]; result.Owner = _currentIdentity; result.RunBy = _currentIdentity; result.State = TestResultState.Completed; result.DateStarted = DateTime.Now; result.Duration = new TimeSpan(0L); result.DateCompleted = DateTime.Now.AddMinutes(0.0); var iteration = result.CreateIteration(1); iteration.DateStarted = DateTime.Now; iteration.DateCompleted = DateTime.Now; iteration.Duration = new TimeSpan(0L); iteration.Comment = "Run from TFS Test Steps Editor by " + _currentIdentity.DisplayName; for (int actionIndex = 0; actionIndex < _testEditInfo.TestCase.Actions.Count; actionIndex++) { var testAction = _testEditInfo.TestCase.Actions[actionIndex]; if (testAction is ISharedStepReference) continue; var userStep = _testEditInfo.SimpleSteps[actionIndex]; var stepResult = iteration.CreateStepResult(testAction.Id); stepResult.ErrorMessage = String.Empty; stepResult.Outcome = userStep.Outcome; foreach (var attachmentPath in userStep.AttachmentPaths) { var attachment = stepResult.CreateAttachment(attachmentPath); stepResult.Attachments.Add(attachment); } iteration.Actions.Add(stepResult); } var overallOutcome = _testEditInfo.SimpleSteps.Any(s => s.Outcome != TestOutcome.Passed) ? TestOutcome.Failed : TestOutcome.Passed; iteration.Outcome = overallOutcome; result.Iterations.Add(iteration); result.Outcome = overallOutcome; result.Save(false); 

测试操作似乎没有用于设置通过/失败或添加附件的属性。

 public interface ITestAction : INotifyPropertyChanged { int Id { get; } ITestBase Owner { get; } ITestActionGroup Parent { get; } ITestAction CopyToNewOwner(ITestBase newOwner); void MoveToNewOwner(ITestBase newOwner); } 

这是在父级(TestCase)完成的。

 ITestCaseResult result = run.QueryResults()[0]; IAttachmentCollection collection = result.Attachments; string x = result.Comment; 

以下是您正确启动新运行的方式:

 namespace SampleRunCreation { class Program { static void Main(string[] args) { TfsTeamProjectCollection tfs = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("http://pradeepn-tcm:8080/tfs/DefaultCollection")); ITestManagementTeamProject project = tfs.GetService().GetTeamProject("Pradeep"); // Create a test case. ITestCase testCase = CreateTestCase(project, "My test case"); // Create test plan. ITestPlan plan = CreateTestPlan(project, "My test plan"); // Create test configuration. You can reuse this instead of creating a new config everytime. ITestConfiguration config = CreateTestConfiguration(project, string.Format("My test config {0}", DateTime.Now)); // Create test points. IList testPoints = CreateTestPoints(project, plan, new List(){testCase}, new IdAndName[] { new IdAndName(config.Id, config.Name) }); // Create test run using test points. ITestRun run = CreateTestRun(project, plan, testPoints); // Query results from the run. ITestCaseResult result = run.QueryResults()[0]; // Fail the result. result.Outcome = TestOutcome.Failed; result.State = TestResultState.Completed; result.Save(); Console.WriteLine("Run {0} completed", run.Id); } private static ITestCase CreateTestCase(ITestManagementTeamProject project, string title) { // Create a test case. ITestCase testCase = project.TestCases.Create(); testCase.Owner = null; testCase.Title = title; testCase.Save(); return testCase; } private static ITestPlan CreateTestPlan(ITestManagementTeamProject project, string title) { // Create a test plan. ITestPlan testPlan = project.TestPlans.Create(); testPlan.Name = title; testPlan.Save(); return testPlan; } private static ITestConfiguration CreateTestConfiguration(ITestManagementTeamProject project, string title) { ITestConfiguration configuration = project.TestConfigurations.Create(); configuration.Name = title; configuration.Description = "DefaultConfig"; configuration.Values.Add(new KeyValuePair("Browser", "IE")); configuration.Save(); return configuration; } public static IList CreateTestPoints(ITestManagementTeamProject project, ITestPlan testPlan, IList testCases, IList testConfigs) { // Create a static suite within the plan and add all the test cases. IStaticTestSuite testSuite = CreateTestSuite(project); testPlan.RootSuite.Entries.Add(testSuite); testPlan.Save(); testSuite.Entries.AddCases(testCases); testPlan.Save(); testSuite.SetEntryConfigurations(testSuite.Entries, testConfigs); testPlan.Save(); ITestPointCollection tpc = testPlan.QueryTestPoints("SELECT * FROM TestPoint WHERE SuiteId = " + testSuite.Id); return new List(tpc); } private static IStaticTestSuite CreateTestSuite(ITestManagementTeamProject project) { // Create a static test suite. IStaticTestSuite testSuite = project.TestSuites.CreateStatic(); testSuite.Title = "Static Suite"; return testSuite; } private static ITestRun CreateTestRun(ITestManagementTeamProject project, ITestPlan plan, IList points) { ITestRun run = plan.CreateTestRun(false); foreach (ITestPoint tp in points) { run.AddTestPoint(tp, null); } run.Save(); return run; } } } 

参考