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

Execute one test case several times with different fixture each time

本文关键字:一个 测试用例 执行 fixture      更新时间:2023-10-16

我有一个测试用例,我想针对数据库的不同状态执行它。我将对象插入fixture中的DB(我希望保持这种方式)。我想为数据库虚拟化的初始化方法,并为数据库中的不同配置专门化fixture。

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

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

但是有更干净、更整洁的方法吗?或者也许我不应该这么做?我将感谢测试专家的任何建议。

您可以使用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"Fixtures"中的每种类型实例化一个自己的测试用例。每个夹具类型将作为T(BOOST_FIXTURE_TEST_CASE_TEMPLATE的第二个参数)传入,T将用作测试用例的夹具(最后一个参数)。

洞穴

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

改进

因为BOOST_FIXTURE_TEST_CASE_TEMPLATE是如此通用,人们可能想定义一个方便的"快捷方式",它更明确地说明正在做的事情:

#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>,以避免丢失依赖项。fixtures列表名称是测试用例的名称加上"_fixtures",因此希望它不会与现有名称冲突,并且有一定的意义。