如何在 C++ 中实现 google 测试分片?

How to implement google test sharding in c++?

我想用 C++ 并行化我的 google 测试用例。 我已经阅读了 google 测试分片的文档,但无法在 c++ 编码环境中实现它。 由于我是编码领域的新手,所以任何人都可以通过代码向我解释下面 link 中的文档 https://github.com/google/googletest/blob/master/googletest/docs/advanced.md

Google分片可以在不同的机器上工作,还是可以在同一台机器上使用多线程实现?

分片不是在代码中完成的,而是使用环境完成的。你的机器指定了两个环境变量GTEST_TOTAL_SHARDS,也就是你的机器总数运行和GTEST_SHARD_INDEX,每台机器都是唯一的。当 GTEST 启动时,它会选择这些测试的一个子集。

如果你想模拟这个,那么你需要设置这些环境变量(which can be done in code)。

我可能会在 .bat 文件中尝试这样的操作(在 Windows 上):

set GTEST_TOTAL_SHARDS=10
FOR /L %%I in (1,1,10) DO cmd.exe /c "set GTEST_SHARD_INDEX=%%I && start mytest.exe"

并希望新的 cmd 实例有它自己的环境。

运行 命令 window 中的以下命令对我有用(与 James Poag 的回答非常相似,但请注意范围从“1,1,10”到“0,1, 9", "%%" -> "%" 和 "set" 到 "set /A"):

set GTEST_TOTAL_SHARDS=10
FOR /L %I in (0,1,9) DO cmd.exe /c "set /A GTEST_SHARD_INDEX=%I && start mytests.exe"

经过进一步实验,也可以在 C++ 中执行此操作。但这并不简单,我也没有找到一种可移植的方法。我不能 post 代码,因为它是在工作中完成的。

本质上,从 main 开始,创建新进程(其中 n 是可用内核数),从每个分片捕获结果,合并并输出到屏幕。 为了让每个进程 运行ning 一个不同的分片,控制器将分片总数和实例数提供给 child 进程。

这是通过检索和复制当前环境,并根据需要在副本中设置两个环境变量(GTEST_TOTAL_SHARDS 和 GTEST_SHARD_INDEX)来完成的。 GTEST_TOTAL_SHARDS 始终相同,但 GTEST_SHARD_INDEX 将是 child.

的实例编号

合并结果是繁琐但直接的字符串操作。最后我成功地得到了一个正确的总数,将所有单独碎片的结果相加。

我正在使用 Windows,所以使用 CreateProcessA 创建新进程,传入自定义环境。

事实证明,创建新进程需要花费大量时间,但我的程序需要大约 3 分钟才能完成 运行,因此并行 运行ning 有很好的好处- 在我的 12 核 PC 上时间下降到大约 30 秒。

请注意,如果这一切看起来有点矫枉过正,那么有一个 python 程序可以执行我在此处描述的操作,但使用的是 python 脚本(我认为 - 我还没有使用它)。这可能更直接。