4. 常用使用方式
按照上面的方式,如果要添加新的測(cè)試用例,需要把每個(gè)測(cè)試用例添加到 TestSuite 中,而且添加新的 TestFixture 需要把所有頭文件添加到 main.cpp 中,比較麻煩。為此 CppUnit 提供了 CppUnit::TestSuiteBuilder,CppUnit::TestFactoryRegistry 和一堆宏,用來方便地把 TestFixture 和測(cè)試用例注冊(cè)到 TestSuite 中。下面是通常的使用方式:
/// MathTest.h
// A TestFixture subclass.
// Announce: use as your owner risk.
// Author : liqun (liqun@nsfocus.com)
// Data : 2003-7-5
#include "cppunit/extensions/HelperMacros.h"
class MathTest : public CppUnit::TestFixture {
// 聲明一個(gè)TestSuite
CPPUNIT_TEST_SUITE( MathTest );
// 添加測(cè)試用例到TestSuite, 定義新的測(cè)試用例需要在這兒聲明一下
CPPUNIT_TEST( testAdd );
// TestSuite聲明完成
CPPUNIT_TEST_SUITE_END();
// 其余不變
protected:
int m_value1, m_value2;
public:
MathTest() {}
// 初始化函數(shù)
void setUp ();
// 清理函數(shù)
void tearDown();
// 測(cè)試加法的測(cè)試函數(shù)
void testAdd ();
// 可以添加新的測(cè)試函數(shù)
};
/// MathTest.cpp
// A TestFixture subclass.
// Announce: use as your owner risk.
// Author : liqun (liqun@nsfocus.com)
// Data : 2003-7-5
#include "MathTest.h"
// 把這個(gè)TestSuite注冊(cè)到名字為"alltest"的TestSuite中, 如果沒有定義會(huì)自動(dòng)定義
// 也可以CPPUNIT_TEST_SUITE_REGISTRATION( MathTest );注冊(cè)到全局的一個(gè)未命名的TestSuite中.
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( MathTest, "alltest" );
// 下面不變
void MathTest::setUp()
{
m_value1 = 2;
m_value2 = 3;
}
void MathTest::tearDown()
{
}
void MathTest::testAdd()
{
int result = m_value1 + m_value2;
CPPUNIT_ASSERT( result == 5 );
}
/// main.cpp
// Main file for cppunit test.
// Announce: use as your owner risk.
// Compile : g++ -lcppunit MathTest.cpp main.cpp
// Run : ./a.out
// Test : RedHat 8.0 CppUnit1.8.0
// Author : liqun ( a litthle modification. liqun@nsfocus.com)
// Data : 2003-7-5
// 不用再包含所有TestFixture子類的頭文件
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TestRunner.h>
// 如果不更改TestSuite, 本文件后期不需要更改.
int main()
{
CppUnit::TextUi::TestRunner runner;
// 從注冊(cè)的TestSuite中獲取特定的TestSuite, 沒有參數(shù)獲取未命名的TestSuite.
CppUnit::TestFactoryRegistry ®istry = CppUnit::TestFactoryRegistry::getRegistry("alltest");
<!-- code sample is too wide --> // 添加這個(gè)TestSuite到TestRunner中
runner.addTest( registry.makeTest() );
// 運(yùn)行測(cè)試
runner.run();
}
這樣添加新的測(cè)試用例只需要在類定義的開始聲明一下即可。
5. 其他實(shí)際問題
通常包含測(cè)試用例代碼和被測(cè)試對(duì)象是在不同的項(xiàng)目中。應(yīng)該在另一個(gè)項(xiàng)目(好在不同的目錄)中編寫 TestFixture,然后把被測(cè)試的對(duì)象包含在測(cè)試項(xiàng)目中。
對(duì)某個(gè)類或者某個(gè)函數(shù)進(jìn)行測(cè)試的時(shí)候,這個(gè) TestFixture 可能引用了別的類或者別的函數(shù),為了隔離其他部分代碼的影響,應(yīng)該在源文件中臨時(shí)定義一些樁程序,模擬這些類或者函數(shù)。這些代碼可以通過宏定義在測(cè)試項(xiàng)目中有效,而在被測(cè)試的項(xiàng)目中無效。