【问题标题】:Running MSTest Unit tests As part of TeamBuild运行 MSTest 单元测试作为 TeamBuild 的一部分
【发布时间】: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

  1. 会不会是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 退出。

  1. 这里发生了什么?
  2. 为什么我在单元测试的错误消息中看不到任何细节?是因为我没有安装 Studio 2008 Team System(Developer or Tester) 版吗?

我还想询问有关指定部署项以在构建中运行测试的问题。从 Visual Studio 运行时,我的单元测试在 localtestrun.testrunconfig 中指定了部署项。

  1. 当单元测试作为构建的一部分运行时,如何确保部署这些?

  2. 如何在构建运行时将 MSTest 的输出捕获到文件中?也就是说,MSTest 是否使用命令行开关/resultsfile:myfile.trx 运行?

  3. 是否有任何推荐的网络资源来了解如何将单元测试集成到构建中?

更新(1 天后)

我已经设法让单元测试作为构建的一部分运行,但存在一些问题。这是我目前发现的

  1. 我无法使用应该只运行项目中所有单元测试的语法来运行它。相反,我必须创建一个测试列表并通过引用 vsmdi 文件来运行。这不起作用 - 没有运行单元测试:

这行得通:

<ItemGroup>
  <MetaDataFile Include="$(SolutionRoot)\$(ReleaseName)\$(BranchName)\TheApplication\TheApplication.vsmdi">
    <TestList>TestsForTheBuild</TestList>
    <TestRunConfig>$(SolutionRoot)\$(ReleaseName)\$(BranchName)\TheApplication\LocalTestRun.testrunconfig</TestRunConfig>
  </MetaDataFile>
</ItemGroup>
  1. 在 Visual Studio IDE 中运行测试和使用 MSTest 执行测试存在显着差异。问题在于项目引用 - MSTests 不会部署任何被单元测试项目视为“未使用的引用”的引用,而 Visual Studio IDE 会。

我正在测试的许多代码都使用 Unity 应用程序块动态实例化对象。为了实例化它们,定义它们的 dll 需要包含在项目中作为参考。因为对象仅在运行时通过反射实例化,所以编译器可以看到它们是未使用的引用。

当 Visual Studio 运行测试时,所有引用(无论是否未使用)都会被编译并复制到运行测试的 Out 目录。当 MSTest.exe 运行测试时,它不会部署任何“未使用”的引用。我花了几个小时才发现,当 MSTest 运行测试时,作为单元测试项目中项目引用的 dll 根本不在 Out 目录中。 .这是因为这个“未使用的引用”问题。

要解决这个问题:在 testrunco​​nfig 文件中包含“未使用的引用”dll 作为部署项。这将迫使它们被复制。

  1. 我发现的下一个问题是,当在同一个构建中编译多个解决方案文件时,某些单元测试会失败。我发现了这个问题的两种“味道”。 一种。除非相关的解决方案是要编译的解决方案列表中的最后一个解决方案文件,否则单元测试根本没有运行。例如,如果这是我的“SolutionToBuild”ItemGroup,并且我有与 SolutionTwo 相关的单元测试,它们只是没有运行。

为了让它们开始运行,我必须将 SolutionTwo 移到列表的底部。

b.在构建中使用三个解决方案,我的单元测试运行,但许多测试失败。如果我从构建中删除其他两个解决方案,所有单元测试都会通过。尽管单元测试与其他两个解决方案无关。

我已经找到了上述问题 2、3 和 4 的答案。 2. 2. 您在构建的输出中看不到任何单元测试运行的细节。您只会看到运行是通过还是失败。 3. 要查看单个测试结果,您需要查看 MSTest 在构建运行时生成的 TestResults 目录和 .trx 文件。 4. testrunco​​nfig 文件中标记为部署项的任何内容都将被部署:当我问到 MSTest 中未使用的引用问题时,我很困惑。

【问题讨论】:

  • 在此处查看有关如何/为什么需要在 TeamBuild 框上安装 devenv 或 MSTest 运行器的详细信息

标签: testing msbuild mstest tfsbuild


【解决方案1】:

我发现三步消除很有用:

  1. 测试是否在 Visual Studio 开发环境中运行?

  2. 测试是否在本地 msbuild 中运行?

  3. 测试是否在构建服务器上的 msbuild 中运行?

我使用下面的 build.cmd 脚本在本地计算机上运行 msbuild,环境与 TFS 构建服务器将使用的环境非常匹配。

build.cmd 脚本

@setlocal

SET MSBUILDVER=v4.0.30319 
SET MSBUILDEXE=%FrameworkDir%%MSBUILDVER%\MSBuild.exe
SET builduri=local

%MSBUILDEXE% BuildDefinitions\TFSBuild.proj %*

注意:此脚本必须从 Visual Studio 2010 命令提示符窗口运行:

开始 -> 所有程序 -> Microsoft Visual Studio 2010 -> Visual Studio 工具 -> Visual Studio 命令提示符 (2010)

一般来说,在 TFSBuild.proj 中设置 true 应该会导致单元测试在构建中列出的任何解决方案中自动运行,但听起来这对你不起作用?

如果您将命令行选项 /p:RunTest=true 从命令行界面传递给 msbuild,会发生什么?

如有必要,您应该能够通过 TFSBuild.rsp 文件将自定义 TFS 构建命令行选项添加到服务器构建,但对于 RunTest 来说应该不是必需的。

TFS 构建服务器应该自动创建一个 .trx 结果文件 -- 通过 Visual Studio 中的 Build Explorer 检查构建结果 -- View Test Results 将在 VS 中打开 .trx 文件。

不确定其他特定问题的解决方案,但我会尝试在本地命令窗口中运行构建,以便更清楚地了解构建期间发生的情况。 错误消息将显示为红色文本,警告消息显示为黄色文本,许多其他中间构建步骤信息显示为灰色文本。

有很多关于 TFS 构建主题的好博文—— Aaron Hallberg 的博客 (blogs.msdn.com/b/aaronhallberg) 将是一个不错的起点。此外,MSDN 有很多关于 TFS / MS Build 的好信息 - 例如:Running Builds in Team Foundation Build

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-14
    • 2011-12-25
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2011-04-02
    • 2011-03-11
    • 1970-01-01
    相关资源
    最近更新 更多