jot*_*ken 5 c++ testing asynchronous googletest googlemock
给定一个包含数千个测试的大型项目,其中一些需要几分钟才能完成。按顺序执行时,整个测试集需要一个多小时才能完成。通过并行执行测试可以减少测试时间。
据我所知,没有办法直接从 googletest/mock 做到这一点,就像一个--async选项。还是我错了?
一种解决方案是确定可以并行运行的测试并编写一个脚本,在单独的作业中启动每个测试,即
./test --gtest_filter=TestSet.test1 &
./test --gtest_filter=TestSet.test2 &
...
Run Code Online (Sandbox Code Playgroud)
但这需要额外的维护工作,并在测试代码与其执行之间引入另一个“层”。我想要一个更方便的解决方案。例如,可以给 TEST 和 TEST_F 宏添加后缀并引入 TEST_ASYNC、TEST_F_ASYNC。然后,使用 TEST_ASYNC 定义的测试将由独立线程执行,同时开始。
如何做到这一点?或者还有其他解决方案吗?
迟到的回应,但我会把它放在这里,供任何寻找类似答案的人使用。在 WebRTC 上工作时,我发现了一个类似的需求来加速我们的测试执行。依次执行我们所有的测试需要 20 多分钟,其中很多测试至少要花一些时间等待(所以他们甚至没有充分利用内核)。
即使对于“适当的单元测试”,我认为这仍然是相关的,因为执行单线程测试需要 20 秒和约 1 秒之间存在差异(如果您的工作站是大规模并行的,这种加速并不少见)。
为了为我们解决这个问题,我开发了一个脚本来并行执行测试。这足够稳定,可以在我们的持续集成上运行,并在此处发布:https : //github.com/google/gtest-parallel/
这个 python 脚本基本上采用--gtest_filter=Foo(您可以指定)一个或多个指定的 gtest 二进制文件,将它们拆分到多个工作程序上并并行运行单独的测试。只要测试是独立的(不要写入共享文件等),这就可以正常工作。对于不能正常工作的测试,我们将它们放在一个webrtc_nonparallel_tests二进制文件中并单独运行它们,但绝大多数已经很好了,我们修复了其中的几个,因为我们想要加速。
我建议你解决错误的问题。您希望单元测试快速运行,事实上,如果测试需要几分钟才能运行,那么它就不是单元测试。
我建议您将测试分为适当的单元测试和集成/回归或缓慢运行的测试。然后,您可以在开发时运行单元测试,并在推送/提交之前运行运行时间较长的测试。
您甚至可以自己同时运行两组(或多组)测试。
文档本身建议使用过滤器来解决这个问题。
根据否决票和文档中提到的新玩具进行编辑。
自从我给出这个答案以来,文档已经更新,现在提到了一个并行运行程序,它“通过列出每个二进制文件的测试来工作,然后在不同进程中的工作人员上执行它们”,这将解决问题。当我第一次写答案时,这个问题并不存在。