Googletest:如何异步运行测试?

时间:2014-07-02 10:30:05

标签: c++ testing asynchronous googletest googlemock

鉴于一个包含数千个测试的大型项目,其中一些需要几分钟才能完成。按顺序执行时,整套测试需要一个多小时才能完成。通过并行执行测试可以减少测试时间。

据我所知,没有办法直接从googletest / mock那样做,就像--async选项一样。或者我错了吗?

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

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

但这需要额外的维护工作,并在测试代码和执行之间引入另一个“层”。我想要一个更方便的解决方案。例如,可以为TEST和TEST_F宏添加后缀,并引入TEST_ASYNC,TEST_F_ASYNC。然后,使用TEST_ASYNC定义的测试将由独立线程执行,同时开始。

如何实现这一目标?还是有另一种解决方案吗?

2 个答案:

答案 0 :(得分:4)

迟到的回复,但我会把它放在那里寻找类似答案的人。在WebRTC上工作我发现了类似的加速测试执行的需求。按顺序执行我们所有的测试花了超过20分钟,其中一大堆花了至少一些时间等待(所以他们甚至没有充分利用核心)。

即使对于“正确的单元测试”,我认为这仍然是相关的,因为你的单线程测试需要20秒和~1秒才能执行(如果你的工作站是大规模并行的,那么这个加速不是不常见)。

为了解决这个问题,我开发了一个测试并行执行测试的脚本。这足够稳定,可以在我们的持续集成上运行,并在此处发布:https://github.com/google/gtest-parallel/

这个python脚本基本上需要--gtest_filter=Foo(你可以指定)一个或多个指定的gtest二进制文件,将它们分成几个worker并并行运行各个测试。只要测试是独立的(不写入共享文件等),这样就可以正常工作。对于不能正常工作的测试,我们将它们放在webrtc_nonparallel_tests二进制文件中并单独运行,但绝大多数已经很好,我们修复了其中几个,因为我们想要加速。

答案 1 :(得分:0)

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

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

您甚至可以同时自己运行两组(或多组)测试。

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


根据一个downvote进行编辑,并在文档中提到一个新玩具。

由于我给出了这个答案,文档已经更新,现在提到parallel runner,“通过列出每个二进制文件的测试,然后在不同进程中的工作程序上执行它们”,这将解决问题。 当我第一次写出答案时,这不存在。