我通过手动调用 mstest.exe 从 msbuild/tfsbuild 手动运行测试,但是当我期待 0 时,它意外失败并出现错误 MSB3073 和 ExitCode 1。
我有这个目标,它在 $(OutDir) 文件夹中搜索后缀为 *UnitTests.DLL 的所有 DLL。它构建了一个命令行语句,然后执行:
<Target Name="RunUnitTests">
<CreateItem Include="$(OutDir)\*.UnitTests.dll"
AdditionalMetadata="TestContainerPrefix=/testcontainer:">
<Output TaskParameter="Include"
ItemName="UnitTestAssemblies" />
</CreateItem>
<Exec Timeout="120000"
Command=""$(VS110COMNTOOLS)..\IDE\mstest.exe" @(UnitTestAssemblies->'%(TestContainerPrefix)"%(FullPath)"',' ') /testsettings:"$(OutDir)..\..\Sources\mysettings.testsettings"" >
<Output TaskParameter="ExitCode" PropertyName="ExitCode"/>
</Exec>
<Error Condition=" '$(ExitCode)' != '0' And '$(ExitCode)' != '2'" Text="An error [$(ExitCode)] occurred running unit tests." />
<OnError ExecuteTargets="MarkBuildStepAsFailed" />
</Target>
我在上面添加了一个 Timeout 属性,因为一些谷歌搜索建议了这一点,但它没有任何区别。
这在构建日志文件中等同于如下(包括引号)(我更改了文件夹名称,但在相关的地方留下了空格,但它们看起来不太长):
"C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\..\IDE\mstest.exe" /testcontainer:"C:\b\someprojectfolder\anotherfolder\Binaries\..\..\debug\some.unittests.dll" /testsettings:"C:\b\someprojectfolder\anotherfolder\Sources\..\..\mysettings.testsettings"
测试确实作为构建过程的一部分在构建服务器上运行(即调用上面的目标),因为我可以看到在磁盘上创建了测试结果文件夹。所有单元测试都按预期通过。我也可以在构建日志中看到 MSTest.exe 控制台输出(例如,开始执行、测试和结果列表、结果文件已列出等)
此外,我可以将 RDC 作为构建服务帐户安装到构建服务器上,并使用 CMD 手动运行上面的命令行,它可以工作。(测试结果(*.trx)和文件夹在那里)。
当我像我自己一样在本地开发人员机器上使用 CMD 手动调用上面的命令行时,它们也可以工作。它创建测试结果文件和文件夹。
仅供参考我们在我的本地机器上使用 Visual Studio 2012 Ultimate,并且也安装在构建服务器上。
仅供参考,我们正在使用带有升级过程定义的 TFS 2012
我有一种感觉,这与引号和/或撇号的“解析”/转义有关,或者可能是在路径中使用 ..\ ?
我检查了构建服务器上的事件日志,它没有显示错误/信息。我可以检查其他任何日志吗?或我可以定义“查看”实际错误代码的属性?
注意:我知道我可以使用<RunTest>
样式 msbuild/tfs 构建语法,但我在构建过程中更方便的时间手动触发这些测试