13

Я нашел несколько примеров о получении результатов тестирования с использованием TFS API, но без документации по созданию результатов программно. Моя цель - создать легкую альтернативу использованию Microsoft Test Manager для запуска ручных тестов. У кого-нибудь есть опыт? Есть ли какие-то примеры, которые мне не хватает?Как создать тестовый прогон и результат с помощью API Team Foundation Server?

Вот что я до сих пор:

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]; 
} 

Я не уверен, если это правильный способ initate новый разбег, и я не знаю, как записывать результаты для каждого действия из контрольная работа.

ответ

12

Update 15 Авг 2012:

Приведенный ниже пример теперь интегрирован в мое открытое исходный инструмент редактирования тестовых шагов 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); 
11

У тестового действия, как представляется, нет свойств для установки pass/fail или для добавления вложений.

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<ITestManagementService>().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<ITestPoint> testPoints = CreateTestPoints(project, 
                  plan, 
                  new List<ITestCase>(){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<string, string>("Browser", "IE")); 
      configuration.Save(); 
      return configuration; 
     } 

     public static IList<ITestPoint> CreateTestPoints(ITestManagementTeamProject project, 
                 ITestPlan testPlan, 
                 IList<ITestCase> testCases, 
                 IList<IdAndName> 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<ITestPoint>(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<ITestPoint> points) 
     { 
      ITestRun run = plan.CreateTestRun(false); 
      foreach (ITestPoint tp in points) 
      { 
       run.AddTestPoint(tp, null); 
      } 

      run.Save(); 
      return run; 
     } 
    } 
} 

Reference

+0

Это начало, в основном то же самое, что я получил в своем примере. То, что я ищу, это запись pass/fail для каждого действия в тестовом примере, установка комментариев и прикрепление файлов к каждому действию. –

+0

Я обновлю свой ответ. –

+0

Я не думаю, что читаю через API, что вы можете делать именно то, что вы хотите делать. Внутри API отсутствуют ассоциации между комментариями/вложениями и действиями. –