【发布时间】:2011-04-06 15:09:10
【问题描述】:
我一直在寻找一个权威的网络资源来帮助解决这个问题,但到目前为止还没有运气。那么,如何在 TFS 构建中运行单元测试呢?我对此有很多问题,为了方便起见,我在这篇文章中对它们进行了编号。抱歉这篇文章太长了。
Visual Studio Team System 2008 安装在我的构建机器上。
我有一个TFSBuild.proj 文件,已设置为<RunTest>true</RunTest>。为此,我添加了
<ItemGroup>
<TestContainer Include="'C:\MyBuild\Binaries\Debug\MyUnitTests.dll" />
</ItemGroup>
MyUnitTests 是解决方案中的单元测试项目。
解决方案构建正确,但运行单元测试步骤失败并出现错误:
(CoreTestConfiguration 目标) -> 无法加载测试容器 'C : \MyBuild\Binaries\Debug\MyUnitTests.dll' 或其之一 依赖关系。警告详情:
后面没有实际的警告细节。我注意到文件路径似乎包含不正确的空格 - C : \MyBuild\Binaries\Debug\ 在消息中。实际路径是C:\MyBuild\etc。
- 会不会是
OutDir以某种方式设置到了错误的路径?如何确定在我的构建机器上将OutDir目标设置为什么?
为了确保这不仅仅是错误设置的文件路径,我尝试在 TestContainer 中硬编码路径:
<ItemGroup>
<TestContainer Include="'C:\MyBuild\Binaries\Debug\MyUnitTests.dll" />
</ItemGroup>
错误消息是相同的。我尝试过的其他事情包括尝试在 vsmdi 文件上运行测试:
<MetaDataFile Include="$(SolutionRoot)\MySolution\MySolution.vsmdi">
</MetaDataFile>
这次出现了不同的错误信息:
(CoreTestConfiguration 目标)-> MSBUILD:警告 MSB6006: “MSTest.exe”以代码 1 退出。
- 这里发生了什么?
- 为什么我在单元测试的错误消息中看不到任何细节?是因为我没有安装 Studio 2008 Team System(Developer or Tester) 版吗?
我还想询问有关指定部署项以在构建中运行测试的问题。从 Visual Studio 运行时,我的单元测试在 localtestrun.testrunconfig 中指定了部署项。
当单元测试作为构建的一部分运行时,如何确保部署这些?
如何在构建运行时将 MSTest 的输出捕获到文件中?也就是说,MSTest 是否使用命令行开关
/resultsfile:myfile.trx运行?是否有任何推荐的网络资源来了解如何将单元测试集成到构建中?
更新(1 天后)
我已经设法让单元测试作为构建的一部分运行,但存在一些问题。这是我目前发现的
-
我无法使用应该只运行项目中所有单元测试的语法来运行它。相反,我必须创建一个测试列表并通过引用 vsmdi 文件来运行。这不起作用 - 没有运行单元测试:
这行得通:
<ItemGroup>
<MetaDataFile Include="$(SolutionRoot)\$(ReleaseName)\$(BranchName)\TheApplication\TheApplication.vsmdi">
<TestList>TestsForTheBuild</TestList>
<TestRunConfig>$(SolutionRoot)\$(ReleaseName)\$(BranchName)\TheApplication\LocalTestRun.testrunconfig</TestRunConfig>
</MetaDataFile>
</ItemGroup>
- 在 Visual Studio IDE 中运行测试和使用 MSTest 执行测试存在显着差异。问题在于项目引用 - MSTests 不会部署任何被单元测试项目视为“未使用的引用”的引用,而 Visual Studio IDE 会。
我正在测试的许多代码都使用 Unity 应用程序块动态实例化对象。为了实例化它们,定义它们的 dll 需要包含在项目中作为参考。因为对象仅在运行时通过反射实例化,所以编译器可以看到它们是未使用的引用。
当 Visual Studio 运行测试时,所有引用(无论是否未使用)都会被编译并复制到运行测试的 Out 目录。当 MSTest.exe 运行测试时,它不会部署任何“未使用”的引用。我花了几个小时才发现,当 MSTest 运行测试时,作为单元测试项目中项目引用的 dll 根本不在 Out 目录中。 .这是因为这个“未使用的引用”问题。
要解决这个问题:在 testrunconfig 文件中包含“未使用的引用”dll 作为部署项。这将迫使它们被复制。
-
我发现的下一个问题是,当在同一个构建中编译多个解决方案文件时,某些单元测试会失败。我发现了这个问题的两种“味道”。 一种。除非相关的解决方案是要编译的解决方案列表中的最后一个解决方案文件,否则单元测试根本没有运行。例如,如果这是我的“SolutionToBuild”ItemGroup,并且我有与 SolutionTwo 相关的单元测试,它们只是没有运行。
为了让它们开始运行,我必须将 SolutionTwo 移到列表的底部。
b.在构建中使用三个解决方案,我的单元测试运行,但许多测试失败。如果我从构建中删除其他两个解决方案,所有单元测试都会通过。尽管单元测试与其他两个解决方案无关。
我已经找到了上述问题 2、3 和 4 的答案。 2. 2. 您在构建的输出中看不到任何单元测试运行的细节。您只会看到运行是通过还是失败。 3. 要查看单个测试结果,您需要查看 MSTest 在构建运行时生成的 TestResults 目录和 .trx 文件。 4. testrunconfig 文件中标记为部署项的任何内容都将被部署:当我问到 MSTest 中未使用的引用问题时,我很困惑。
【问题讨论】:
-
在此处查看有关如何/为什么需要在 TeamBuild 框上安装 devenv 或 MSTest 运行器的详细信息
标签: testing msbuild mstest tfsbuild