Spécification du nom de fichier des résultats pour vstest.console.EXE
Peut-être une question stupide, mais quelqu'un sait comment spécifier la sortie nom du fichier d'un VSTEST.Console.exe exécuter? Ma ligne de commande est la suivante:
vstest.console.exe [assembly] /logger:trx
a la fin de la course, le suivant apparaît dans la console:
ResultsFile: somepathTestResults{username}_{workstation} {timestamp}.trx
j'ai essayé d'utiliser le .runsettings fichier pour spécifier l'emplacement de sortie, mais qui ne semble contrôler le répertoire de sortie, mais pas le fichier de sortie. N'ont rien trouvé d'autre qui semblerait le contrôle.
je veux analyser le fichier TRX et en générer un rapport (cela fonctionne déjà, mais si Je ne peux pas spécifier le chemin de sortie du fichier TRX, Je ne saurai pas où le récupérer dans les scripts!)
j'ai manquer quelque chose ici...
4 réponses
EDIT: voir la réponse de @AnaFranco-apparemment depuis VS2017 le nom du fichier peut être configuré comme suit:
vstest.console.exe [assembly] /logger:trx;LogFileName=[filename].trx
je vais laisser l'ancienne réponse pour la postérité et les versions d'avant 2017.
Non, vous ne ratez rien. Le logger TRX ne supporte aucun paramètre (contrairement au logger de l'éditeur TFS).
l'ensemble logger est situé dans "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\Extensions\Microsoft.VisualStudio.TestPlatform.Extensions.TrxLogger.dll"
. Si vous le vérifiez dans votre decompiler .NET préféré, vous verrez la méthode TrxLogger.GetTrxFileName
. Il utilise quelques connaissances de base sur le test courant pour produire le nom mutilé de la forme {username}_{workstation} {timestamp}.trx
et n'est pas configurable de manière appréciable.
pour autant que je sache, le fichier TRX est créé dans le TestResults\
dossier dans le répertoire de travail courant sauf configuré. Ce que vous pouvez faire est:
- Créer un nouveau dossier temporaire
- Change le répertoire courant
- lancer le coureur de test
- scanner le dossier pour la suite
.trx
le fichier à l'aide de votre favori récursive de fichiers de la méthode de recherche et vous avez terminé
du moins c'est ce que je fais dans notre build (MSBuild, sob):
<ItemGroup>
<TestResult Include="**\*.trx"/>
</ItemGroup>
C'est-à-dire, rassembler tous les .trx
les fichiers dans le répertoire courant et des trucs dans le @(TestResult)
groupe d'articles devant faire l'objet d'une poursuite de la procédure.
Apparemment, vous pouvez spécifier un répertoire où mettre le *.fichier trx (mais pas du fichier lui-même). C'est, cependant, fait par .runsettings file plutôt que par ligne de commande.
Extrait de Bhuvaneshwari blog:
si l'emplacement par défaut des résultats doit être dépassé, l'utilisateur doit passez cette valeur en utilisant un fichier runsettings.
Exemple:
Mstest.exe /testcontainer:abc.dll /results:C:\Results.trx
Vstest.console.exe abc.dll /settings:output.runsettings
où le contexte le .runsettings fichier serait quelque chose comme ci-dessous :
<?xml version="1.0" encoding="UTF-8"?>
<RunSettings>
<RunConfiguration>
<ResultsDirectory>c:\</ResultsDirectory>
</RunConfiguration>
</RunSettings>
cela a fonctionné pour moi pour tester .net core Je ne l'ai pas essayé avec .net framework:
vstest.console.exe [assembly] /logger:trx;LogFileName=[filename].trx
c'est Peut-être une chose nouvelle
mise à jour: cela fonctionne aussi pour les projets .net framework en utilisant la dernière plate-forme de Test et vstest.console.exe
j'ai eu ce problème aussi. J'ai décidé d'écrire une cible MSBuild qui exécute vstest.console via la tâche EXEC, en gérant toutes ses sorties, y compris les résultats de la couverture.
En Gros, j'ai capturé la sortie vstest et j'ai utilisé un regex pour capturer l' *.trx et *.partie couverture de la sortie, qui s'est avéré être vraiment facile. De plus, il supprime le répertoire TestResults pour garder l'espace de travail propre et agréable.
À la fin, vous obtiendrez la *.trx fichier et le *.fichier de couverture (optionnel).
le script peut sembler un peu complexe, mais il était nécessaire de s'adapter à nos besoins. J'ai essayé de nettoyer un peu. Espérons que cette aide.
<Target Name="Test" DependsOnTargets="Build">
<!-- Declare the defaults and arrange parameters -->
<PropertyGroup>
<ArtifactsPath Condition=" '$(ArtifactsPath)' == '' ">Artifacts</ArtifactsPath>
<VSTestSessionName Condition=" '$(VSTestSessionName)' == ''">TestResults</VSTestSessionName>
<VSTestExe Condition=" '$(VSTestExe)' == '' ">C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe</VSTestExe>
<VSTestFailBuildOnTestFail Condition=" '$(VSTestFailBuildOnTestFail)' == '' ">false</VSTestFailBuildOnTestFail>
<VSTestInIsolation Condition=" '$(VSTestInIsolation)' == '' ">true</VSTestInIsolation>
<VSTestUseVsixExtensions Condition=" '$(VSTestUseVsixExtensions)' == '' ">true</VSTestUseVsixExtensions>
<VSTestFramework Condition=" '$(VSTestFramework)' == '' ">framework45</VSTestFramework>
<VSTestLogger Condition=" '$(VSTestLogger)' == '' ">trx</VSTestLogger>
<ErrorCode>0</ErrorCode>
</PropertyGroup>
<ItemGroup>
<VSTestResultsPath Include="$(VSTestResultsPath)" />
<VSTestParams Include="@(VSTestFiles ->'"%(FullPath)"', ' ')" />
<VSTestParams Condition="$(VSTestEnableCodeCoverage)" Include="/EnableCodeCoverage" />
<VSTestParams Condition="$(VSTestInIsolation)" Include="/InIsolation" />
<VSTestParams Include="/UseVsixExtensions:$(VSTestUseVsixExtensions)" />
<VSTestParams Include="/Framework:$(VSTestFramework)" />
<VSTestParams Include="/Logger:$(VSTestLogger)" />
<VSTestParams Condition="$(VSTestCaseFilter) != ''" Include="/TestCaseFilter:"$(VSTestCaseFilter)"" />
<VSTestParams Condition="$(VSTestRunSettings) != ''" Include="/Settings:"$(VSTestRunSettings)"" />
</ItemGroup>
<Message Text="TestAssembly: %(VSTestFiles.Identity)" Importance="high"/>
<Exec ContinueOnError="!$(VSTestFailBuildOnTestFail)" ConsoleToMSBuild="true" WorkingDirectory="$(WorkingDirectory)" Condition=" '@(VSTestFiles)' != ''"
Command=""$(VSTestExe)" @(VSTestParams, ' ')">
<Output TaskParameter="ExitCode" PropertyName="ErrorCode"/>
<Output TaskParameter="ConsoleOutput" PropertyName="OutputOfExec" />
</Exec>
<Message Importance="high" Text="VSTest exitcode: $(ErrorCode)"/>
<!-- Use the VSTest output to discover the Results & Coverage files respectively -->
<PropertyGroup>
<!-- Unencoded Regex: (?<=(Results file: )).*?(?=\;)|(?<=(Attachments:;)).*?(?=\;) -->
<ResultsFileRegexPattern>(?<=(Results File: )).*.trx</ResultsFileRegexPattern>
<CoverageFileRegexPattern>(?<=(Attachments:;)).*.coverage</CoverageFileRegexPattern>
<SourceResultsFile>$([System.Text.RegularExpressions.Regex]::Match($(OutputOfExec), $(ResultsFileRegexPattern)))</SourceResultsFile>
<SourceCoverageFile Condition="$(VSTestEnableCodeCoverage)">$([System.Text.RegularExpressions.Regex]::Match($(OutputOfExec), $(CoverageFileRegexPattern)))</SourceCoverageFile>
</PropertyGroup>
<ItemGroup>
<TestArtifact Include="$(SourceResultsFile)" />
<TestArtifact Include="$(SourceCoverageFile)" />
</ItemGroup>
<Warning Condition=" '$(SourceResultsFile)' == '' " Text=".trx file not found" />
<Warning Condition=" $(VSTestEnableCodeCoverage) and '$(SourceCoverageFile)' == '' " Text=".coverage file not found" />
<!-- Copy files to the artifact directory -->
<Copy SourceFiles="@(TestArtifact)" DestinationFiles="@(TestArtifact->'$(ArtifactsPath)$(VSTestSessionName)%(Extension)')" />
<!-- Clear the test results temporary directory -->
<RemoveDir Directories="@(TestResults)" />
<ItemGroup>
<TestFile Include="$(ArtifactsPath)\**$(VSTestSessionName).trx" />
<CoverageFile Include="$(ArtifactsPath)\**$(VSTestSessionName).coverage" />
</ItemGroup>
<Message Text="TestReport: @(TestFile)" />
<Message Text="CoverageReport: @(CoverageFile)" />
</Target>