我有一个测试用例,我想针对不同的数据库状态执行该测试用例。我在 fixture 中将对象插入数据库(我想保持这种状态)。我想为数据库中的不同配置创建虚拟数据库初始化方法和专用 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
中的每种类型实例化一个自己的测试用例。 ' fixture '。每个 fixture 类型将作为 T
传入(BOOST_FIXTURE_TEST_CASE_TEMPLATE
的第二个参数)和 T
将用作测试用例的 fixture (最后一个参数)。
警告
由于测试用例(类)的模板性质,您需要在前面加上 T::
访问fixtures成员以表明它们是(模板参数)依赖名称。
改进
因为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”,因此希望它不会与现有名称冲突并且有点意义。
关于c++ - 每次使用不同的 fixture 多次执行一个测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22065225/