如何快速完成代碼的單元測(cè)試?
掃描二維碼
隨時(shí)隨地手機(jī)看文章
前言
軟件開(kāi)發(fā)中,每次需求的變更基本都需要改寫(xiě)代碼,而代碼變更后就需要進(jìn)行功能測(cè)試,當(dāng)然在功能測(cè)試之前需要代碼的單元測(cè)試,避免代碼改動(dòng)后部分場(chǎng)景沒(méi)有驗(yàn)證,最后出現(xiàn)各種問(wèn)題。
通過(guò)測(cè)試框架快速完成代碼的單元測(cè)試,不僅可以覆蓋之前測(cè)試的場(chǎng)景,也能快速反應(yīng)問(wèn)題在哪里
常用的C語(yǔ)言測(cè)試框架有
Unity:一個(gè)小型的,開(kāi)源的C語(yǔ)言測(cè)試框架,提供了用于測(cè)試的基本結(jié)構(gòu)和函數(shù)。簡(jiǎn)單好用,常用于嵌入式系統(tǒng)開(kāi)發(fā)。
CUnit:一個(gè)面向C語(yǔ)言測(cè)試的框架,使用簡(jiǎn)單,支持自動(dòng)化測(cè)試和手動(dòng)測(cè)試。
Check:適用于C語(yǔ)言的單元測(cè)試框架,使用簡(jiǎn)單,支持測(cè)試套件、測(cè)試用例的管理,便于維護(hù)測(cè)試組件。
Google Test:Google推出的C++測(cè)試框架,支持C語(yǔ)言,可以跨平臺(tái),具有豐富的斷言庫(kù)和Mocks。
cmocka:適用于C語(yǔ)言的單元測(cè)試框架,支持內(nèi)存泄漏檢測(cè),支持Mock函數(shù)和Stub函數(shù)等高級(jí)用法。
criterion:基于C語(yǔ)言的單元測(cè)試框架,支持參數(shù)化測(cè)試和測(cè)試用例依賴,具有良好的性能和易用性。
介紹
這里介紹Unity,其他的可以自行查閱,不同的單元測(cè)試框架適用于不同的開(kāi)發(fā)需求和場(chǎng)景。開(kāi)發(fā)人員可以按照自己的項(xiàng)目要求選擇最適合的框架。
Unity最小可以只用到幾個(gè)文件即可完成,把Unity源碼目錄下的unity.c、unity.h、unity_internals.h三個(gè)文件復(fù)制至我們的工程目錄下進(jìn)行編譯即可,然后在測(cè)試文件代碼中包含unity.h
https://github.com/ThrowTheSwitch/Unity/releases
簡(jiǎn)單的示例
完成功能函數(shù)的驗(yàn)證
#include#include "unity.h" void setUp() { // 這里可以放置每個(gè)測(cè)試用例運(yùn)行前的初始化代碼 } void tearDown() { // 這里可以放置每個(gè)測(cè)試用例運(yùn)行后的清理代碼 } 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(); // 啟動(dòng)測(cè)試 RUN_TEST(test_AddFun); UNITY_END(); // 結(jié)束測(cè)試 return 0; }
通過(guò)串口或終端打印內(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
下載鏈接
其中自定義實(shí)現(xiàn)的C語(yǔ)言擴(kuò)展庫(kù)(cot)的容器功能函數(shù)都已通過(guò)Unity添加了對(duì)應(yīng)的單元測(cè)試用例,有興趣的朋友可以參考:
下載鏈接(點(diǎn)擊閱讀原文):https://gitee.com/const-zpc/cot





