2016-12-06 45 views
1

我開始使用CppUnit進行C++單元測試。我試圖實現的目標是在單個主文件(和函數)上運行我的所有測試套件。讓我來解釋:CppUnit - 註冊表多個套件在單個主函數中運行

比方說,我們有兩個班,測試了兩個C++類我設計:

#ifndef FIRSTCLASSTEST_H 
#define FIRSTCLASSTEST_H 

class FirstClassTest : public CppUnit::TestFixture { 

    CPPUNIT_TEST_SUITE(FirstClassTest); 
    CPPUNIT_TEST(testConstructor); 
    CPPUNIT_TEST_SUITE_END(); 

public: 
    void setUp(void); 
    void tearDown(void); 
protected: 
    void testConstructor(void); 
}; 

#endif 

而讓其它類是類似的:

#ifndef SECONDCLASSTEST_H 
#define SECONDCLASSTEST_H 

class SecondClassTest : public CppUnit::TestFixture { 

    CPPUNIT_TEST_SUITE(SecondClassTest); 
    CPPUNIT_TEST(testConstructor); 
    CPPUNIT_TEST_SUITE_END(); 

public: 
    void setUp(void); 
    void tearDown(void); 
protected: 
    void testConstructor(void); 
}; 

#endif 

而且cpp文件看起來類似於:

#include "FirstClassTest.h" 

CPPUNIT_REGISTRY_ADD_TO_DEFAULT(FirstClassTest); 

void FirstClassTest::setUp(){ 
    //setup... 
} 

void FirstClassTest::tearDown(){ 
    //teardown... 
} 

void FirstClassTest::testConstructor(){ 
    //some asserts 
} 

之後這些文件(哪些工作正常單獨),我想c創建一個獨特的文件來運行我所有註冊的套件。比方說,我的主測試是AllTest.cpp:

#include <cppunit/TestResult.h> 
#include <cppunit/TestResultCollector.h> 
#include <cppunit/BriefTestProgressListener.h> 
#include <cppunit/TestRunner.h> 
#include <cppunit/CompilerOutputter.h> 
#include <cppunit/extensions/HelperMacros.h> 

//Include Test classes here 
#include "FirstClassTest.cpp" 
#include "SecondClassTest.cpp" 

int main() 
{ 
    // informs test-listener about testresults 
    CPPUNIT_NS::TestResult testresult; 
    // register listener for collecting the test-results 
    CPPUNIT_NS::TestResultCollector collectedresults; 
    testresult.addListener (&collectedresults); 

    // register listener for per-test progress output 
    CPPUNIT_NS::BriefTestProgressListener progress; 
    testresult.addListener (&progress); 

    // insert test-suite at test-runner by registry 
    CPPUNIT_NS::TestRunner testrunner; 
    testrunner.addTest (CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest()); 
    testrunner.run(testresult); 

    // output results in compiler-format 
    CPPUNIT_NS::CompilerOutputter compileroutputter(&collectedresults, std::cerr); 
    compileroutputter.write(); 

    // return 0 if tests were successful 
    return collectedresults.wasSuccessful() ? 0 : 1; 

} 

但是,這是行不通的。我如何達到理想的行爲?我檢查了文檔:http://cppunit.sourceforge.net/doc/cvs/class_auto_register_suite.html但沒有成功。

我懷疑主要問題是AllTests.cpp中,我沒有正確地將套件添加到註冊表或testRunner。

任何幫助,將不勝感激。 乾杯。

解決方案編輯:最後,感謝examples和@moggi提供的建議,我已經能夠解決我的問題。我已刪除從我的cpp文件的任何CPP_UNIT_SUITE_REGISTRATION,我已經修改了AllTest.cpp主要功能是這樣的:

int main() 
{ 
    // informs test-listener about testresults 
    CPPUNIT_NS::TestResult testresult; 
    // register listener for collecting the test-results 
    CPPUNIT_NS::TestResultCollector collectedresults; 
    testresult.addListener (&collectedresults); 

    // register listener for per-test progress output 
    CPPUNIT_NS::BriefTestProgressListener progress; 
    testresult.addListener (&progress); 

    // insert test-suite at test-runner by registry 
    CPPUNIT_NS::TestRunner testrunner; 

    // MODIFIED PART, TEST SUITES ADDED MANUALLY 
    testrunner.addTest(FirstClassTest::suite()); 
    testrunner.addTest(SecondClassTest::suite()); 

    testrunner.run(testresult); 

    // output results in compiler-format 
    CPPUNIT_NS::CompilerOutputter compileroutputter(&collectedresults, std::cerr); 
    compileroutputter.write(); 

    // return 0 if tests were successful 
    return collectedresults.wasSuccessful() ? 0 : 1; 

} 

回答

2

所以基本上有你使用兩種解決方案。

  1. 連接一切融合在一起,並與CPPUNIT_TEST_SUITE_REGISTRATION註冊您的測試套件和快樂。這要求將測試代碼和您的AllTest.cpp鏈接在一起。

  2. 在運行期間動態加載您的測試,並使用CPPUNIT_PLUGIN_IMPLEMENT並註冊CPPUNIT_TEST_SUITE_REGISTRATION

第一種方法的優點是它很簡單,您不必擔心太多。當然,這個簡單的代價是,如果你想使用AllTest.cpp中的代碼進行多個不在單獨的二進制/庫中的獨立測試,你需要將AllTest.cpp鏈接到所有這些測試中。關於CPPUNIT_TEST_SUITE_REGISTRATION更多信息,the Creating TestSuite page in the documentation

被發現要實現在你的代碼這種方法添加到您的CPP文件爲每個測試套件如下:

CPPUNIT_TEST_SUITE_REGISTRATION(FirstClassTest); 

顯然與測試套件名稱替換FirstClassTest你用於CPPUNIT_TEST_SUITE

第二種方法稍微複雜一些,但允許有一個測試二進制文件,並在運行時動態加載帶有測試代碼的庫。這允許例如建立幾個獨立的測試,可以與共享的測試運行器並行運行。有關此方法的更多信息,請參見the cppunit documentation for the PluginIn approach

+0

我喜歡第一種方法。如何實現這一目標?如果我將'CPPUNIT_TEST_SUITE_REGISTRATION'放在兩個測試類中,則編譯會產生錯誤。 – F404

+0

我剛剛添加了一些細節。您還可以查看cppunit源代碼。示例目錄包含一個正在運行的cppunit測試,包含更復雜的設置,包括命名註冊。 – moggi

+0

非常感謝。不幸的是,如果我把'CPPUNIT_TEST_SUITE_REGISTRATION'兩個.cpp文件編譯器給我一個錯誤: '錯誤:矛盾的聲明 '的CppUnit :: AutoRegisterSuite autoRegisterRegistry__3' CPPUNIT_TEST_SUITE_REGISTRATION(FirstClassTest);' – F404