有没有一种方法可以并行运行C ++单元测试?

12

我长时间使用Boost Test,但是测试运行速度太慢了。由于每个测试都高度并行,我希望能够在所有核心上并发运行它们。

使用Boost Test库有没有办法做到这一点?我没有找到任何解决方案。我尝试查找如何编写自定义测试运行器,但是在这一点上找不到太多文档:(

如果没有,有人知道一个好的C++测试框架来实现这个目标吗?我想Google Test会完成这项工作,但显然也不能并行运行测试。即使该框架比其他更知名的框架具有较少的特性,也没有问题,我只需要简单的断言和多线程执行。

谢谢

4个回答

20
您可以使用CTest来完成此操作。
CTest是CMake(构建系统生成器)的测试驱动程序,因此您需要使用CMake使用现有文件和测试创建构建系统,并在此过程中,您将能够使用CTest运行测试可执行文件。
我个人没有在CMake中使用Boost.Test(我们使用GoogleTest),但是这个问题更详细地介绍了该过程。
一旦将测试添加到您的CMakeLists文件中,您就可以利用CTest的-j参数来指定要并行运行多少个作业。

太棒了 :) 即使有点凌乱,我不得不对cmake文件进行一些更改,但它确实起作用了!非常感谢。 - Baptiste Wicht

11
谷歌在gtest文档中提到的是测试分片 - 只需使用命令行参数和环境变量即可让多台机器运行测试。您可以在单个机器上将它们分别运行在不同的进程中,同时设置GTEST_SHARD_INDEX和GTEST_TOTAL_SHARDS环境变量。
原则上,没有任何东西会阻止您使用不同的过滤参数(Boost.testgtest)启动测试可执行文件的多个进程。
更新2014年:https://github.com/google/gtest-parallel

3
将套件拆分为多个小型集合,每个集合都使用单独的二进制文件启动,并在您的构建系统中添加.PHONY目标测试,该目标取决于所有这些集合。运行命令为(假设您正在使用make)make -jN test。

这是一个好主意,但问题在于我必须创建与测试数量相同的可执行测试,我更喜欢自动化一些的东西。 - Baptiste Wicht
1
@BaptisteWicht - 你可以使用单个启动器作为命令行参数来获取测试名称(就像Boost.Test一样)。 - bobah

1

鉴于未解决问题列表上的第三个要点是线程安全性,我认为没有办法告诉Boost测试在多个线程中运行测试。

相反,您需要找到一个外部测试运行器,支持并行运行测试(我希望这可以通过fork启动新进程来实现)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接