C++ 通过cmd同时运行2个或更多属于不同测试套件的boost测试用例
考虑以下场景:C++ 通过cmd同时运行2个或更多属于不同测试套件的boost测试用例,c++,boost,boost-test,C++,Boost,Boost Test,考虑以下场景: BOOST_AUTO_TEST_SUITE(suite1) { BOOST_AUTO_TEST_CASE(case1) { //my test code here } } BOOST_AUTO_TEST_SUITE(suite2) { BOOST_AUTO_TEST_CASE(case1) { //my test code here } BOOST_AUTO_TEST_CASE(case2
BOOST_AUTO_TEST_SUITE(suite1)
{
BOOST_AUTO_TEST_CASE(case1)
{
//my test code here
}
}
BOOST_AUTO_TEST_SUITE(suite2)
{
BOOST_AUTO_TEST_CASE(case1)
{
//my test code here
}
BOOST_AUTO_TEST_CASE(case2)
{
//my test code here
}
}
现在,如果要同时运行suite1/case1和suite2/case2,请尝试以下命令行参数:
MyProject.exe --run_test="suite1/case1, suite2/case2"
但这似乎没有运行
我知道我可以单独运行这些测试用例,如下所示:
MyProject.exe --run_test="suite1/case1"
及
但我想一次就把它们一起运行。我该怎么办?
提前感谢:)这不是Boost.Test当前支持的功能。文档说明,如果测试在同一套件中,则可以使用逗号分隔的列表: 通过在单独的列表中列出多个测试用例的名称来运行驻留在同一测试套件中的多个测试用例 您也可以使用通配符来选择套件和测试用例,但根据套件和用例的名称,您可能无法将选择限制为您想要的两个用例
编辑似乎我对问题标题的理解有点过于字面化了。同时运行测试对我来说意味着“并行” 无论如何,如果您也愿意运行
suite2/case1
,您可以
MyProject.exe --run_test="suite1,suite2"
也可以看到它
老答案:并行运行这两个进程有什么不对?当然,简单 但是,如果您坚持,您可以复制主流程:
#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"});
}
}
这实际上产生了一个子进程,甚至尝试有效地组合退出代码信息。有一个单独的进程可以防止由于在不同的线程上使用不是为多线程使用而设计的代码而产生的问题
还有一个警告:如果您的程序在输入
main()
之前进行了静态初始化,并且这些初始化使用了外部资源(例如日志文件),则可能会发生冲突。看
- 有关
fork()
中继单元测试\u main
黑客,也许可以使用boost::program\u options
来实现您的实际目标。然而,似乎更合理的做法是“仅仅”编写一个针对Boost测试的补丁,并为此做出贡献!我对运行suite2/case1也不感兴趣!
#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"});
}
}
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()) );
}