天天看點

CPPUTest 單元測試架構(針對 C 單元測試的使用說明)

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,如需轉載請自行聯系原作者

繼續閱讀