通过cmd同时运行属于不同测试套件的2个或更多个升压测试用例

时间:2013-10-24 19:19:31

标签: 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)
    {
        //my test code here
    }
}

现在,如果我想一次运行suite1 / case1和suite2 / case2,我尝试以下命令行参数:

MyProject.exe --run_test="suite1/case1, suite2/case2"

但这似乎没有。

我知道我可以单独运行这些测试用例,如下:

MyProject.exe --run_test="suite1/case1"

MyProject.exe --run_test="suite2/case2"

但是我想一次又一次地运行它们。我该怎么办? 在此先感谢:)

2 个答案:

答案 0 :(得分:3)

这不是Boost.Test目前支持的功能。文档声明如果测试位于同一套件中,您可以使用逗号分隔列表:

  

通过在逗号分隔列表中列出其名称来运行驻留在同一测试套件中的多个测试用例。

您还可以使用通配符来选择套件和测试用例,但根据套件和案例的名称,您可能无法将选择限制为您想要的两种情况。

http://www.boost.org/doc/libs/1_55_0/libs/test/doc/html/utf/user-guide/runtime-config/run-by-name.html

答案 1 :(得分:1)

编辑似乎我可能已经过了字面意义上的问题标题了。同时运行测试 意味着"并行"对我来说。

无论如何,如果你也乐意运行suite2/case1,你可以

MyProject.exe --run_test="suite1,suite2"

同时查看 Live On 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"});
    }
}

查看 Live On 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()输入之前进行静态初始化,并且这些使用外部资源(例如,日志文件等),则可能存在冲突。见