来进行测试,如果有异常抛出,那么就说明代码写错了。可是,这显然不方便,也不是我们使用CppUnit的初衷。下面我们给出完整的代码:
// UnitTest.cpp : Defines the entry point for the console application.
//
#include "CppUnit/TestCase.h"
#include "CppUnit/TestResult.h"
#include "CppUnit/TextOutputter.h"
#include "CppUnit/TestResultCollector.h"
#include
#include
class FileStatus
{
std::string mFileName;
public:
FileStatus( const std::string& fileName ):mFileName( fileName )
{}
std::string getFileName() const
{
return mFileName;
}
};
class MyTestCase:public CPPUNIT_NS::TestCase
{
public:
virtual void runTest()
{
const std::string fileName( "a.dat" );
FileStatus status( fileName );
CPPUNIT_ASSERT_EQUAL( status.getFileName(), fileName );
}
};
int main()
{
MyTestCase m;
CPPUNIT_NS::TestResult r;
CPPUNIT_NS::TestResultCollector result;
r.addListener( &result );
m.run( &r );
CPPUNIT_NS::TextOutputter out( &result, std::cout );
out.write();
return 0;
}
这里我先说一下怎样运行这个程序。假设你的CppUnit版本是1.10.2,解压后,你会在src文件夹中,发现一个CppUnitLibraries.dsw,打开它,并且编译。你会在lib文件夹中,发现一些 lib和dll,我们的程序需要依赖当中的某些。接着,创建一个Console应用程序,假设我们仅使用Debug模式,在Project Settings中,把预编译选项(Precompiled Header)选成No,把CppUnit的include路径加入到Additional Include Directories中,并且把Code Generation改成Multi-threaded Debug Dll,接着把CppUnitD.lib加入到你的项目中去。最后把我们的这个文件替换main.cpp。这个时候,就可以编译运行了。
这个文件中,前面四行分别是CppUnit相应的头文件,在CppUnit中,通常某个类就定义在用它的类名命名的头文件中。接着是我们的string和 iostream头文件。然后是我们类的一个简单实现,只实现了这个测试中有意义的功能。接下去是我们的TestCase的定义,CPPUNIT_NS是 CppUnit所在的名字空间。main中,TestResult其实是一个测试的控制器,你在调用TestCase的run时,需要提供一个 TestResult。run作为测试的进行方,会把测试中产生的信息发送给TestResult,而TestResult作为一个分发器,会把所收到的信息再转发给它的Listener。也就是说,我简单的定义一个TestResult并且把它的指针传给TestCase::run,这个程序也能够编译通过并且正确运行,但是它不会有任何输出。TestResultCollector可以把测试输出的信息都收集起来,并且最后通过 TextOutputter输出出来。在上述的例子中,你所获得的输出是:
文章来源于领测软件测试网 https://www.ltesting.net/