首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

UnitTest++ 實戰指南:輕量級 C++ 單元測試框架完整上手教學

     編輯:關於C語言

UnitTest++ 是專為 C++ 設計的極輕量單元測試框架,功能媲美 CppUnit 卻大幅簡化寫法,得益於巧妙的框架設計。本文涵蓋環境建置、專案設定、測試撰寫進階用法與原始碼客製化,並修正支援 VC6 的相容性問題。

UnitTest++ vs CppUnit 快速比較

框架比較表

1. 環境建置與專案設定

1.1 建置庫檔與環境變數

  1. 編譯 UnitTest++ 專案產生 UnitTest++.lib
  2. 新增系統環境變數 UNITTEST_CPP_PATH 指向庫檔目錄
  3. 將所有標頭檔複製至專案 include/UnitTest++ 目錄
  4. 將 .lib 檔複製至專案 lib 目錄
環境變數設定 標頭檔複製 庫檔複製

1.2 測試專案屬性設定

  • C/C++ → General → Additional Include Directories:加入 $(UNITTEST_CPP_PATH)\include
  • Linker → General → Additional Library Directories:加入 $(UNITTEST_CPP_PATH)\lib
  • Linker → Input → Additional Dependencies:加入 UnitTest++.lib
標頭檔搜尋路徑 庫檔搜尋路徑

1.3 程式進入點啟動測試

#include <UnitTest++.h>

int main() {
    return UnitTest::RunAllTests();  // 自動發現並執行所有 TEST
}
main函式啟動測試

2. 測試案例撰寫語法大全

2.1 基本測試 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); // 例外檢查
}

命名規則:測試名稱不可重複,框架自動註冊至執行清單。

2.2 測試套件 SUITE — 邏輯分組

SUITE(MyModuleTests) {
    TEST(FeatureA) { /* ... */ }
    TEST(FeatureB) { /* ... */ }
}

2.3 固定裝置 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"));
}

2.4 執行時間限制 UNITTEST_TIME_CONSTRAINT


TEST(PerformanceCritical) {
    lengthySetup();
    {
        UNITTEST_TIME_CONSTRAINT(50);  // 50 ms 內必須完成
        timeCriticalOperation();
    }
    lengthyTeardown();
}

3. 進階客製化:修改原始碼擴充功能

3.1 全域時間限制與輸出格式


// UnitTest++ 源碼中修改 RunAllTests()
int RunAllTests() {
    TestReporterStdout reporter;           // 或 XmlTestReporter 輸出 XML
    return RunAllTests(reporter, Test::GetTestList(), 500); // 最後參數:全域 ms 限制
}
  • 將最後參數 0 改為毫秒數,啟用全域執行時間守衛。
  • 替換 TestReporterStdout 為 XmlTestReporter 可輸出 CI 友善的 XML 報告。

3.2 深度學習資源

官方原始碼與自測代碼 (Test*.cpp) 是最佳教材,展示完整功能與最佳實踐。


本文整理自「果凍的軟件技術博客」,原文出處:https://sinojelly.blog.51cto.com/479153/200792

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved