考虑下面这个CPPUNIT测试类,旨在使用不同的参数执行相同的测试(
请注意,CPPUNIT_TEST是一个宏:
doTest
):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: ')'
void test1() { doTest(1); doTest(2); doTest(3); }
会有所帮助吗? - Mark Bstd::string
,但是可以使用char*
。这是一项语言规范。您能否发布使用lambda的完整堆栈(我忘记在我的答案中保护它了,现在已经修复)。 - kabanus