TestFactoryRegistry
TestFactoryRegistry是用来解决以下两个缺陷的:
*忘了把你的fixture suite加入test runner(因为它在另外一个文件中,很容易忘)
*因为加入所有测试用例头文件造成的编译瓶颈。
TestFactoryRegistry是在初始化的时候注册suite的地方。
为了注册ComplexNumber suite,在.cpp中加入:
#include <cppunit/extensions/HelperMacros.h>
CPPUNIT_TEST_SUITE_REGISTRATION( ComplexNumber );
事实上,桌面下的动作是,一个静态的AutoRegisterSuite类型变量被声明。在构建的时候,它会注册一个TestSuiteFactory到TestFactoryRegistry。 TestSuiteFactory返回ComplexNumber::suite()返回的TestSuite。
为了运行这些用例,使用文字的test runner,我们不必包含fixture了:
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TestRunner.h>
int main( int argc, char **argv)
{
CppUnit::TextUi::TestRunner runner;
首先我们得到TestFactoryRegistry的实例:
CppUnit::TestFactoryRegistry ®istry = CppUnit::TestFactoryRegistry::getRegistry();
然后我们获得并添加一个由TestFactoryRegistry产生的新的TestSuite,它包含了使用CPPUNIT_TEST_SUITE_REGISTRATION()注册的所有的test suite.
runner.addTest( registry.makeTest() );
runner.run();
return 0;
}
Post-build check
好了,现在我们已经可以使测试运行了,那么把它集成到编译过程中去怎么样?
为了达到这个目的,应用程序必须返回一个非0值表明出现了错误。
TestRunner::run()返回一个布尔值来表明run()是否成功。
更新一下我们的main函数,我们得到:
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TestRunner.h>
int main( int argc, char **argv)
{
CppUnit::TextUi::TestRunner runner;
CppUnit::TestFactoryRegistry ®istry = CppUnit::TestFactoryRegistry::getRegistry();
runner.addTest( registry.makeTest() );
bool wasSucessful = runner.run( "", false );
return wasSucessful;
}
现在,你需要编译后运行你的应用程序。
使用 Visual C++的话,可以在Project Settings/Post-Build step中加入下面的命令。它被扩展到应用程序的执行路径。使用这个技术的时候看看project examples/cppunittest/CppUnitTestMain.dsp 中是如何设置的。
Original version by Michael Feathers. Doxygen conversion and update by Baptiste Lepilleur.