Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过cmd同时运行2个或更多属于不同测试套件的boost测试用例_C++_Boost_Boost Test - Fatal编程技术网

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()

您是否尝试过省略测试名称之间的空格:“suite1/case1,suite2/case2”?@oakad不起作用!错误:“测试设置错误:没有与过滤器匹配的测试用例”我已经在我这边尝试过这个东西,感觉boost.Test套件处理代码中有一个bug(毕竟,当套件不涉及时,可以调用多个测试)。也许你应该试着在boost-trac系统中提交一个bug报告。你能给我一个做同样事情的教程吗?嗯。也许我对“同时运行”的理解有点字面化。措辞问题标题是一门艺术:)编辑我的答案,为(更简单的)问题提供解决办法:)请注意,您仍然可以使用
中继单元测试\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()) );
}