3

考虑以下场景:

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"

但我想一口气把它们一起运行。我应该怎么办?提前致谢 :)

4

2 回答 2

3

This is not a feature currently supported by Boost.Test. The documentation states that you can use a comma separated list if the tests are in the same suite:

Running multiple test cases residing within the same test suite by listing their names in coma separated list.

You can also use wildcards to select suites and test cases, but depending on the names of your suites and cases, you may not be able to limit the selection to just to two cases you desire.

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

于 2014-04-18T18:59:01.760 回答
1

编辑看来我可能对问题标题的字面意思有点过分了。同时运行测试对我来说意味着“并行”。

无论如何,如果你也乐于跑步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()进行静态初始化,并且这些初始化使用外部资源(例如,日志文件),则可能存在冲突。看

于 2014-04-19T13:11:22.640 回答