Как получить TestRunId по номеру сборки с помощью API TFS?

Нам нужно запустить тесты и опубликовать результаты в пользовательской среде ContinousIntegration. MSTest используется для тестирования, поэтому мы используем командную строку сборки tfs. После выполнения тестов / сборки с использованием tfsbuild.exe я получаю BuildNumber и updatedBuildNumber.

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>tfsbuild start "tfsurl" "TeamProjectName" "BuildDefinitionName"
Microsoft (R) TfsBuild Version 10.0.0.0
for Microsoft Visual Studio v10.0
Copyright (c) Microsoft Corporation.  All rights reserved.

Build number: 36399
    Updated Build number: XYZ_20140405.1
Succeeded

Я использую UpdateBuildNumber для запроса tfs и получения BuildUri.

Uri tfsUri = new Uri("tfsurl");
TfsTeamProjectCollection _tfs = new TfsTeamProjectCollection(tfsUri);
IBuildServer tfsBuildServer = _tfs.GetService<IBuildServer>();
        IBuildDefinitionSpec buildSpec =                               
                       tfsBuildServer.CreateBuildDefinitionSpec("TeamProjectName");
        IBuildDetail buildDetail = tfsBuildServer.GetBuild(buildSpec, 
        "XYZ_20140405.1", null, QueryOptions.All);

buildDetail имеет BuildUri, который передается для получения TestRunId, с помощью которого можно экспортировать файл TestResults (trx) (команда tcm)

ITestManagementService test_service =  (ITestManagementService)_tfs.GetService(typeof(ITestManagementService));
        ITestManagementTeamProject _testproject = test_service.GetTeamProject("TeamProjectName");
  var testRuns = _testproject.TestRuns.ByBuild(buildDetail.Uri);
        int testRunId= 0;
        if (buildDetail.BuildFinished)
        {
            foreach (ITestRun item in testRuns)
            {
                testRunId= item.Id;
            }
        }

Этот код не всегда работает. получение сборки uri работает, но testRunId не удается, говоря, что Enumertion Yeilded Нет результатов. Может кто-нибудь подсказать, как получить TestRunId, используя BuildNumber или updatedBuildNumber?

2 ответа

У меня была такая же проблема с получением ITestRun с BuildUri, Я нашел 2 способа решить эту проблему, которая сработала для меня:

// after getting the build details, get all test runs and compare matching properties:
IBuildDetail buildDetail = tfsBuildServer.GetBuild(buildSpec, "XYZ_#", null, QueryOptions.All);

// get test run by title and build number, surprisingly they match:
ITestRun testRun = _testproject.TestRuns.Query("SELECT * FROM TestRun").Where(x => x.Title == buildDetail.BuildNumber).Single();

// get test run by their finish time:
ITestRun testRun = _testproject.TestRuns.Query("SELECT * FROM TestRun").Where(x => x.LastUpdated == buildDetail.LastChangedOn).Single();

int testRunId = testRun.Id;

Я только что запустил ваш код, и он отлично работает для меня.

Тем не менее, я запускаю этот код для сборки, которая была завершена около часа назад.

Вы запускаете этот код сразу после завершения сборки?
Если так, возможно, информация о тестовом прогоне еще не была обновлена ​​в TFS.
Попробуйте запустить его через несколько минут.

Другие вопросы по тегам