指定vstest.console.exe的结果文件名

可能是一个愚蠢的问题,但有谁知道如何指定VSTEST.Console.exe运行的输出文件名 ? 我的命令行如下:

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

在运行结束时,在控制台中出现以下内容:

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

我尝试使用.runsettings文件来指定输出位置,但似乎只能控制输出目录,而不是输出文件。 还没有发现任何似乎控制它的东西。

我想parsingTRX文件并生成一个报告(这已经可行了,但是如果我不能指定TRX文件的输出path,我不知道从脚本中select它到哪里)

我必须在这里失去一些东西…

不,你不会错过任何东西。 TRXlogging器不支持任何参数(与TFS发布者logging器不同)。

logging程序集位于"C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\Extensions\Microsoft.VisualStudio.TestPlatform.Extensions.TrxLogger.dll" 。 如果你在你最喜欢的.NET反编译器中检查它,你会看到方法TrxLogger.GetTrxFileName 。 它使用有关当前testing运行的一些基本知识来生成{username}_{workstation} {timestamp}.trx格式的名称,并且没有可configuration的明显方式。

据我所知,TRX文件是在当前工作目录下的TestResults\文件夹下创build的,除非另外configuration。 你可以做的是:

  • 创build一个新的临时文件夹
  • 改变当前目录
  • 运行testing运行器
  • 使用您喜欢的recursion文件search方法扫描结果.trx文件的文件夹,就完成了

至less这就是我在做的(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> 

我也有这个问题。 我决定编写一个MSBuild目标,通过EXEC任务执行vstest.console,处理所有的输出,包括覆盖结果。

基本上,我捕获了vstest的输出,并使用正则expression式来捕获输出的* .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> 

这已经对我进行testing.net核心我还没有尝试过与.net框架:

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

也许它是一个新的东西