web-dev-qa-db-fra.com

Spécification du nom du fichier de résultats pour vstest.console.exe

Peut-être une question stupide, mais quelqu'un sait-il comment spécifier la sortie nom de fichier d'une exécution VSTEST.Console.exe? Ma ligne de commande est la suivante:

 vstest.console.exe [Assembly] /logger:trx

À la fin de la course, ce qui suit apparaît dans la console:

 ResultsFile: somepath\TestResults\{username}_{workstation} {timestamp}.trx

J'ai essayé d'utiliser le fichier . Runsettings pour spécifier l'emplacement de sortie, mais cela ne semble contrôler que le répertoire de sortie, mais pas le fichier de sortie. Je n'ai rien trouvé d'autre qui semble le contrôler.

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!)

Je dois manquer quelque chose ici ...

51
syazdani

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 les versions postérieures et antérieures à 2017.


Non, vous ne manquez de rien. L'enregistreur TRX ne prend en charge aucun paramètre (contrairement à l'enregistreur 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 décompilateur .NET préféré, vous verrez la méthode TrxLogger.GetTrxFileName. Il utilise certaines connaissances de base sur le test en cours pour produire le nom de forme déformé {username}_{workstation} {timestamp}.trx Et n'est en aucune façon configurable.

Autant que je sache, le fichier TRX est créé dans le dossier TestResults\ Sous le répertoire de travail actuel, sauf configuration contraire. Ce que vous pouvez faire, c'est:

  • Créer un nouveau dossier temporaire
  • Remplacez-le par le répertoire actuel
  • Exécutez le lanceur de test
  • Scannez le dossier pour le fichier de résultat .trx En utilisant votre méthode de recherche de fichier récursive préférée et vous avez terminé

C'est du moins ce que je fais dans notre build (MSBuild, sanglot):

<ItemGroup>
  <TestResult Include="**\*.trx"/>
</ItemGroup>

C'est-à-dire, regroupez tous les fichiers .trx Dans le répertoire courant et placez-les dans le groupe d'éléments @(TestResult) pour un traitement ultérieur.

50
Stefan Dragnev

Cela a fonctionné pour moi pour tester le noyau .net, je ne l'ai pas essayé avec le framework .net:

vstest.console.exe [Assembly] /logger:trx;LogFileName=[filename].trx

C'est peut-être une nouvelle chose

Mise à jour: Cela fonctionne également pour les projets de framework .net utilisant la dernière plate-forme de test et vstest.console.exe

16
Ana Franco

Apparemment, vous pouvez spécifier un répertoire où placer le fichier * .trx (mais pas le fichier lui-même). Cela se fait cependant via le fichier .runsettings plutôt que via la ligne de commande.

Extrait de blog de Bhuvaneshwari :

Si l'emplacement par défaut des résultats doit être remplacé, l'utilisateur doit transmettre cette valeur à l'aide d'un fichier de runettings.

Exemple:

Mstest.exe /testcontainer:abc.dll /results:C:\Results.trx 

Vstest.console.exe abc.dll /settings:output.runsettings 

où le contexte du fichier .runsettings serait quelque chose comme ci-dessous:

<?xml version="1.0" encoding="UTF-8"?> 
<RunSettings> 
  <RunConfiguration>
   <ResultsDirectory>c:\</ResultsDirectory>
  </RunConfiguration>
 </RunSettings>
16
Kosau

J'avais aussi ce problème. 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.

Fondamentalement, j'ai capturé la sortie vstest et utilisé une expression régulière pour capturer la partie * .trx et * .coverage de la sortie, ce qui s'est avéré être vraiment facile. De plus, il supprime le répertoire TestResults pour garder l'espace de travail agréable et propre.

À la fin, vous obtiendrez le fichier * .trx et le fichier * .coverage (en option).

Le script peut sembler un peu complexe, mais il était nécessaire de répondre à nos besoins. J'ai essayé de le nettoyer un peu. J'espère que cela t'aides.

<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 ->'&quot;%(FullPath)&quot;', ' ')" />
      <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:&quot;$(VSTestCaseFilter)&quot;" />
      <VSTestParams Condition="$(VSTestRunSettings) != ''" Include="/Settings:&quot;$(VSTestRunSettings)&quot;" />
    </ItemGroup>

    <Message Text="TestAssembly: %(VSTestFiles.Identity)" Importance="high"/>

    <Exec ContinueOnError="!$(VSTestFailBuildOnTestFail)" ConsoleToMSBuild="true" WorkingDirectory="$(WorkingDirectory)" Condition=" '@(VSTestFiles)' != ''" 
          Command="&quot;$(VSTestExe)&quot; @(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>(?&lt;=(Results File: )).*.trx</ResultsFileRegexPattern>
      <CoverageFileRegexPattern>(?&lt;=(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>
10
calexandre