Как получить 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.
Попробуйте запустить его через несколько минут.