UnitTest++是C++工程下使用的一個非常小巧、方便的單元測試工具。它提供了與CppUnit相似的功能,但它把用例寫作的工作量最小化了,使用起來更方便,這些都得益於它的框架構思非常巧妙,如果想知道詳細情況可參考源代碼。此工具本身不支持VC6,我把它改進了一下。 下面是CppUnit與UnitTest++的簡單比較:
1.使用方法 1.1. 環境准備 1.1.1. 編譯生成UnitTest++.lib文件。 1.1.2. 設置一個環境變量UNITTEST_CPP_PATH。 1.1.3. 如下圖,把UnitTest++的所有頭文件復制過來。 1.1.4. 如下圖,把剛才編譯的.lib文件復制過來。 1.2. 工程設置 需要測試的工程需要做如下設置。 1.2.1. 增加頭文件搜索路徑: 1.2.2. 增加庫文件搜索路徑: 1.2.3. 在main()函數所在文件中加載剛才的lib文件。在main()函數中調用UnitTest::RunAllTests();那麼所有測試用例便都會被執行了。 1.3. 用例寫作 一般可以為每個模塊新建一個cpp文件用於寫測試用例。 1.3.1. 簡單的測試用例 // test.cpp
#include <UnitTest++.h>
TEST(TestCaseName)
{
int ret = TestFunction();
CHECK(ret == SUCCESS);
}
注: 1、 每個測試用例都以TEST開始,後面括號中是用例名字,不允許重復。 2、 一般情況下,檢查結果用CHECK宏即可。更多的檢查方式可以參考源代碼或者UnitTest++自帶的文檔。下面列舉一些常用的宏: CHECK_EQUAL(expected, actual) 檢查是否相等 CHECK_CLOSE(expected, actual, tolerance) 檢查在可容忍的誤差范圍內是否相等(多用於浮點數相等判斷) CHECK_ARRAY_EQUAL(expected, actual, count) 檢查數組是否相等,前面兩個參數都是數組名字,count是元素個數。 CHECK_ARRAY_CLOSE(expected, actual, count, tolerance) 參考上面兩個的說明。 CHECK_ARRAY2D_CLOSE(expected, actual, rows, columns, tolerance) 二維數組。 CHECK_THROW(expression, ExpectedExceptionType)檢查是否會拋出指定類型的異常。 CHECK_ASSERT(expression) 檢查是否會拋出UnitTest::AssertException類型的異常。 3、 每個測試用例都被自動添加到待運行的用例集合。 1.3.2. 測試套SUIT的使用 如果希望一組測試用例放在一個組中,則可以用SUIT。 SUITE(YourSuiteName)
{
TEST(YourTestName)
{
}
TEST(YourOtherTestName)
{
}
}
1.3.3. FIXTURE的使用 如果希望在一組用例執行前執行某一部分代碼即setUP),測試結束後再執行一段代碼即tearDown),或者是希望多個用例中的數據進行共享,那麼可以用FIXTURE。 struct SomeFixture
{
SomeFixture() { /* some setup */ }
~SomeFixture() { /* some teardown */ }
int testData;
};
TEST_FIXTURE(SomeFixture, YourTestName)
{
int temp = testData;
}
注: 1、 使用FIXTURE需要先定義一個結構SomeFixture。 2、 把setUp中要運行的代碼放到SomeFixture的構造函數中。 3、 把tearDown中要運行的代碼放到SomeFixture的析構函數中。 4、 SomeFixture中的成員可以用於測試數據共享。 5、 每個用例都用TEST_FIXTURE來定義,與TEST宏一樣,這樣定義的用例也會被自動加入待運行的用例集合。 1.3.4. 限制用例部分代碼的執行時間 可以限制用例中的一部分代碼只能在規定時間內運行完如果運行不完,用例fail)。 TEST(YourTimedTest)
{
// Lengthy setup...
{
UNITTEST_TIME_CONSTRAINT(50);
// Do time-critical stuff
}
// Lengthy teardown...
}
如果“Do time-critical stuff”部分的代碼在50ms內沒運行完,則用例fail。 1.4. 高級用法 1.4.1. 修改UnitTest++源代碼可以進行功能定制。 int RunAllTests()
{
TestReporterStdout reporter;
return RunAllTests(reporter, Test::GetTestList(), 0);
}
1、 在UnitTest++源代碼中修改上面的RunAllTests(reporter, Test::GetTestList(), 0)最後一個參數0,可以設置全局的時間約束,即每個用例的執行時間必須少於此時間約束,否則用例fail。 2、 可以改變reporter的類型,從而改變測試結果輸出方式。比如用XmlTestReporter把結果輸出到xml文件。 1.4.2. 更多的高級用法 通過學習UnitTest++源代碼、UnitTest++自身的測試代碼來獲得。UnitTest++自身的測試代碼寫得很好,學習它可以了解UnitTest++的功能和測試用例的寫作方法。
本文出自 “果凍的軟件技術博客” 博客,請務必保留此出處http://sinojelly.blog.51cto.com/479153/200792