加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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" );

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读