我開始使用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;
}
我喜歡第一種方法。如何實現這一目標?如果我將'CPPUNIT_TEST_SUITE_REGISTRATION'放在兩個測試類中,則編譯會產生錯誤。 – F404
我剛剛添加了一些細節。您還可以查看cppunit源代碼。示例目錄包含一個正在運行的cppunit測試,包含更復雜的設置,包括命名註冊。 – moggi
非常感謝。不幸的是,如果我把'CPPUNIT_TEST_SUITE_REGISTRATION'兩個.cpp文件編譯器給我一個錯誤: '錯誤:矛盾的聲明 '的CppUnit :: AutoRegisterSuite autoRegisterRegistry__3' CPPUNIT_TEST_SUITE_REGISTRATION(FirstClassTest);' –
F404