繁体   English   中英

Googletest:如何异步运行测试?

[英]Googletest: How to run tests asynchronously?

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

据我所知,没有办法直接从googletest / mock进行此操作,例如--async选项。 还是我错了?

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

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

但这将需要额外的维护工作,并在测试代码与其执行之间引入另一个“层”。 我想要一个更方便的解决方案。 例如,可以为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二进制文件中,然后分别运行它们,但是绝大多数已经很好,并且我们修复了其中的几个,因为我们希望加快速度。

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

我建议您将测试分为适当的单元测试和集成/回归或运行缓慢的测试。 然后,您可以在开发过程中运行单元测试,而在推送/提交之前只运行运行时间更长的单元测试。

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

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


请根据票证和文档中提到的新玩具进行编辑。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM