欧美在线专区-欧美在线伊人-欧美在线一区二区三区欧美-欧美在线一区二区三区-pornodoxxx中国妞-pornodoldoo欧美另类

position>home>Spotlights

嵌入式,真的不需要單元測試?

[導讀]嵌入式行業摸爬滾打這幾年,嵌入式遇見有規范單元測試的不需項目寥寥無幾。歸根到底,單元無非是測試公司希望快速迭代出產品,有問題等客戶反饋再說。嵌入式當然,不需也有人認為是單元嵌入式行業都是小而美的產品居多,沒有到一定量級之前,測試玩不起單元測試這種配置。嵌入式不過,不需出于對代碼穩定性的單元追求,我認為還是測試應該著手了解一下單元測試的。畢竟,嵌入式這是不需有效提高代碼說服力的方式之一。


嵌入式,真的不需要單元測試?

前言

嵌入式行業摸爬滾打這幾年,單元遇見有規范單元測試的項目寥寥無幾。歸根到底,無非是公司希望快速迭代出產品,有問題等客戶反饋再說。當然,也有人認為是嵌入式行業都是小而美的產品居多,沒有到一定量級之前,玩不起單元測試這種配置。正如做個蛋炒飯,并不需要安排主廚、二廚一般

不過出于對代碼穩定性的追求,我認為還是應該著手了解一下單元測試的。畢竟,這是有效提高代碼說服力的方式之一。

相信沒有真正體驗過單元測試好處的讀者一看到"單元測試"這幾個字,可能會出現以下兩種反應之一:

  • 由于沒有單元測試的經驗,因此對采用這一方法去保證軟件質量很好奇,也迫切地想要了解這一方法在項目中的實施

  • 曾經使用單元測試但效果不好,因為在嵌入式行業,時常要跟硬件打交道,單元測試很難檢測硬件問題,所以往往一看到"單元測試"這幾個字的反應就是"沒用"

如果讀者是第一種反應那很好,本文就是科普單元測試的基本要點。如果讀者是第二種反應,那可能是對單元測試存在偏見,本系列文章也會介紹mock測試、錯誤注入等方式,使單元測試也能合理使用于嵌入式行業。



01

單元測試真的"無用"?



造成"單元測試無用論"的第一個原因是,運用這一方法的時機不恰當。不少項目在一開始真正關心質量的人很少,更談不上采用一整套的方法論去保證質量了。產品在開發出來后發現到處存在問題,只會拆西墻補東墻根本就不能阻止問題一而再,再而三地出現。于是,開始想起單元測試。一聲令下,整個項目開始做單元測試。單元測試以模塊為單位,需要先把項目拆分出來。如果你的項目代碼整體耦合程度較高的話,單元測試根本無從說起,拆分的工作會讓你痛苦不已。

單元測試是一項耗時的工作,但管理者卻往往希望在短期內看到效果。或者單元測試還沒做到位管理層就等不及了,催你馬上開始下一步的開發,結果只能是前功盡棄。正確的做法是:在項目的開始之初就引入單元測試。對于以前沒有部署單元測試的項目,先只對新增加的、相對獨立的模塊做單元測試、并逐漸覆蓋老代碼。

第二個導致"單元測試無用論"的原因是,方法沒有運用到位。要保證單元測試的有效性一定要引入另一個概念--代碼覆蓋。關于代碼覆蓋,我以后會另外再寫一篇文章介紹。只有將單元測試和代碼覆蓋結合在一起,綜合使用才能保證單元測試的效果。

02

最原始的"單元測試"



這里給讀者展示一下,不使用任何單元測試框架時,是怎么做單元測試的。

下面簡單以linux內核鏈表為例:

    struct list_head { struct list_head *next, *prev;};/*定義一個結構體,只含有表示前驅和后繼的指針,它就是我們的主角了*/#define LIST_HEAD_INIT(name) {  &(name), &(name) }/*靜態初始化*/#define LIST_HEAD(name) \struct list_head name = LIST_HEAD_INIT(name)/*動態初始化*/static inline void INIT_LIST_HEAD(struct list_head *list){ list->next = list;list->prev = list;}/*插入操作*//*刪除操作*//*合并操作*/...

    完整代碼很長,這里沒有必要全部貼出,能起演示作用就足夠了。

    現在就以INIT_LIST_HEAD函數為例,來考慮如何為這個函數設計測試用例。INIT_LIST_HEAD函數的實現是如此的簡單,以至于很容易讓人覺得為它設計單元測試是多余的。但是,從單元測試的角度看,只要不存在可行性問題就不應考慮因為簡單而不對其進行驗證。而且,放棄對之進行驗證,以后會降低代碼覆蓋率。

    做單元測試需要通過編寫程序的方式來完成,所編寫的用于測試的代碼又稱為單元測試用例。

    下面我們來簡單實現一個INIT_LIST_HEAD函數的測試用例:

      int main(int argc,char **argv){ struct list_head list;
      /*避免函數沒有使用參數而引發waining*/UNUSED(argc);UNUSED(argv);
      list.prev = (struct list_head*)0xaaaa;list.next = (struct list_head*)0xbbbb;
      INIT_LIST_HEAD(list);
      /*檢查前指針*/if(list.prev != list){ return -1;}
      /*檢查后指針*/if(list.next != list){ return -1;}
      return 0;}

      這應該是史上最簡單的測試用例,功能非常簡單,首先是故意將list結構體中的各個指針變量初始化為一個隨機值。然后在調用完INIT_LIST_HEAD函數之后,檢查各成員是否被初始化為了list,以判斷INIT_LIST_HEAD函數是否正常工作了。注意:這個測試程序還有一個約定,返回-1代表測試失敗,返回0表示測試成功。

      這個測試用例是基于我們對INIT_LIST_HEAD函數有足夠的了解之后編寫的,這種測試方法在軟件測試領域有個正兒八經的名字,叫白盒測試。

      相信通過這個NIT_LIST_HEAD函數的測試用例,你已經初步建立起了對單元測試的印象。但是千萬不要以為單元測試僅此而已,這是我刻意簡化的結果。要完整地掌握單元測試,還要好好學習一段時間。

      目前,對于這個小小的單元測試案例,還有很多的不足,下面簡單羅列了幾項:

      • 如果對于每一次檢查都采取直接寫if語句的形式,將造成大量的冗余代碼,并且測試用例的編寫效率也會很低。

      • 通過觀察程序是否返回0或者是-1的方式來判斷所有的測試是否通過并不直觀,一旦出錯也無法馬上判斷是那一步測試出了問題。毫無疑問,我們需要更加直觀的方式來展示哪一步成功或者哪一步失敗。

      • 一份嚴謹的測試用例,會有大量的判定。如果一個測試程序存在100次判定,其中出現了3次失敗,那最終顯示一個百分比的測試通過率會比較直觀,比如可以顯示97%的測試成功了。

      后面會進一步介紹如何自己搭建一個簡單實用的單元測試框架,來解決上面這些問題。也會陸續展開介紹mock方法、打樁、錯誤注入、代碼覆蓋、動態分析、靜態分析、性能優化等內容。

      03

      總結


      正如很多其他技巧,比如打桌球、滑雪一樣,測試驅動開發也要花費相當長時間來練習。許多開發者已經接受了這種技術,而且再也不想回到從前“后期調試式編程”的方式去了。

      它會使你的代碼:

      • ?產生的bug更少

      • 調試時間更短

      • 完全可以通過提交你的單元測試案例,來證明你的項目可靠性。



      猜你喜歡

      干貨 | 函數宏的三種封裝方式

      你寫的程序很健壯?不妨測一下?


      1024G 嵌入式資源大放送!包括但不限于C/C++、單片機、Linux等。在公眾號聊天界面回復1024,即可免費獲取!

      免責聲明:本文內容由21ic獲得授權后發布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯系我們,謝謝!

      Popular articles

      主站蜘蛛池模板: 玉蒲团在线看| 国产精品久久国产精品99| 国产私拍视频| 精品久久久久国产免费| 99在线精品视频在线观看| 女生张开腿让男生通| 欧美特黄a级高清免费大片| 日日操夜夜操免费视频| 男女生差差差很痛的app| 国产麻豆剧果冻传媒一区| 北条麻妃一本到高清在线观看| 八戒网站免费观看视频| 国产视频一区二区在线观看| 美国十次啦色| 成人免费看www网址入口| 99精品久久99久久久久| 欧洲大片无需服务器| 免费搞基| 日本不卡在线播放| 高清破外女出血视频| 全球全球gogo专业摄影| 富二代国app产下载| 色哟哟精品视频在线观看| 日本阿v视频在线观看| 女人扒开裤子让男人桶| 好吊妞网站| 成人免费v片在线观看| 精品伊人久久大线蕉地址| 人妖在线| 日本不卡在线播放| 西西人体44rtwww高清大但| 美女羞羞视频网站| 一级黄色欧美| 波多野结衣黑人| 大陆年轻帅小伙飞机gay| 扒开女人下面| 久久精品视频一区| 欧美国产综合| 美女露隐私全部免费直播| 老师你的兔子好软水好多的车视频| 女人国产香蕉久久精品|