0

我通过手动调用 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="&quot;$(VS110COMNTOOLS)..\IDE\mstest.exe&quot; @(UnitTestAssemblies->'%(TestContainerPrefix)&quot;%(FullPath)&quot;',' ') /testsettings:&quot;$(OutDir)..\..\Sources\mysettings.testsettings&quot;" >
          <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 构建语法,但我在构建过程中更方便的时间手动触发这些测试

4

1 回答 1

2

这与路径中的引号或撇号无关。我的 .testsettings 文件连接到远程测试控制器(在另一台运行 Windows Server 2008 R2 的服务器上)。我正在收集所有数据和诊断信息(录像机等、网络仿真、事件日志、系统诊断等)

当我检查测试控制器/代理服务器上的事件日志时,它充满了错误,说 MSTest 必须以管理权限运行。这就是我现在正在调查的。

于 2012-12-06T10:50:07.507 回答