编辑看来我可能对问题标题的字面意思有点过分了。同时运行测试对我来说意味着“并行”。
无论如何,如果你也乐于跑步suite2/case1
,你可以
MyProject.exe --run_test="suite1,suite2"
也可以在 Coliru 上看到它。
旧答案:并行运行两个进程有什么问题?无论如何,简单!
但是,如果您坚持,您可以分叉主进程的副本:
#include <sys/types.h>
#include <sys/wait.h>
#include <iostream>
static int relay_unit_test_main(std::vector<std::string> args);
int main()
{
if (int const child_pid = fork())
{
int exit_code = relay_unit_test_main({"--run_test=suite1"});
int child_status;
while (-1 == waitpid(child_pid, &child_status, 0));
if (!WIFEXITED(child_status)) {
std::cerr << "Child process (" << child_pid << ") failed" << std::endl;
return 1;
}
return exit_code? exit_code : WEXITSTATUS(child_status);
} else
{
return relay_unit_test_main({"--run_test=suite2"});
}
}
在Coliru现场观看
该函数relay_unit_test_main
实际上只不过是一个方便的包装器,可以避免手动unit_test_main
干预:argv[]
static bool init_function() { return true; }
static int relay_unit_test_main(std::vector<std::string> args)
{
std::vector<char const*> c_args;
c_args.push_back("fake_program_name");
std::transform(args.begin(), args.end(), std::back_inserter(c_args), std::mem_fn(&std::string::data));
c_args.push_back(nullptr);
return unit_test_main( &init_function, c_args.size()-1, const_cast<char**>(c_args.data()) );
}
这实际上产生了一个子进程——甚至尝试有效地组合退出代码信息。拥有一个单独的进程可以防止您在使用不是为在不同线程上多线程使用而设计的代码时遇到的问题。
一个警告仍然存在:如果您的程序在进入之前main()
进行静态初始化,并且这些初始化使用外部资源(例如,日志文件),则可能存在冲突。看