CPPUNIT:我们真的需要每个测试一个功能吗?
问题描述:
考虑这个意思做同样的测试(doTest
),但使用不同的参数CppUnit的测试类:CPPUNIT:我们真的需要每个测试一个功能吗?
class MyTest : public CPPUNIT_NS::TestFixture
{
CPPUNIT_TEST_SUITE(MyTest);
CPPUNIT_TEST(test1);
CPPUNIT_TEST(test2);
CPPUNIT_TEST(test3);
CPPUNIT_TEST_SUITE_END();
public:
MyTest();
void test1() { doTest(1); }
void test2() { doTest(2); }
void test3() { doTest(3); }
void doTest(int param);
};
CPPUNIT_TEST_SUITE_REGISTRATION(MyTest);
有没有办法改变这种状况,以避免申报test1
,test2
和test3
,喜欢的东西:
class MyTest : public CPPUNIT_NS::TestFixture
{
CPPUNIT_TEST_SUITE(MyTest);
CPPUNIT_TEST_PARAM(doTest, 1); // CPPUNIT_TEST_PARAM does not exits, it's just to illustrate my need
CPPUNIT_TEST_PARAM(doTest, 2); // CPPUNIT_TEST_PARAM does not exits, it's just to illustrate my need
CPPUNIT_TEST_PARAM(doTest, 3); // CPPUNIT_TEST_PARAM does not exits, it's just to illustrate my need
CPPUNIT_TEST_SUITE_END();
public:
MyTest();
void doTest(int param);
};
CPPUNIT_TEST_SUITE_REGISTRATION(MyTest);
注意CPPUNIT_TEST是一个宏:
#define CPPUNIT_TEST(testMethod) \
CPPUNIT_TEST_SUITE_ADD_TEST( \
(new CPPUNIT_NS::TestCaller<TestFixtureType>( \
context.getTestNameFor(#testMethod), \
&TestFixtureType::testMethod, \
context.makeFixture())))
编辑:
试过这样:
CPPUNIT_TEST_SUITE(MyTest);
CPPUNIT_TEST(funcT<1>);
CPPUNIT_TEST_SUITE_END();
template<int i> void funcT() { doTest(i); }
它工作正常,但未能如果我使用char*
类型:
CPPUNIT_TEST_SUITE(MyTest);
CPPUNIT_TEST(funcT<"foo">);
CPPUNIT_TEST_SUITE_END();
template<char* s> void funcT() { std::cout << s << std::endl; doTest(1); }
它的错误:
error C2664: 'CppUnit::TestCaller<test_cppunit_regulation_regul_dt_100::TestFixtureType>::TestCaller(const CppUnit::TestCaller<test_cppunit_regulation_regul_dt_100::TestFixtureType> &)': cannot convert argument 2 from 'void (__cdecl *)(void)' to 'void (__cdecl test_cppunit_regulation_regul_dt_100::*)(void)'
或者更参数:
个CPPUNIT_TEST_SUITE(MyTest);
CPPUNIT_TEST(funcT<1,2>);
CPPUNIT_TEST_SUITE_END();
template<int i, int j> void funcT() { doTest(i+j); }
它错误:
1>b:\dev\vobs_diabeloop\private\tst\regulation\cppunit\regul_dt_100\test.cpp(14): warning C4002: too many actual parameters for macro 'CPPUNIT_TEST'
1>b:\dev\vobs_diabeloop\private\tst\regulation\cppunit\regul_dt_100\test.cpp(14): error C2059: syntax error: ')'
最后尝试添加括号(CPPUNIT_TEST((funcT<1,2>));
),它错误:创建多个测试类(而不是一个单一的与
1>b:\dev\vobs_diabeloop\private\tst\regulation\cppunit\regul_dt_100\test.cpp(14): error C2589: '(': illegal token on right side of '::'
1>b:\dev\vobs_diabeloop\private\tst\regulation\cppunit\regul_dt_100\test.cpp(14): error C2059: syntax error: '::'
1>b:\dev\vobs_diabeloop\private\tst\regulation\cppunit\regul_dt_100\test.cpp(14): error C2660: 'CppUnit::TestSuiteBuilderContextBase::addTest': function does not take 2 arguments
1>b:\dev\vobs_diabeloop\private\tst\regulation\cppunit\regul_dt_100\test.cpp(14): error C2143: syntax error: missing ';' before ')'
1>b:\dev\vobs_diabeloop\private\tst\regulation\cppunit\regul_dt_100\test.cpp(14): error C2059: syntax error: ')'
答
找到一个解决方案几个子测试)。
那里只有一个int
参数的简单情况:
class BaseTest : public CPPUNIT_NS::TestFixture
{
public:
BaseTest() {}
void doTest(int param) {}
};
template < int i >
class MyTest : public BaseTest
{
CPPUNIT_TEST_SUITE(MyTest<i>);
CPPUNIT_TEST(doTest);
CPPUNIT_TEST_SUITE_END();
void doTest()
{
BaseTest::doTest(i);
};
};
#define REGISTER_TEST_WITH_PARAMS(name, a) \
CPPUNIT_TEST_SUITE_REGISTRATION(MyTest<a>);
REGISTER_TEST_WITH_PARAMS(test1, 1);
REGISTER_TEST_WITH_PARAMS(test2, 2);
如果需要更多的参数,只需要创建一个类来封装他们:
class BaseTest : public CPPUNIT_NS::TestFixture
{
public:
BaseTest() {}
void doTest(int param1, const std::string& param2) {}
};
class ParamClass
{
public:
ParamClass(int param1, const std::string& param2) :
param1(param1),
param2(param2)
{
}
int param1;
std::string param2;
};
template < ParamClass & T >
class CURRENT_MODULE : public BaseTest
{
CPPUNIT_TEST_SUITE(MyTest<T>);
CPPUNIT_TEST(doTest);
CPPUNIT_TEST_SUITE_END();
void doTest()
{
BaseTest::doTest(T.param1, T.param2);
};
};
#define REGISTER_TEST_WITH_PARAMS(name, a, b) \
ParamClass name(a, b); \
CPPUNIT_TEST_SUITE_REGISTRATION(MyTest<name>);
REGISTER_TEST_WITH_PARAMS(test1, 1, "test1");
REGISTER_TEST_WITH_PARAMS(test2, 2, "test2");
我不知道地道的CppUnit的用法,但将'void test1(){doTest(1); doTest(2); doTest(3); }'帮忙呢? –
我需要三个测试分开,让他们都跑(如果你的建议,如果第一次失败,最后两个没有执行) – jpo38
Look [here](http://stackoverflow.com/questions/5687540 /非A型模板参数#5687553)。你不能在那里使用'std :: string',但'char *'可以工作。这是一个语言规范。你可以使用lambda发布整个堆栈(我忘了在我的答案中保护它,现在修复)。 – kabanus