Określanie nazwy pliku wyników dla vstest.konsola.exe

Może to głupie pytanie, ale czy ktoś wie, jak określić wyjściową nazwę pliku VSTEST.Konsola.exe run? Mój wiersz poleceń wygląda następująco:

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

Pod koniec biegu w konsoli pojawia się:

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

Próbowałem użyć .plik runsettings określa lokalizację wyjściową, ale wydaje się, że kontroluje tylko katalog wyjściowy, ale nie plik wyjściowy. Nie znalazłem niczego innego, co mogłoby go kontrolować.

Chcę przeanalizuj plik TRX i wygeneruj z niego raport (to już działa, ale jeśli nie mogę określić ścieżki wyjściowej pliku TRX, Nie będę wiedział, skąd go pobrać w skryptach!)

Muszę coś przeoczyć...
Author: David Gardiner, 2013-01-23

4 answers

EDIT: Zobacz odpowiedź @AnaFranco-najwyraźniej od VS2017 nazwę pliku można skonfigurować tak:

vstest.console.exe [assembly] /logger:trx;LogFileName=[filename].trx
Zostawiam starą odpowiedź dla potomności i wersji sprzed 2017 roku.
Nie, niczego Ci nie brakuje. Trx logger nie obsługuje żadnych parametrów (w przeciwieństwie do TFS publisher logger).

Zespół loggera znajduje się w "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\Extensions\Microsoft.VisualStudio.TestPlatform.Extensions.TrxLogger.dll". Jeśli sprawdzisz to w swoim ulubionym dekompilatorze. NET, zobaczysz metodę TrxLogger.GetTrxFileName. Wykorzystuje podstawową wiedzę na temat aktualny test uruchamia się, aby wytworzyć zniekształconą nazwę formularza {username}_{workstation} {timestamp}.trx i nie jest w żaden sposób konfigurowalny.

Z tego co wiem, plik TRX jest tworzony w folderze TestResults\ pod bieżącym katalogiem roboczym, chyba że skonfigurowano inaczej. Co można zrobić to:

  • Utwórz nowy folder tymczasowy
  • Zmień na niego bieżący katalog
  • Uruchom biegacza testowego
  • przeskanuj folder w poszukiwaniu pliku wynikowego .trx używając ulubionej metody rekurencyjnego wyszukiwania plików and you ' re done

Przynajmniej to robię w naszym build (MSBuild, sob):

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

Tzn. zbieramy wszystkie pliki .trx w bieżącym katalogu i umieszczamy je w grupie @(TestResult) item do dalszego przetwarzania.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-15 08:54:13

Najwyraźniej możesz określić katalog, w którym chcesz umieścić *.pliku trx (Nie samego pliku). Odbywa się to jednak za pośrednictwem .plik runsettings zamiast z linii poleceń.

Fragment z Bhuvaneshwari ' s blog :

Jeśli domyślna lokalizacja wyników ma być przesłonięta, użytkownik musi przekaż tę wartość za pomocą pliku runsettings.

Przykład:

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

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

Gdzie kontekst .plik runsettings byłby czymś w rodzaju poniżej:

<?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/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-05 12:49:56

To działa dla mnie do testowania. NET core nie próbowałem go z. NET framework:

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

Maybe its a new thing

Aktualizacja: to działa również dla projektów. NET framework przy użyciu najnowszej platformy testowej i vstest.konsola.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/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-20 19:21:20

Ja też miałem ten problem. Postanowiłem napisać cel MSBuild, który wykonuje vstest.konsola poprzez zadanie EXEC, obsługująca wszystkie jego wyjścia, w tym wyniki pokrycia.

Zasadniczo przechwyciłem wyjście vstest i użyłem wyrażenia regularnego do przechwycenia *.trx i *.pokrycie części wyjściowej, która okazała się naprawdę łatwa. Dodatkowo usuwa katalog TestResults, aby utrzymać przestrzeń roboczą ładną i czystą.

W końcu otrzymasz *.plik trx i *.plik pokrycia (opcjonalnie).

Skrypt może wydawać się nieco skomplikowany, ale był konieczny, aby dopasować się do naszych potrzeb. Próbowałem trochę posprzątać. Mam nadzieję, że to pomoże.

<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/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-13 00:56:33