針對c語言的測試框架相比其他語言要少一些,本文簡單介紹一下cunit框架的基本使用方法,權當備忘吧。cunit的組織框架如下圖所示:
將單個測試用例打包到乙個suite中,這些suite在registry中註冊。registry中的所有suite/tests可以使用單個函式呼叫執行,也可以執行選定的套件或測試。下面看乙個例子
首先我們新建檔案,寫乙個待測試函式,這裡以乙個字串轉換數字函式為例,這是我們的第一版實現
// convert.c
// 版本1
int
str_to_int(char* s)
return sum;
}
顯然這個函式是有很多問題的,我們寫乙個測試函式來測試它。
void
test_str_to_int()
; int real = ;
int i = 0;
for (i = 0; i < sizeof(real)/sizeof(real[0]); i++)
}
測試函式和被測函式寫好之後,我們就可以定義乙個registry 和乙個suite,在suite中新增被測函式,並在registry中註冊。
addtestmodule()
// 在suite中新增被測函式
if (null == cu_add_test(psuite,"str_to_int",test_str_to_int))
return 0;
}
cunit提供了三種模式檢視單元測試結果,分別是控制台模式,基本模式和報表模式
void
run_test()
assert(null != cu_get_registry());
assert(!cu_is_test_running());
if (0 != addtestmodule())
// 報表模式
// 設定輸出檔名稱
cu_set_output_filename("str_to_int_test_report");
cu_list_tests_to_file();
cu_automated_run_tests();
// 基本模式
// cu_basic_set_mode(cu_brm_verbose);
// cu_basic_run_tests();
// 控制台模式
// cu_console_run_tests();
// cu_console_run_tests();
cu_cleanup_registry();
}
最後寫乙個main函式來呼叫測試函式
#include#include "test.h"
int
main()
編譯執行
gcc -g convert.c main.c test.c -lcunit
./a.out
執行完成後,在當前目錄下可以看到生成了兩個xml檔案,這兩個檔案就是得到的測試結果。
str_to_int_test_report-listing.xml
str_to_int_test_report-results.xml
不過這兩個檔案不能直接開啟,需要把cunit安裝目錄下的另外四個檔案複製過來。如果預設安裝的話,這四個檔案一般在/usr/local/share/cunit目錄下
cunit-list.dtd
cunit-list.xsl
cunit-run.dtd
cunit-run.xsl
把這6個檔案拷貝到同一路徑下,就可以通過ie或者edge瀏覽器檢視輸出結果。
可以看到,9個測試用例有3個沒有通過。改進一下被測函式
// convert.c
// 版本2
int
str_to_int(char* s)
// 排除空格
while (*p == ' ')
p++;
//控制符號
if (*p == '-') else if (*p == '+')
while (*p >= '0' && *p <= '9')
p++;
}return (int)sum * sign;
}
重新編譯,執行,看一下測試結果,這一次9個case全部通過
最簡單的C語言單元測試框架
資料來自internet。最簡單的c語言單元測試框架,只有乙個3行的標頭檔案。如下 cat test mini test.h define mini assert message,test do while 0 define mini test test do while 0 extern int ...
C 單元測試框架學習
前段時間學習和了解了下google的開源c 單元測試框架google test,簡稱gtest,非常的不錯。我們原來使用的是自己實現的一套單元測試框架,在使用過程中,發現越來越多使用不便之處,而這樣不便之處,gtest恰恰很好的解決了。其實gtest本身的實現並不複雜,我們完全可以模仿gtest,不...
c 單元測試框架Catch
catch是乙個不錯的單元測試框架,幫助刷leetcode github在此 define catch config main this tells catch to provide a main only do this in one cpp file include catch.hpp incl...