【问题标题】:Is there a way to run C++ Unit Tests tests in parallel?有没有办法并行运行 C++ 单元测试测试?
【发布时间】:2012-09-06 16:59:54
【问题描述】:

我使用 Boost Test 已经很长时间了,但最终我的测试运行速度太慢了。由于每个测试都是高度并行的,我希望它们与我的所有内核同时运行。

有没有办法使用 Boost 测试库来做到这一点?我没有找到任何解决方案。我试图查看如何编写自定义测试运行器,但我没有太多关于这一点的文档:(

如果没有办法,有人知道一个好的 C++ 测试框架来实现这个目标吗?我在想 Google Test 可以完成这项工作,但显然它也不能并行运行测试。即使该框架的功能比其他更知名的框架少,也不是问题,我只需要简单的断言和多线程执行即可。

谢谢

【问题讨论】:

    标签: c++ multithreading unit-testing concurrency boost-test


    【解决方案1】:

    您可以为此使用CTest

    CTest 是 CMake(构建系统生成器)附带的测试驱动程序,因此您需要使用 CMake 使用现有文件和测试创建构建系统,这样您就可以使用 CTest运行测试可执行文件。

    我没有亲自将 Boost.Test 与 CMake 一起使用(我们使用 GoogleTest),但this question 更详细地介绍了该过程。

    在 CMakeLists 文件中添加测试后,您可以使用 CTest's -j argument 指定并行运行的作业数。

    【讨论】:

    • 太棒了 :) 即使它有点乱,我不得不对 cmake 文件进行一些更改,它仍然有效!非常感谢
    【解决方案2】:

    谷歌在 gtest 文档中暗示的是 test sharding - 让多台机器只使用命令行参数和环境变量来运行测试。您可以在单独的进程中在一台机器上运行它们,并在其中适当地设置 GTEST_SHARD_INDEX 和 GTEST_TOTAL_SHARDS 环境变量。

    原则上,没有什么可以阻止您使用不同的过滤参数(Boost.testgtest)启动测试可执行文件的多个进程

    2014 年更新:https://github.com/google/gtest-parallel

    【讨论】:

      【解决方案3】:

      将套件拆分为由多个较小的集合组成,每个集合都使用单独的二进制文件启动,并根据所有这些将 .PHONY 目标 test 添加到您的构建系统中。运行方式(假设您使用 make)make -jN test

      【讨论】:

      • 这是个好主意,但这样做的问题是我必须创建尽可能多的可执行测试,我更喜欢自动化。
      • @BaptisteWicht - 你可以让一个启动器将测试名称作为命令行参数(就像 Boost.Test 一样)
      【解决方案4】:

      鉴于open issues list 上的第三个要点目前是线程安全,我认为没有办法告诉 Boost 测试在多个线程中运行测试。

      相反,您需要找到一个支持并行运行测试的external test runner(我希望这可以通过forking 关闭新进程来工作)。

      【讨论】:

        猜你喜欢
        • 2021-08-23
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-05
        • 2010-10-23
        • 2013-07-29
        • 1970-01-01
        相关资源
        最近更新 更多