每次使用不同的夹具多次执行一个测试用例

时间:2014-02-27 10:09:59

标签: c++ boost fixtures boost-test mt

我有一个测试用例,我想为不同的数据库状态执行。我将对象插入到夹具中的DB(我想保持这种方式)。我想为数据库中的不同配置创建DB虚拟化和专用夹具的初始化方法。

我能想到的一种方法是做一些事情:

void doTest(){
    //test code here
}

BOOST_FIXTURE_TEST_CASE(test1, fixture1)
{
    doTest();
}

BOOST_FIXTURE_TEST_CASE(test2, fixture2)
{
    doTest();
}

BOOST_FIXTURE_TEST_CASE(test3, fixture3)
{
    doTest();
}

但是有更清洁,更整洁的方式吗? 或许我不应该完全这样做?我将非常感谢测试专家给出的任何建议。

1 个答案:

答案 0 :(得分:15)

您可以使用BOOST_FIXTURE_TEST_CASE_TEMPLATE来实例化多个测试:

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE TestModuleName
#include <boost/test/unit_test.hpp>
#include <boost/mpl/vector.hpp>

struct Fixture1 { int i; Fixture1() : i(1) {} };
struct Fixture2 { int i; Fixture2() : i(2) {} };
struct Fixture3 { int i; Fixture3() : i(3) {} };

typedef boost::mpl::vector<Fixture1, Fixture2, Fixture3> Fixtures;

BOOST_FIXTURE_TEST_CASE_TEMPLATE(Test, T, Fixtures, T){
    std::cout << T::i << "\n";
}

将打印

1
2
3

此代码为mpl::vector&#39; Fixtures&#39;中的每种类型实例化自己的测试用例。每个Fixture类型将作为T传递(BOOST_FIXTURE_TEST_CASE_TEMPLATE的第二个参数),T将用作测试用例的固定(最后一个参数)。

买者

由于测试用例(类)的模板性质,您需要在T::前面访问fixtures成员以指示它们是(模板参数)相关名称。

改进

因为BOOST_FIXTURE_TEST_CASE_TEMPLATE如此通用,人们可能想要定义一个方便的快捷方式&#34;更清楚地了解正在做什么:

#define MULTI_FIXTURE_TEST_CASE(NAME, TPARAM, ...) \
        typedef boost::mpl::vector<__VA_ARGS__> NAME##_fixtures; \
        BOOST_FIXTURE_TEST_CASE_TEMPLATE(NAME, TPARAM, NAME##_fixtures, TPARAM)

MULTI_FIXTURE_TEST_CASE(Test, T, Fixture1, Fixture2, Fixture3){
    std::cout << T::i << "\n";
}

正如您所看到的,它隐藏了mpl::vector。我认为最好在它自己的头文件中定义这个宏,它也会#include <boost/mpl/vector.hpp>以避免错过依赖关系。灯具列表名称是测试用例的名称加上&#39; _fixtures&#39;所以它应该不会与现有的名字发生冲突并且有些意义。