我开始使用CppUnit进行C ++单元测试。我想要实现的目标是在一个主文件(和函数)上运行我的所有测试套件。让我解释一下:
假设我们有两个类测试我设计的两个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
}
在这些文件(单独正常工作)之后,我想创建一个唯一的文件来运行我所有注册的套件。假设我的主要测试运行者是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。
任何帮助将不胜感激。 欢呼声。
解决方案编辑:最后,感谢@ {moggi提供的examples和建议,我已经能够解决我的问题了。我从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;
}
答案 0 :(得分:2)
因此,您基本上使用了两种解决方案。
将所有内容链接在一起并使用CPPUNIT_TEST_SUITE_REGISTRATION
注册您的测试套件并感到高兴。这需要将测试代码和AllTest.cpp链接在一起。
在运行时动态加载测试并使用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