Din*_*ino 13 c++ boost fixtures mt boost-test
我有一个测试用例,我想为不同的数据库状态执行.我将对象插入到夹具中的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();
}
Run Code Online (Sandbox Code Playgroud)
但是有更清洁,更整洁的方式吗?或许我不应该完全这样做?我将非常感谢测试专家给出的任何建议.
Nob*_*ody 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";
}
Run Code Online (Sandbox Code Playgroud)
会打印
1
2
3
Run Code Online (Sandbox Code Playgroud)
此代码为mpl::vector"Fixtures" 中的每种类型实例化一个自己的测试用例.每个Fixture类型将作为T(第二个参数BOOST_FIXTURE_TEST_CASE_TEMPLATE)传入,T并将用作测试用例的夹具(最后一个参数).
由于测试用例(类)的模板特性,您需要预先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";
}
Run Code Online (Sandbox Code Playgroud)
你可以看到它有点隐藏了mpl::vector.我认为最好在它自己的头中定义这个宏,这也#include <boost/mpl/vector.hpp>可以避免错过依赖.灯具列表名称是测试用例的名称加上'_fixtures'所以它应该不会与现有名称冲突并且有些意义.
| 归档时间: |
|
| 查看次数: |
1865 次 |
| 最近记录: |