c – CPPUNIT:每次测试我们真的需要一个功能吗?
发布时间:2020-12-16 06:52:53 所属栏目:百科 来源:网络整理
导读:考虑这个CPPUNIT测试类意味着执行相同的测试(doTest),但使用不同的参数: class MyTest : public CPPUNIT_NS::TestFixture{ CPPUNIT_TEST_SUITE( MyTest ); CPPUNIT_TEST( test1 ); CPPUNIT_TEST( test2 ); CPPUNIT_TEST( test3 ); CPPUNIT_TEST_SUITE_END()
考虑这个CPPUNIT测试类意味着执行相同的测试(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,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:devvobs_diabeloopprivatetstregulationcppunitregul_dt_100test.cpp(14): warning C4002: too many actual parameters for macro 'CPPUNIT_TEST' 1>b:devvobs_diabeloopprivatetstregulationcppunitregul_dt_100test.cpp(14): error C2059: syntax error: ')' 最后尝试添加括号(CPPUNIT_TEST((funcT< 1,2>));),它的错误: 1>b:devvobs_diabeloopprivatetstregulationcppunitregul_dt_100test.cpp(14): error C2589: '(': illegal token on right side of '::' 1>b:devvobs_diabeloopprivatetstregulationcppunitregul_dt_100test.cpp(14): error C2059: syntax error: '::' 1>b:devvobs_diabeloopprivatetstregulationcppunitregul_dt_100test.cpp(14): error C2660: 'CppUnit::TestSuiteBuilderContextBase::addTest': function does not take 2 arguments 1>b:devvobs_diabeloopprivatetstregulationcppunitregul_dt_100test.cpp(14): error C2143: syntax error: missing ';' before ')' 1>b:devvobs_diabeloopprivatetstregulationcppunitregul_dt_100test.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" ); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- c – 如何在终端上同步输入和输出?
- Flex中ByteArray与BitmapData互相转换实现图片的二进制保存
- ruby – 在linux上安装jekyll(fedora 20)
- cocos2d-js 的project.json
- oracle ROW_NUMBER() OVER( PARTITION BY COL1 ORDER BY CO
- oracle 10204 10205 11202 11023 11204 db psu 下载连接汇总
- c# – 使用多个托管模块进行组装
- visual-c – 为什么在使用Touch Injection API和WIN8时只注
- reactjs – 最简单的Typescript React WebPack示例生成错误
- ruby-on-rails – 在Ruby on Rails 3应用程序中开始使用Web