UnitTest++ 是專為 C++ 設計的極輕量單元測試框架,功能媲美 CppUnit 卻大幅簡化寫法,得益於巧妙的框架設計。本文涵蓋環境建置、專案設定、測試撰寫進階用法與原始碼客製化,並修正支援 VC6 的相容性問題。
UnitTest++.libUNITTEST_CPP_PATH 指向庫檔目錄include/UnitTest++ 目錄.lib 檔複製至專案 lib 目錄
$(UNITTEST_CPP_PATH)\include$(UNITTEST_CPP_PATH)\libUnitTest++.lib
#include <UnitTest++.h>
int main() {
return UnitTest::RunAllTests(); // 自動發現並執行所有 TEST
}
TEST#include <UnitTest++.h>
TEST(TestCaseName) {
int ret = TestFunction();
CHECK(ret == SUCCESS); // 基本斷言
CHECK_EQUAL(expected, actual); // 相等檢查 (顯示預期/實際值)
CHECK_CLOSE(3.14, pi, 0.001); // 浮點數容差比較
CHECK_ARRAY_EQUAL(arr1, arr2, n); // 陣列比較
CHECK_THROW(func(), ExceptionType); // 例外檢查
}
命名規則:測試名稱不可重複,框架自動註冊至執行清單。
SUITE — 邏輯分組SUITE(MyModuleTests) {
TEST(FeatureA) { /* ... */ }
TEST(FeatureB) { /* ... */ }
}
TEST_FIXTURE — 共享設置/清理與資料
struct DatabaseFixture {
DatabaseFixture() { db.connect("test.db"); } // setUp
~DatabaseFixture() { db.disconnect(); } // tearDown
Database db; // 共享資料
};
TEST_FIXTURE(DatabaseFixture, QueryTest) {
CHECK(db.execute("SELECT 1"));
}
UNITTEST_TIME_CONSTRAINT
TEST(PerformanceCritical) {
lengthySetup();
{
UNITTEST_TIME_CONSTRAINT(50); // 50 ms 內必須完成
timeCriticalOperation();
}
lengthyTeardown();
}
// UnitTest++ 源碼中修改 RunAllTests()
int RunAllTests() {
TestReporterStdout reporter; // 或 XmlTestReporter 輸出 XML
return RunAllTests(reporter, Test::GetTestList(), 500); // 最後參數:全域 ms 限制
}
0 改為毫秒數,啟用全域執行時間守衛。TestReporterStdout 為 XmlTestReporter 可輸出 CI 友善的 XML 報告。官方原始碼與自測代碼 (Test*.cpp) 是最佳教材,展示完整功能與最佳實踐。
本文整理自「果凍的軟件技術博客」,原文出處:https://sinojelly.blog.51cto.com/479153/200792