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

有没有办法改变这种状况,以避免申报test1test2test3,喜欢的东西:

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: ')' 
+0

我不知道地道的CppUnit的用法,但将'void test1(){doTest(1); doTest(2); doTest(3); }'帮忙呢? –

+0

我需要三个测试分开,让他们都跑(如果你的建议,如果第一次失败,最后两​​个没有执行) – jpo38

+0

Look [here](http://stackoverflow.com/questions/5687540 /非A型模板参数#5687553)。你不能在那里使用'std :: string',但'char *'可以工作。这是一个语言规范。你可以使用lambda发布整个堆栈(我忘了在我的答案中保护它,现在修复)。 – kabanus

找到一个解决方案几个子测试)。

那里只有一个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"); 
+0

cppunit的下一个版本将包含参数化测试用例。可悲的是,它何时会被释放尚不清楚。希望本月结束,但可能会有一些延迟。 – moggi

+0

@moggi“下一个版本”?最新版本(1.12.2)是在2008年制作的,所以我怀疑即将推出的下一个版本...... – jpo38

+0

https://www.freedesktop.org/wiki/Software/cppunit/或多或少是新的家和所有Linux发行版的版本。那个由LibreOffice团队维护。 – moggi