如何快速完成代碼的單元測試?
掃描二維碼
隨時隨地手機看文章
前言
軟件開發(fā)中,每次需求的變更基本都需要改寫代碼,而代碼變更后就需要進行功能測試,當(dāng)然在功能測試之前需要代碼的單元測試,避免代碼改動后部分場景沒有驗證,最后出現(xiàn)各種問題。
通過測試框架快速完成代碼的單元測試,不僅可以覆蓋之前測試的場景,也能快速反應(yīng)問題在哪里
常用的C語言測試框架有
Unity:一個小型的,開源的C語言測試框架,提供了用于測試的基本結(jié)構(gòu)和函數(shù)。簡單好用,常用于嵌入式系統(tǒng)開發(fā)。
CUnit:一個面向C語言測試的框架,使用簡單,支持自動化測試和手動測試。
Check:適用于C語言的單元測試框架,使用簡單,支持測試套件、測試用例的管理,便于維護測試組件。
Google Test:Google推出的C++測試框架,支持C語言,可以跨平臺,具有豐富的斷言庫和Mocks。
cmocka:適用于C語言的單元測試框架,支持內(nèi)存泄漏檢測,支持Mock函數(shù)和Stub函數(shù)等高級用法。
criterion:基于C語言的單元測試框架,支持參數(shù)化測試和測試用例依賴,具有良好的性能和易用性。
介紹
這里介紹Unity,其他的可以自行查閱,不同的單元測試框架適用于不同的開發(fā)需求和場景。開發(fā)人員可以按照自己的項目要求選擇最適合的框架。
Unity最小可以只用到幾個文件即可完成,把Unity源碼目錄下的unity.c、unity.h、unity_internals.h三個文件復(fù)制至我們的工程目錄下進行編譯即可,然后在測試文件代碼中包含unity.h
https://github.com/ThrowTheSwitch/Unity/releases
簡單的示例
完成功能函數(shù)的驗證
#include#include "unity.h" void setUp() { // 這里可以放置每個測試用例運行前的初始化代碼 } void tearDown() { // 這里可以放置每個測試用例運行后的清理代碼 } int Add(int a, int b) { return a + b; } void test_AddFun(void) { TEST_ASSERT_EQUAL_UINT(6, Add(1, 5)); TEST_ASSERT_EQUAL_UINT(4, Add(-1, 5)); TEST_ASSERT_EQUAL_UINT(-6, Add(-1, -5)); } int main() { UNITY_BEGIN(); // 啟動測試 RUN_TEST(test_AddFun); UNITY_END(); // 結(jié)束測試 return 0; }
通過串口或終端打印內(nèi)容為:
C:\test/test.c:47:test_AddFun:PASS ----------------------- 1 Tests 0 Failures 0 Ignored OK
其中,unity_internals.h文件中可以修改輸出終端,即UNITY_OUTPUT_CHAR宏的定義
/*------------------------------------------------------- * Output Method: stdout (DEFAULT) *-------------------------------------------------------*/ #ifndef UNITY_OUTPUT_CHAR /* Default to using putchar, which is defined in stdio.h */ #include#define UNITY_OUTPUT_CHAR(a) (void)putchar(a) #else /* If defined as something else, make sure we declare it here so it's ready for use */ #ifdef UNITY_OUTPUT_CHAR_HEADER_DECLARATION extern void UNITY_OUTPUT_CHAR_HEADER_DECLARATION; #endif #endif
下載鏈接
其中自定義實現(xiàn)的C語言擴展庫(cot)的容器功能函數(shù)都已通過Unity添加了對應(yīng)的單元測試用例,有興趣的朋友可以參考:
下載鏈接(點擊閱讀原文):https://gitee.com/const-zpc/cot





