【问题标题】:How do I run MSpec test assemblies in parallel?如何并行运行 MSpec 测试程序集?
【发布时间】:2014-07-07 13:38:04
【问题描述】:
我们有以下设置:
- 团队城市 v8.1.2
- .NET 2013 解决方案,包含多个不同的 C# 项目(ASP.NET MVC、
库、测试项目等)
- 我们 95% 的测试都是 MSpec,但我们也有一些 NUnit 测试。
- 我们有 14 个测试项目,并且还在不断增长中......
目前,MSpec 测试大约需要 9 分钟,NUnit 大约需要 1 分钟。我们希望开始并行化,因为我们预计测试的数量会快速增长。最好的解决方案是什么,前提是:
- MSpec 似乎没有任何并行运行器。
- 测试应按程序集并行化,这些测试在同一程序集中按顺序运行。
- 并行化不应影响我们显示构建结果的方式。我们仍然希望所有内容都按现在的样子聚合。
- 不应与开发人员机器中的本地执行有任何摩擦。无论设置是什么,都要求不要使在本地运行我们的测试变得更加复杂。如果解决方案(无论是什么)允许我们在本地并行运行测试,那就太好了。
- 我们更喜欢利用每个构建代理的并行功能进行扩展,而不是在多个代理上运行,因为我们按代理付费。
【问题讨论】:
标签:
c#
parallel-processing
teamcity
mspec
【解决方案1】:
要与 TeamCity 并行运行 MSpec 测试,您可以使用 mspec-teamcity-prunner.exe,它是标准 MSpec 运行器的直接替代品。
在 TeamCity 中创建/编辑标准 MSpec Build Step,然后将 mspec.exe 的路径替换为 mspec-teamcity-prunner.exe
默认情况下,该工具最多可以并行运行 2 个测试程序集,但这可以通过在 Additional command line parameters: 字段中使用 --threads N)(例如,--threads 4 用于 4 个线程)来控制。
【解决方案2】:
我不确定您是如何配置构建的测试部分的:MSBuild exec 任务、Albacore mspec 命令或内置 TeamCity MSpec runner。无论如何,它们都会在某个时候运行 mspec 命令行。 mspec 的命令行用法是将所有测试程序集传递给测试运行器。
> mspec.exe [options] <assemblies>
一般的解决方案是构建多个 mspec 运行,每个运行配置为运行单个程序集。
> mspec.exe [options] <assmebly1>
> mspec.exe [options] <assembly2>
> mspec.exe [options] <assembly3>
然后您将并行运行这些任务中的每一个。我认为 TeamCity 没有并行步骤的概念。 MSBuild 似乎也没有通用的parallel tasks,但你可以用an extension 伪造它。
其他构建系统确实提供并行任务,例如 Rake 的 multitask。如果您配置了每个单独的任务,您可以将父任务标记为并行运行所有相关任务。
multitask :test => [:test_assmebly1, :test_assembly2, :test_assembly3]