如何并行运行MSpec测试程序集

本文关键字:MSpec 测试 测试程序 程序集 运行 何并行 并行 | 更新日期: 2023-09-27 18:11:41

我们有以下设置:

  • Team City v8.1.2
  • 。. NET 2013解决方案与几个不同的c#项目(ASP。净MVC,库、测试项目等)
  • 我们95%的测试是MSpec,但我们也有一些NUnit测试。
  • 我们有14个测试项目,并且还在不断增长…

目前,MSpec测试阶段大约需要9分钟,NUnit测试阶段需要1分钟。我们希望开始并行化,因为我们预计测试的数量会快速增长。最好的解决方案是什么,如果:

  • MSpec似乎没有任何并行运行器。
  • 每个程序集应并行化测试,这些测试在同一程序集中顺序运行。
  • 并行化不应该影响我们如何显示构建结果。我们仍然希望所有的东西都像现在一样汇总。
  • 在开发人员的机器上本地执行不应该有任何摩擦。无论设置是什么,都要求不会使本地运行测试变得更加复杂。如果解决方案,无论它是什么,允许我们在本地并行运行测试,那将是伟大的。
  • 我们更喜欢利用每个构建代理的并行能力进行扩展,而不是在多个代理上运行,因为我们为每个代理付费。

如何并行运行MSpec测试程序集

要与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个线程)来控制。

我不确定你如何配置你的构建的测试部分:一个MSBuild exec任务,一个Albacore mspec命令,或内置的TeamCity MSpec运行器。不管怎样,它们都在某个时候运行mspec命令行。mspec的命令行用法是将所有测试程序集传递给测试运行器。

> mspec.exe [options] <assemblies>

一般的解决方案是构造多个mspec运行,每个配置为运行单个程序集。

> mspec.exe [options] <assmebly1>
> mspec.exe [options] <assembly2>
> mspec.exe [options] <assembly3>

然后并行运行这些任务。我不认为TeamCity有平行步骤的概念。MSBuild似乎也没有一般的并行任务,但你可以通过扩展来实现。

其他构建系统确实提供并行任务,比如Rake的multitask。如果您配置了每个单独的任务,则可以将父任务标记为并行运行所有依赖的任务。
multitask :test => [:test_assmebly1, :test_assembly2, :test_assembly3]