測試 C 與 C++ 程式

最後更新: 2022-10-24 10:04:22 +0800 +0800
原文以英文撰寫。您正在閱讀AI翻譯版本。

C 與 C++ 測試是可執行程式,其狀態必須影響建置與 CI 結果。框架可以改善判斷與報告,但若測試可執行檔具備專用的 main 與確定性的相依項,並整合至專案的測試執行器,就已足夠。

將測試建置為一級目標 #

將測試目標與正式環境二進位檔分開編譯,並將它們連結至正式環境函式庫。使用現有測試執行器(例如 CTest、Meson 或 Automake TESTS)註冊每個可執行檔,讓非零結束狀態使 CI 失敗。

cmake
add_executable(parser_test parser_test.cc)
target_link_libraries(parser_test PRIVATE parser)
add_test(NAME parser COMMAND parser_test)

可行時,將僅供測試使用的 fixture 與 fake 放在正式環境介面之外。測試執行器應回報失敗案例、保留診斷資訊,並在任何必要判斷或程序失敗時回傳非零值。

測試可觀察行為 #

測試公開行為、錯誤回報、清理與邊界條件,而不是私有表示法。依範圍組織涵蓋內容:

  1. 單元測試使用受控的協作者來測試小型元件。
  2. 整合測試驗證實際元件之間的邊界,例如序列化、資料庫介面卡,或剖析器與掃描器。
  3. 端對端測試驗證組合後的可執行檔或服務契約。

納入空輸入、限制、無效編碼、可注入的配置或 I/O 失敗、所有權轉移,以及先前已修正缺陷的迴歸測試。測試應判斷承諾的結果,而非偶然的實作細節。

讓相依項具備確定性 #

注入或包裝時鐘、隨機性、檔案系統、子程序與網路用戶端。記錄失敗的隨機種子,並使它可重播。使用由測試工具組控制的暫存測試工作區、唯一連接埠或記憶體內傳輸,以及有界限的逾時。避免共用環境狀態與測試順序相依性。

在子程序中執行具破壞性或容易當機的測試。程序隔離也能直接判斷結束狀態、訊號、標準輸出、標準錯誤與命令列行為。

搭配測試使用執行期診斷 #

Sanitizer 只能在已執行的路徑上找出特定類別的缺陷,因此它們是功能測試的補充,而非替代品。

bash
c++ -fsanitize=address,undefined -fno-omit-frame-pointer -g \
    parser_test.cc -o parser_test
./parser_test

AddressSanitizer 會偵測許多無效記憶體存取;UndefinedBehaviorSanitizer 會診斷選定的未定義操作。在 CI 中啟用專案支援的 sanitizer 設定,保留含符號的堆疊與記錄,並將 sanitizer 報告視為測試失敗。

評論

在 GitHub 上閱讀或評論(發表評論需要登入)