web-dev-qa-db-ja.com

vstest.console.exeの結果ファイル名の指定

愚かな質問かもしれませんが、VSTEST.Console.exe実行の出力ファイル名を指定する方法を知っている人はいますか?私のコマンドラインは次のとおりです。

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

実行が終了すると、コンソールに次のメッセージが表示されます。

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

。runsettingsファイルを使用して出力場所を指定しようとしましたが、それは出力ディレクトリではなく出力ファイルを制御するようです。それを制御するように見える他のものを見つけていない。

TRXファイルを解析し、そこからレポートを生成します(これは既に機能していますが、TRXファイルの出力パスを指定できない場合、スクリプトのどこから取得するかわかりません!)

私はここで何かを逃す必要があります...

51
syazdani

編集:@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)アイテムグループに詰めてさらに処理します。

50
Stefan Dragnev

これは.netコアをテストするために私のために働いています..netフレームワークで試していません:

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

たぶん新しいもの

更新:これは、最新のテストプラットフォームとvstest.console.exeを使用する.netフレームワークプロジェクトでも機能します。

16
Ana Franco

どうやら、*。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>
16
Kosau

私もこの問題を抱えていました。 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>
10
calexandre