CPPUTest 雖然名稱上看起來是 C++ 的單元測試架構, 其實它也是支援測試 C 代碼的.
本文主要介紹用CPPUTest來測試 C 代碼. (C++沒用過, 平時主要用的是C) C++相關的内容都省略了.
本文基于 debian v7.6 x86_64.
現在各個Linux的發行版的源都有豐富的軟體資源, 而且安裝友善.
但是如果想要在第一時間使用最新版本的開源軟體, 還是得從源碼安裝.
debian系統為了追求穩定性, apt源中的軟體一般都比較舊. 是以本文中的例子是基于最新源碼的CPPUTest.
2. 編譯源碼
最後我沒有實際安裝, 而是直接使用編譯出的二進制。
CPPUTest 的測試用例非常簡單, 首先定義一個 TEST_GROUP, 然後定義屬于這個 TEST_GROUP 的 TEST.
需要注意的地方是:
1. 引用 CPPUTest 中的2個頭檔案
2. 引用 C 頭檔案時, 需要使用 extern "C" {}
下面的例子是測試 sample.c 中 ret_int 的代碼.
構造了一個測試成功, 一個測試失敗的例子
測試完成後, 可以用 CPPUTest 提供的宏來判斷測試結果是否和預期一緻.
CPPUTest 提供的用于判斷的宏如下: (上面的測試代碼就使用了 CHECK_EQUAL)
Assertion 宏
含義
CHECK(boolean condition)
condition==True則成功; 反之失敗
CHECK_TEXT(boolean condition, text)
condition==True則成功; 反之失敗, 并且失敗時輸出 text資訊
CHECK_EQUAL(expected, actual)
expected==actual則成功; 反之失敗
CHECK_THROWS(expected_exception, expression)
抛出的異常 expected_exception==exception則成功; 反之失敗
STRCMP_EQUAL(expected, actual)
字元串 expected==actual則成功; 反之失敗
LONGS_EQUAL(expected, actual)
數字 expected==actual則成功; 反之失敗
BYTES_EQUAL(expected, actual)
數字 expected==actual則成功; 反之失敗 (數字是 8bit 寬)
POINTERS_EQUAL(expected, actual)
指針 expected==actual則成功; 反之失敗
DOUBLES_EQUAL(expected, actual, tolerance)
double型 expected和actual在誤差範圍内(tolerance)相等則成功; 反之失敗
FAIL(text)
總是失敗, 并輸出 text 資訊
這一步是最關鍵的, 也就是編譯出單元測試檔案. 下面是 makefile 的寫法, 關鍵位置加了注釋.
編譯測試檔案
編譯sample程式時, 需要把 "CFLAGS += -D CPPUTEST" 這句注釋掉, 否則沒有main函數.
運作可執行檔案 test 就可以實施測試.
上面 test.c 檔案中 TEST_GROUP(sample) 中的代碼是空的, 其實 CPPUTest 中内置了 2 個調用 setup 和 teardown.
在 TEST_GROUP 中實作這2個函數之後, 每個屬于這個 TEST_GROUP 的 TEST 在執行之前都會調用 setup, 執行之後會調用 teardown.
修改 test.c 中的 TEST_GROUP 如下:
重新執行測試: (每個測試之前, 之後都多了上面的列印資訊)
記憶體洩漏一直是C/C++代碼中令人頭疼的問題, 還好, CPPUTest 中提供了檢測記憶體洩漏的插件, 使用這個插件, 可使我們的代碼更加健壯.
使用記憶體檢測插件時, 測試代碼 和 待測代碼 在編譯時都要引用.
makefile 修改如下:
修改 sample.c 中的 init_student 函數, 構造一個記憶體洩漏的例子.
修改 test.c 追加一個測試 init_student 函數的測試用例
執行測試, 可以發現測試結果中提示 sample.c 72 行有記憶體洩漏風險,
這一行正是 init_student 函數中用 malloc 申請記憶體的那一行.
本文轉自wang_yb部落格園部落格,原文連結:http://www.cnblogs.com/wang_yb/p/3999701.html,如需轉載請自行聯系原作者