IT이야기

vstest.console.exe에 대한 결과 파일 이름 지정

cyworld 2021. 4. 20. 21:42
반응형

vstest.console.exe에 대한 결과 파일 이름 지정


어리석은 질문 일 수 있지만 VSTEST.Console.exe 실행 의 출력 파일 이름 을 지정하는 방법을 아는 사람이 있습니까? 내 명령 줄은 다음과 같습니다.

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

실행이 끝나면 콘솔에 다음이 표시됩니다.

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

.runsettings 파일을 사용하여 출력 위치를 지정 하려고 시도했지만 출력 파일이 아닌 출력 디렉터리 만 제어하는 ​​것 같습니다. 그것을 통제하는 것처럼 보이는 다른 것을 찾지 못했습니다.

TRX 파일을 구문 분석하고 보고서를 생성하고 싶습니다 (이미 작동하지만 TRX 파일의 출력 경로를 지정할 수없는 경우 스크립트에서 가져올 위치를 알 수 없습니다!)

여기서 뭔가 빠졌어야하는데 ...


편집 : @AnaFranco의 답변 참조-분명히 VS2017 이후 파일 이름은 다음과 같이 구성 할 수 있습니다.

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

후손 및 2017 이전 버전에 대한 이전 답변을 남겨 둘 것입니다.


아니, 당신은 아무것도 놓치고 있지 않습니다. TRX 로거는 TFS 게시자 로거와 달리 매개 변수를 지원하지 않습니다.

로거 어셈블리는에 있습니다 "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\Extensions\Microsoft.VisualStudio.TestPlatform.Extensions.TrxLogger.dll". 좋아하는 .NET 디 컴파일러에서 확인하면 TrxLogger.GetTrxFileName. 현재 테스트 실행에 대한 몇 가지 기본 지식을 사용하여 형식의 엉망인 이름을 생성하며 구성 할 수있는 눈에 띄는 {username}_{workstation} {timestamp}.trx방식이 아닙니다.

내가 알 수있는 한 TRX 파일은 TestResults\달리 구성하지 않는 한 현재 작업 디렉토리 아래의 폴더에 생성됩니다 . 할 수있는 일은 다음과 같습니다.

  • 새 임시 폴더 만들기
  • 현재 디렉토리를 변경하십시오.
  • 테스트 실행기 실행
  • .trx자주 사용하는 재귀 파일 검색 방법을 사용하여 폴더에서 결과 파일을 스캔하면 완료됩니다.

적어도 그것이 우리 빌드 (MSBuild, sob)에서하는 일입니다.

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

즉, .trx현재 디렉토리 아래의 모든 파일을 수집하고 @(TestResult)추가 처리를 위해 항목 그룹에 넣습니다 .


분명히 * .trx 파일을 저장할 디렉토리를 지정할 수 있습니다 (파일 자체는 아님). 그러나 이것은 명령 줄이 아닌 .runsettings 파일을 통해 수행됩니다.

Bhuvaneshwari의 블로그 에서 발췌 :

결과의 기본 위치를 재정의해야하는 경우 사용자는 runsettings 파일을 사용하여이 값을 전달해야합니다.

예:

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

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

.runsettings 파일의 컨텍스트는 다음과 같습니다.

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

이것은 .net 코어를 테스트하는 데 효과적이었습니다.

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

어쩌면 새로운 것

업데이트 : 이것은 최신 테스트 플랫폼 및 vstest.console.exe를 사용하는 .net 프레임 워크 프로젝트에서도 작동합니다.


나도이 문제가 있었다. EXEC 작업을 통해 vstest.console을 실행하는 MSBuild 대상을 작성하여 적용 범위 결과를 포함하여 모든 출력을 처리하기로 결정했습니다.

기본적으로 vstest 출력을 캡처하고 정규식을 사용하여 출력의 * .trx 및 * .coverage 부분을 캡처했는데 이는 정말 쉬운 것으로 판명되었습니다. 또한 작업 공간을 멋지고 깨끗하게 유지하기 위해 TestResults 디렉토리를 제거합니다.

결국 * .trx 파일과 * .coverage 파일 (선택 사항)을 얻게됩니다.

스크립트는 약간 복잡해 보일 수 있지만 우리의 필요에 맞게 필요했습니다. 나는 그것을 조금 정리하려고 노력했다. 도움이 되었기를 바랍니다.

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

참조 URL : https://stackoverflow.com/questions/14483837/specifying-results-filename-for-vstest-console-exe

반응형