visual test studio professional coverage code visual-studio-2012 vstest

visual studio 2012 - studio - Especificación de nombre de archivo de resultados para vstest.console.exe



visual studio 2017 professional code coverage (4)

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

Extracto del blog de Bhuvaneshwari :

Si la ubicación predeterminada de los resultados debe ser reemplazada, el usuario debe pasar este valor utilizando un archivo de ejecución de registros.

Ejemplo:

Mstest.exe /testcontainer:abc.dll /results:C:/Results.trx Vstest.console.exe abc.dll /settings:output.runsettings

donde el contexto del archivo .runsettings sería algo como a continuación:

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

Puede ser una pregunta tonta, pero ¿alguien sabe cómo especificar el nombre de archivo de salida de una ejecución VSTEST.Console.exe? Mi línea de comando 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 archivo .runsettings para especificar la ubicación de salida, pero eso solo parece controlar el directorio de salida, pero no el archivo de salida. No he encontrado nada más que parezca controlarlo.

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

Me falta algo aquí ...


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

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

Tal vez es algo nuevo

Actualización: Esto también funciona para los proyectos de .NET Framework usando la última plataforma de prueba y vstest.console.exe


No, no te estás perdiendo nada. El registrador TRX no admite ningún parámetro (a diferencia del registrador de editor TFS).

El ensamblado 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 comprueba en su descompilador .NET favorito, verá el método TrxLogger.GetTrxFileName . Utiliza algunos conocimientos básicos sobre la ejecución de prueba actual para producir el nombre destrozado de form {username}_{workstation} {timestamp}.trx y no se puede configurar de manera apreciable.

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

  • Crea una nueva carpeta temporal
  • Cambia el directorio actual a él
  • Ejecute el corredor de prueba
  • Escanee la carpeta para el archivo .trx resultante utilizando su método de búsqueda de archivos recursivo favorito y listo

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

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

Es decir, reúna todos los archivos .trx en el directorio actual y @(TestResult) el grupo de elementos @(TestResult) para un procesamiento posterior.


Tuve este problema también. Decidí escribir un objetivo MSBuild que ejecute vstest.console a través de la tarea EXEC, manejando todos sus resultados, incluidos los resultados de cobertura.

Básicamente, capturé la salida de vstest y usé una expresión regular para capturar la porción * .trx y * .coverage de la salida, que resultó ser realmente 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 * .coverage (opcionalmente).

El script puede parecer un poco complejo, pero fue 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>