今年夏天,我用直接C編寫了一個嵌入式系統。這是我工做的公司接管的現有項目。 我已經習慣於使用JUnit在Java中編寫單元測試,可是對於爲現有代碼(須要重構)編寫單元測試的最佳方法以及添加到系統中的新代碼感到茫然。 linux
是否有任何項目使單元測試普通C代碼與使用JUnit進行單元測試Java代碼同樣簡單? 任何專門針對嵌入式開發(交叉編譯到arm-linux平臺)的看法都將很是感激。 git
我我的喜歡Google Test框架 。 程序員
測試C代碼的真正困難在於打破了對外部模塊的依賴性,所以您能夠將代碼單獨隔離。 當您嘗試圍繞遺留代碼進行測試時,這可能會特別成問題。 在這種狀況下,我常常發現本身使用連接器在測試中使用存根函數。 github
這是人們在談論「 接縫 」時所指的。 在C中,您惟一的選擇就是使用預處理器或連接器來模擬您的依賴項。 shell
個人一個C項目中的典型測試套件可能以下所示: api
#include "myimplementationfile.c" #include <gtest/gtest.h> // Mock out external dependency on mylogger.o void Logger_log(...){} TEST(FactorialTest, Zero) { EXPECT_EQ(1, Factorial(0)); }
請注意,您其實是包含C文件而不是頭文件 。 這提供了訪問全部靜態數據成員的優點。 在這裏,我模擬了個人記錄器(可能在logger.o中並給出一個空實現。這意味着測試文件獨立於代碼庫的其他部分進行編譯和連接並單獨執行。 架構
至於交叉編譯代碼,爲了使它工做,你須要在目標上有良好的設施。 我已經經過googletest交叉編譯到PowerPC架構上的Linux來完成此操做。 這是有道理的,由於你有一個完整的shell和os來收集你的結果。 對於不太豐富的環境(我將其歸類爲沒有完整操做系統的任何東西),您應該只在主機上構建和運行。 不管如何你應該這樣作,這樣你就能夠在構建過程當中自動運行測試。 框架
我發現測試C ++代碼一般要容易得多,由於OO代碼一般比程序更少耦合(固然這在很大程度上取決於編碼風格)。 一樣在C ++中,您可使用依賴注入和方法覆蓋等技巧將接縫轉換爲以其餘方式封裝的代碼。 wordpress
Michael Feathers有一本關於測試遺留代碼的優秀書籍 。 在一章中,他介紹了處理非面向對象代碼的技巧,我強烈推薦。 函數
編輯 :我寫了一篇關於單元測試程序代碼的博客文章 , 在GitHub上提供了源代碼。
編輯 : 實用程序員出版了一本專門針對單元測試C代碼的新書 , 我強烈推薦 。
Michael Feather的書「有效地使用遺留代碼」提供了許多特定於C開發期間單元測試的技術。
有一些與C相關的依賴注入相關的技術,我尚未在其餘任何地方看到過。
C版有一個優雅的單元測試框架,支持名爲cmocka的模擬對象。 它只須要標準的C庫,適用於各類計算平臺(包括嵌入式)和不一樣的編譯器。
它還支持不一樣的消息輸出格式,如Subunit,Test Anything Protocol和jUnit XML報告。
cmocka已經建立,也能夠在嵌入式平臺上運行,而且還支持Windows。
一個簡單的測試看起來像這樣:
#include <stdarg.h> #include <stddef.h> #include <setjmp.h> #include <cmocka.h> /* A test case that does nothing and succeeds. */ static void null_test_success(void **state) { (void) state; /* unused */ } int main(void) { const struct CMUnitTest tests[] = { cmocka_unit_test(null_test_success), }; return cmocka_run_group_tests(tests, NULL, NULL); }
API已完整記錄,而且幾個示例是源代碼的一部分。
要開始使用cmocka,您應該閱讀LWN.net上的文章: 在C中使用模擬對象進行單元測試
cmocka 1.0已於2015年2月發佈。
我很驚訝沒有人提到Cutter(http://cutter.sourceforge.net/)你能夠測試C和C ++,它能夠與autotools無縫集成,並提供了一個很是好的教程。
若是您的目標是Win32平臺或NT內核模式,您應該看一下cfix 。