Как создать тестовый прогон и результат с помощью 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];
}

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


person Aidan Ryan    schedule 28.06.2011    source источник


Ответы (2)


Обновление от 15 августа 2012 г.:

Приведенный ниже пример теперь интегрирован в мой инструмент TFS Test Steps Editor с открытым исходным кодом. В последней версии появилась возможность публиковать результаты тестов в 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);
person Aidan Ryan    schedule 18.11.2011

Тестовое действие, по-видимому, не имеет свойств для настройки «пройдено/не пройдено» или для добавления вложений.

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

Справочник

person Mike Veigel    schedule 28.06.2011
comment
Это начало, в основном то же самое, что и в моем примере. Что я ищу, так это запись «пройдено/не пройдено» для каждого действия в тестовом примере, установка комментариев и прикрепление файлов к каждому действию. - person Aidan Ryan; 29.06.2011
comment
Я не думаю, что, прочитав API, вы можете делать именно то, что хотите. Внутри API нет никаких ассоциаций между комментариями/вложениями и действиями. - person Mike Veigel; 30.06.2011
comment
Я еще немного почитал, думаю, мы почти у цели. У ITestCaseResult есть Iterations (набор ITestIterationResult), у каждого из которых есть Actions (набор ITestActionResult), у каждого из которых есть Outcome и Comment. Я что-нибудь заглушу и отчитаюсь. - person Aidan Ryan; 30.06.2011
comment
Но как бы вы добавили вложение для каждого действия? Это круто, да, дайте мне знать, всегда приятно узнавать что-то новое. - person Mike Veigel; 30.06.2011
comment
О, мой плохой, у ITestActionResult тоже есть коллекция вложений! Скоро выложу код. Спасибо, что указали мне правильное направление. - person Aidan Ryan; 30.06.2011
comment
Ах круто. Да, мне было бы интересно увидеть все это, когда это будет сделано. - person Mike Veigel; 30.06.2011
comment
0 голос против @NgM, как мне использовать ваш код выше, чтобы добавить тестовый пример в определенный TestPlan, а затем в TestSuite? Итак, наконец, я хочу, чтобы мой тестовый пример появился в MTM в Project -> Test Plan -> TestSuite. - person krrishna; 15.08.2012