您是否知道任何可以并行运行测试以利用当今计算机中的多个内核的xUnit框架?
如果没有(或很少)这样做,也许是有原因的……测试通常这么快,以至于人们根本不认为需要将它们并行化吗?
是否有更深层次的东西可以排除(至少部分)测试分布在多个线程上?
您是否知道任何可以并行运行测试以利用当今计算机中的多个内核的xUnit框架?
如果没有(或很少)这样做,也许是有原因的……测试通常这么快,以至于人们根本不认为需要将它们并行化吗?
是否有更深层次的东西可以排除(至少部分)测试分布在多个线程上?
Answers:
NUnit 2.5捆绑的pNUnit允许并行运行测试。
此版本包括pNUnit,这是用于分布式并行测试的扩展NUnit运行器。pNUnit程序是由Codice Software开发的,用于测试Plastic SCM,并已为NUnit做出了贡献。有关使用pNUnit的更多信息,请参见pNUnit网站。
JUnit端具有parallel-junit以及amino。
要回答您问题的第二部分:是否有更深层次的内容可以排除(至少其中一些)测试分布在多个线程上?
许多代码仅在单线程运行时有效。在假定程序将以单线程运行的情况下编写程序时,意外地产生资源争用和死锁是微不足道的。这样做很好,因为大多数程序实际上都运行单线程。并行性是通过同时运行多个副本或不同的程序获得的(Web脚本是一个常见的示例-许多用户访问单个页面意味着该页面同时运行的许多脚本副本)。
想象一个简单的“日志到文件”类。创建实例时,它将打开要写入的文件,释放实例时,它将关闭文件。因此,第一个测试将创建一个实例并开始运行测试。第二个测试在第二个线程中执行相同的操作。并失败,因为第二个实例无法获得对该文件的写访问权。但是,如果一次运行一次,所有测试都会通过。
所有这些都可以编码,并且可以调整简单的示例以使其工作。但是对于原始程序来说,这样做可能是不必要的。对于许多人来说,仅编写线程安全代码以使您可以运行单元测试是不合理的。因此,多线程单元测试应该仍然是可选的。
如果测试需要设置和查询数据库,则并行运行的测试会相互干扰,除非并行运行的每个测试都没有单独的数据库。
尽管JUnit本身可能不允许这样做(尽管我对它的最新版本不是很熟悉),但Maven带有Surefire插件确实可以选择并行运行测试。我还没有尝试过。
我没有强烈要求研究这个选项,因为我们只有一千多个测试,而且它们运行得足够快。但是,我确实知道某些测试夹具之间存在隐式依赖关系(当过去某些测试意外中断时,我们已经发现了这样的依赖关系),因此存在风险,即并行化测试会使它们中的一些无法预测地失败。您可能会说这很好,因为它可以使问题明确。但是,我们正在处理遗留系统,并且还有许多重要的问题要处理-时间是稀缺资源(与往常一样)。
多线程编码并非易事。即使由知道自己在做什么的人完成,也会出现与时间有关的错误。它们很难修复。处理了多次踩踏可能产生的数千个案例类型的错误之后,我宁愿不要在我的测试框架中使用它们。我得到的第一个修复程序似乎可以正常工作,但是在进一步测试中发现,它刚刚变成了成千上万个错误。
随着多处理器PC的出现,在多处理器上执行多线程的技术越来越好。但是,广泛使用它们需要时间。
一些测试套件具有测试之间的依赖关系,当在单个流中运行测试时,不需要明确声明这些依赖关系。但是,在多蒸汽机上,需要明确说明它们。(在哪里应该存在这种依赖关系是另一个问题。)
从另一个角度来看,有些事情不需要并行运行。如果进程运行得足够快,则最好将精力集中在实现多线程以外的事情上。
MBUnit只需指定一些程序集级属性即可并行运行测试。
[assembly: DegreeOfParallelism(6)]
[assembly: Parallelizable(TestScope.All)]
一段时间以来,我一直在使用该项目并行运行硒测试。不幸的是,该项目还不是很活跃。
xUnit 2.0还应该支持并行单元测试,但是我还没有尝试过。