對 fixture 的所有測試用例可以被封裝在一個 CppUnit::TestFixture 的子類(命名慣例是[ClassName]Test)中。然后定義這個fixture 的 setUp 和 tearDown 函數(shù),為每個測試用例定義一個測試函數(shù)(命名慣例是 testXXX)。下面是個簡單的例子:
class MathTest : public CppUnit::TestFixture {
protected:
int m_value1, m_value2;
public:
MathTest() {}
// 初始化函數(shù)
void setUp () {
m_value1 = 2;
m_value2 = 3;
}
// 測試加法的測試函數(shù)
void testAdd () {
// 步驟(2),對 fixture 進行操作
int result = m_value1 + m_value2;
// 步驟(3),驗證結(jié)果是否爭取
CPPUNIT_ASSERT( result == 5 );
}
// 沒有什么清理工作沒有定義 tearDown.
}
在測試函數(shù)中對執(zhí)行結(jié)果的驗證成功或者失敗直接反應(yīng)這個測試用例的成功和失敗。CppUnit 提供了多種驗證成功失敗的方式:
CPPUNIT_ASSERT(condition) // 確信condition為真
CPPUNIT_ASSERT_MESSAGE(message, condition) // 當(dāng)condition為假時失敗, 并打印message
CPPUNIT_FAIL(message) // 當(dāng)前測試失敗, 并打印message
CPPUNIT_ASSERT_EQUAL(expected, actual) // 確信兩者相等
CPPUNIT_ASSERT_EQUAL_MESSAGE(message, expected, actual) // 失敗的同時打印message
CPPUNIT_ASSERT_DOUBLES_EQUAL(expected, actual, delta) // 當(dāng)expected和actual之間差大于delta時失敗
要把對 fixture 的一個測試函數(shù)轉(zhuǎn)變成一個測試用例,需要生成一個 CppUnit::TestCaller 對象。而終運行整個應(yīng)用程序的測試代碼的時候,可能需要同時運行對一個 fixture 的多個測試函數(shù),甚至多個 fixture 的測試用例。CppUnit 中把這種同時運行的測試案例的集合稱為 TestSuite。而 TestRunner 則運行測試用例或者 TestSuite,具體管理所有測試用例的生命周期。目前提供了 3 類TestRunner,包括:
CppUnit::TextUi::TestRunner // 文本方式的TestRunner
CppUnit::QtUi::TestRunner // QT方式的TestRunner
CppUnit::MfcUi::TestRunner // MFC方式的TestRunner
下面是個文本方式 TestRunner 的例子:
CppUnit::TextUi::TestRunner runner;
CppUnit::TestSuite *suite= new CppUnit::TestSuite();
// 添加一個測試用例
suite->addTest(new CppUnit::TestCaller<MathTest> (
"testAdd", testAdd));
// 指定運行TestSuite
runner.addTest( suite );
// 開始運行, 自動顯示測試進度和測試結(jié)果
runner.run( "", true ); // Run all tests and wait
對測試結(jié)果的管理、顯示等功能涉及到另一類對象,主要用于內(nèi)部對測試結(jié)果、進度的管理,以及進度和結(jié)果的顯示。這里不做介紹。
下面我們整理一下思路,結(jié)合一個簡單的例子,把上面說的思路串在一起。
3. 手動使用步驟
首先要明確測試的對象 fixture,然后根據(jù)其功能、流程,以及以前的經(jīng)驗,確定測試用例。這個步驟非常重要,直接關(guān)系到測試的終效果。當(dāng)然增加測試用例的過程是個階段性的工作,開始完成代碼后,先完成對功能的測試用例,保證其完成功能;然后對可能出錯的部分,結(jié)合以前的經(jīng)驗(比如邊界值測試、路徑覆蓋測試等)編寫測試用例;后在發(fā)現(xiàn)相關(guān) bug 時,根據(jù) bug 完成測試用例。
比如對整數(shù)加法進行測試,首先定義一個新的 TestFixture 子類,MathTest,編寫測試用例的測試代碼。后期需要添加新的測試用例時只需要添加新的測試函數(shù),根據(jù)需要修改 setUp 和 tearDown 即可。如果需要對新的 fixture 進行測試,定義新的 TestFixture 子類即可。注:下面代碼僅用來表示原理,不能編譯。