c++ - Googletest:如何异步运行测试?

标签 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 定义的测试将由独立线程同时开始执行。

如何实现?或者有其他解决方案吗?

最佳答案

回复晚了,但我会把它放在这里,供任何搜索类似答案的人使用。在 WebRTC 上工作时,我发现有类似的需要来加快我们的测试执行速度。按顺序执行我们所有的测试花费了 20 多分钟,其中一些测试至少花费了一些时间等待(因此它们甚至没有完全利用一个内核)。

即使对于“适当的单元测试”,我认为这仍然是相关的,因为执行单线程测试需要 20 秒和大约 1 秒是有区别的(如果你的工作站是大规模并行的,这种加速不是不常见)。

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

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

关于c++ - Googletest:如何异步运行测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24528821/

相关文章:

c++ - 如何编译静态 OpenCV4 库?

c++ - std::shared_ptr 的 PassByVal、PassByRef 和 PassByConstRef 的比较(什么可以(不能)改变)

C++:检索映射值并插入到第二个映射中

ruby - 如何使用 capybara 单击项目列表中的一项

spring-mvc - 由于 TestRestTemplate 和 apache SSL,Spring Boot Integration 无法启动

javascript - 是否可以在 jQuery 中进行半异步 ajax 调用?

javascript - Promise Chaining 和 .then/.catch 语句

c# - 对 Await/Async 和 Task 的说明

c++ - std::async int 函数可以在任务完成之前退出吗?

vb.net - 如何在 SMTPClient.Send [VB.NET] 之前测试 SMTP 连接