Googletest:如何异步运行测试?

5

在一个大型项目中有成千上万个测试,其中一些测试需要多分钟才能完成。当按顺序执行时,整个测试集需要超过一个小时才能完成。通过并行执行测试可以缩短测试时间。

据我所知,目前没有直接从googletest/mock中执行并行测试的方法,例如--async选项。或者我错了吗?

一种解决方案是确定可以并行运行的测试,并编写一个脚本,在单独的作业中启动每个测试,即:

./test --gtest_filter=TestSet.test1 &
./test --gtest_filter=TestSet.test2 &
...

但是这将需要额外的维护工作,并在测试代码和执行之间引入另一个“层”。我希望有一种更方便的解决方案。例如,可以给TEST和TEST_F宏添加后缀并引入TEST_ASYNC、TEST_F_ASYNC。使用TEST_ASYNC定义的测试将由独立线程执行,同时启动。
如何实现这一点?还是有其他解决方案吗?
2个回答

11
迟来的回复,但我会把答案放在这里,供寻找类似答案的人参考。在开发WebRTC时,我发现需要加快测试执行速度。按顺序执行所有测试需要超过20分钟,其中一些测试至少花费了一些时间等待(因此它们甚至不能充分利用一个核心)。
即使是“适当的单元测试”,我认为这仍然相关,因为你的单线程测试执行需要20秒或者约1秒的时间执行(如果您的工作站是大规模并行的,则这种加速不常见)。
为了解决这个问题,我开发了一个脚本,可以在并行环境中执行测试。这足够稳定,可以在我们的持续集成上运行,并在这里发布:https://github.com/google/gtest-parallel/ 这个Python脚本基本上接受一个或多个指定gtest二进制文件的--gtest_filter=Foo(您可以指定),将它们分割成几个工作线程,并并行运行各个测试。只要测试是独立的(不写共享文件等),这就很好用。对于不能很好地工作的测试,我们将它们放入webrtc_nonparallel_tests二进制文件中,单独运行它们,但绝大多数测试已经可以很好地工作了,并且我们修复了其中的一些问题,因为我们想要加速。

3
我建议您正在解决错误的问题。您希望单元测试能够快速运行,实际上,如果一个测试需要几分钟才能运行,那么它就不是一个单元测试。

我建议将您的测试拆分为适当的单元测试和集成/回归或运行缓慢的测试。然后在开发时运行单元测试,并在推送/提交之前运行较长时间的测试。

您甚至可以同时运行两个(或多个)测试集。

文档本身建议使用过滤器来解决此问题。


自从我回答这个问题后,文档已经更新,并提到了并行运行器,它“通过列出每个二进制文件的测试,然后在独立进程中在工作器上执行它们”来解决问题。当我第一次写这个答案时,这个功能还不存在。

我同意尽可能快地运行单元测试。我所谈论的测试是集成测试(我只是替换了具有误导性的标签)。为了保持简单,与单元测试使用相同的框架。 - jotrocken
3
我认为这是一种教条式的回答。即使他将他的测试从单元测试重新分类为集成测试,问题仍然是相同的:如何异步运行它们。而且说如果在当前硬件上测试某些耗时的东西,那么单元测试就不再是单元测试似乎在很多情况下都是不正确的。 - Kevin
1
@Kevin 当我写这个的时候,这是标准/教条式的做法。我注意到文档中提到了一个新的(非 Google)脚本,可以在不同的线程上运行测试,所以我已经更新了我的答案。 - doctorlove

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