通过这样一个简单的Test Case测试了4个可能存在的错误:
load函数返回值
getData函数返回值
number结构的成员值
string结构的成员值
storeTest要复杂一些,因为需要把fixture中的数据存储到临时文件中,之后打开两个文件(新的临时文件和外部文件),读出数据并比照内容。代码如下:
void DiskDataTestCase::storeTest()
{
DATA d;
DWORD tmpSize, auxSize;
BYTE *tmpBuff, *auxBuff;
TCHAR absoluteFilename[MAX_PATH];
DWORD size = MAX_PATH;
// 填充结构体
d.number = FILE_NUMBER;
strcpy(d.string, FILE_STRING);
// 相对路径转化为路径
strcpy(absoluteFilename, AUX_FILENAME);
CPPUNIT_ASSERT( RelativeToAbsolutePath(absoluteFilename, &size) );
// 执行操作
fixture->setData(&d);
CPPUNIT_ASSERT( fixture->store("data.tmp") );
// 读出两文件的内容并对比
// ReadAllFileInMemory 是一个分配缓冲区的外部函数
// 把文件内容存入其中. 调用函数负责释放缓冲区.
tmpSize = ReadAllFileInMemory("data.tmp", tmpBuff);
auxSize = ReadAllFileInMemory(absoluteFilename, auxBuff);
// 文件不存在则抛出异常
CPPUNIT_ASSERT_MESSAGE("New file doesn't exists?", tmpSize > 0);
CPPUNIT_ASSERT_MESSAGE("Aux file doesn't exists?", auxSize > 0);
// 文件大小可获得,否则抛出异常
CPPUNIT_ASSERT(tmpSize != 0xFFFFFFFF);
CPPUNIT_ASSERT(auxSize != 0xFFFFFFFF);
// 缓冲区必须可用,否则抛出异常
CPPUNIT_ASSERT(tmpBuff != NULL);
CPPUNIT_ASSERT(auxBuff != NULL);
// 两个文件的大小必须和DATA一致
CPPUNIT_ASSERT_EQUAL((DWORD) sizeof(DATA), tmpSize);
CPPUNIT_ASSERT_EQUAL(auxSize, tmpSize);
// 两文件的内容必须一致
CPPUNIT_ASSERT( 0 == memcmp(tmpBuff, auxBuff, sizeof(DATA)) );
delete [] tmpBuff;
delete [] auxBuff;
::DeleteFile("data.tmp");
}
启动用户界面
后,看看如何显示基于MFC的用户界面对话框(事先在其内部编译了TestRunner.dll)。
打开实现类的文件(ProjectNameApp.cpp),把下列代码复制到InitInstance方法中:
#include <cppunit/ui/mfc/TestRunner.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
BOOL CMy_TestsApp::InitInstance()
{
....
// 声明Test Runner,用以注册的测试填入其中,并运行
CppUnit::MfcUi::TestRunner runner;
runner.addTest( CppUnit::TestFactoryRegistry::getRegistry().makeTest() );
runner.run();
return TRUE;
}
很简单,不是吗?只需要定义一个"runner"实例,添加注册过的test(test是通过CPP文件中的CPPUNIT_TEST_SUITE_REGISTRATION宏注册的),可以运行run函数了。