Especificar el nombre de archivo de resultados para vstest.consola.exe


Puede ser una pregunta tonta, pero alguien sabe cómo especificar la salida filename de un VSTEST.Consola.¿exe run? Mi línea de comandos es la siguiente:

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

Al final de la ejecución, aparece lo siguiente en la consola:

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

Intenté usar el .runsettings archivo para especificar la ubicación de salida, pero que solo parece controlar el directorio de salida, pero no el archivo de salida. No han encontrado nada más que parezca controlarlo.

Quiero analizar el archivo TRX y generar un informe a partir de él (esto ya funciona, pero si no puedo especificar la ruta de salida del archivo TRX, no sabré dónde recogerlo en los scripts!)

Tengo que estar perdiendo algo aquí...

Author: David Gardiner, 2013-01-23

4 answers

EDITAR: Ver la respuesta de @AnaFranco-aparentemente desde VS2017 el nombre del archivo se puede configurar así:

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

Dejaré la vieja respuesta para la posteridad y las versiones anteriores a 2017.


No, no te estás perdiendo nada. El TRX logger no soporta ningún parámetro (a diferencia del TFS publisher logger).

El ensamblaje del registrador se encuentra en "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\Extensions\Microsoft.VisualStudio.TestPlatform.Extensions.TrxLogger.dll". Si lo revisas en tu decompilador. NET favorito, verás el método TrxLogger.GetTrxFileName. Utiliza algunos conocimientos básicos sobre la ejecución de prueba actual para producir el nombre mutilado de la forma {username}_{workstation} {timestamp}.trx y no es de ninguna manera apreciable configurable.

Por lo que puedo decir, el archivo TRX se crea en la carpeta TestResults\ bajo el directorio de trabajo actual a menos que se configure de otra manera. Lo que puedes hacer es:

  • Crear una nueva carpeta temporal
  • Cambie el directorio actual a él
  • Ejecute el corredor de prueba
  • Escanee la carpeta en busca del archivo resultado .trx utilizando su método de búsqueda de archivos recursivos favorito y has terminado

Al menos eso es lo que hago en nuestra compilación (MSBuild, sob):

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

Es decir, reunir todos los archivos .trx bajo el directorio actual y rellenarlos en el grupo de elementos @(TestResult) para su posterior procesamiento.

 41
Author: Stefan Dragnev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-15 08:54:13

Aparentemente, puede especificar un directorio donde poner el *.archivo trx (aunque no del propio archivo). Sin embargo, esto se hace a través de .runsettings en lugar de a través de la línea de comandos.

Extracto de El blog de Bhuvaneshwari :

Si la ubicación predeterminada de los resultados debe ser anulada, el usuario debe pase este valor usando un archivo runsettings.

Ejemplo:

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

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

Donde el contexto de la .el archivo runsettings sería algo como abajo:

<?xml version="1.0" encoding="UTF-8"?> 
<RunSettings> 
  <RunConfiguration>
   <ResultsDirectory>c:\</ResultsDirectory>
  </RunConfiguration>
 </RunSettings>
 15
Author: Kosau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-05 12:49:56

Esto me ha funcionado para probar. net core No lo he probado con. net framework:

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

Tal vez es algo nuevo

Actualización: Esto también funciona para proyectos de.net framework utilizando la última plataforma de prueba y vstest.consola.exe

 14
Author: Ana Franco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-20 19:21:20

Yo también tuve este problema. Decidí escribir un objetivo MSBuild que ejecute vstest.consola a través de la tarea EXEC, manejando todas sus salidas, incluyendo los resultados de cobertura.

Básicamente, capturé la salida vstest y usé una expresión regular para capturar el *.trx y *.porción de cobertura de la salida, que resultó ser muy fácil. Además, elimina el directorio TestResults para mantener el espacio de trabajo limpio y agradable.

Al final, obtendrá el *.archivo trx y el *.archivo de cobertura (opcional).

El script puede parecer un poco complejo, pero era necesario para satisfacer nuestras necesidades. Traté de limpiarlo un poco. Espero que esto ayude.

<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
Author: calexandre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-13 00:56:33