那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

嵌入式需要單元測試嗎?

工程師 ? 來源:嵌入式大雜燴 ? 作者:嵌入式大雜燴 ? 2020-10-23 16:08 ? 次閱讀

前言

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

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

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

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

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

如果讀者是第一種反應那很好,本文就是科普單元測試的基本要點。如果讀者是第二種反應,那可能是對單元測試存在偏見,本系列文章也會介紹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更少

調試時間更短

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

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 測試
    +關注

    關注

    8

    文章

    5375

    瀏覽量

    127058
  • 嵌入式
    +關注

    關注

    5092

    文章

    19177

    瀏覽量

    307647
  • 代碼
    +關注

    關注

    30

    文章

    4825

    瀏覽量

    69041
收藏 人收藏

    評論

    相關推薦

    如何提高嵌入式代碼質量?

    技術 現代的嵌入式開發工具和測試技術可以極大地提升代碼質量和開發效率: 1. 靜態分析工具:如Coverity、Lint等,能夠幫助發現潛在的代碼缺陷和安全漏洞。 2. 單元測試和集成測試
    發表于 01-15 10:48

    嵌入式系統開發中的測試方法 嵌入式系統開發與AI結合應用

    嵌入式系統開發中的測試方法 嵌入式系統開發是一個復雜的過程,涉及到硬件和軟件的緊密結合。測試是確保系統可靠性和性能的關鍵步驟。以下是一些常用的測試
    的頭像 發表于 12-09 10:22 ?526次閱讀

    汽車軟件單元測試的重要性

    測試不充分密切相關,這引發了社會各界對汽車軟件健壯性的重要性進行深入思考。本文將探討汽車軟件的測試,尤其是單元測試的重要性,以及WinAMS單元測試工具在這一過程中的關鍵作用。 一、
    的頭像 發表于 11-29 10:57 ?219次閱讀

    嚴格的單元測試造就完美的軟件

    關鍵系統時,更是對軟件質量提出了極高的要求。而單元測試作為軟件開發過程中的核心環節,其重要性不言而喻。 單元測試的作用 單元測試是指對軟件中的最小可測試
    的頭像 發表于 11-26 13:22 ?225次閱讀

    嵌入軟件單元/集成測試工具專業分析

    引言 在現代軟件開發過程中,單元測試作為確保代碼質量的重要環節,得到了廣泛的關注和應用。隨著嵌入式系統的復雜性日益增加,對高效、可靠的單元測試工具的需求也愈加迫切。WinAMS作為一款專為嵌入
    的頭像 發表于 11-19 16:41 ?298次閱讀

    嵌入式主板是什么意思?嵌入式主板全面解析

    嵌入式主板,通常被稱為嵌入式系統的核心組件,是一種用于控制和數據處理的計算機硬件,其設計旨在嵌入特定設備中執行專門任務。嵌入式主板如同是設備的“大腦”,主要功能是根據
    的頭像 發表于 09-30 10:05 ?965次閱讀

    嵌入式linux開發的基本步驟有哪些?

    之前,首先需要選擇合適的硬件平臺。硬件選擇需要考慮以下幾個方面: 1.1 處理器 嵌入式Linux開發需要一個處理器,常見的處理器有ARM、MIPS、PowerPC等。選擇處理器時,
    的頭像 發表于 09-02 09:11 ?628次閱讀

    自動化嵌入式系統測試流程:TESSY功能優勢詳解

    關于TESSY: TESSY作為最早的單元測試工具之一,是當今嵌入式軟件測試的領先解決方案。TESSY的設計目的是支持根據標準進行的開發和測試,已經成為高質量產品和安全關鍵型應用的常用
    的頭像 發表于 07-22 10:52 ?623次閱讀
    自動化<b class='flag-5'>嵌入式</b>系統<b class='flag-5'>測試</b>流程:TESSY功能優勢詳解

    單元測試、集成測試自動化工具

    CoverageMaster winAMS :?適用于嵌入式目標機代碼的單元測試/集成測試工具 全面支持嵌入式微機!驗證嵌入式C/C++軟件
    的頭像 發表于 06-26 13:41 ?505次閱讀
    <b class='flag-5'>單元測試</b>、集成<b class='flag-5'>測試</b>自動化工具

    嵌入式開發者的未來

    測試這些產品的硬件和軟件。汽車行業:現代汽車包含大量的嵌入式系統,例如車載娛樂系統、發動機控制單元、自動駕駛系統等。在這個領域,工程師可以從事嵌入式軟件開發、系統集
    的頭像 發表于 06-23 08:10 ?449次閱讀
    <b class='flag-5'>嵌入式</b>開發者的未來

    飛凌嵌入式FCU2601嵌入式控制單元通過ILAC-MRA、CNAS檢測認證

    近期,飛凌嵌入式FCU2601嵌入式控制單元經過ILAC-MRA、CNAS認證實驗室的嚴格檢測,成功通過了七項關鍵性能測試,包括“輻射發射試驗”、“傳導發射限值試驗”、“射頻場感應的傳
    的頭像 發表于 05-20 09:06 ?686次閱讀
    飛凌<b class='flag-5'>嵌入式</b>FCU2601<b class='flag-5'>嵌入式</b>控制<b class='flag-5'>單元</b>通過ILAC-MRA、CNAS檢測認證

    嵌入軟件單元測試工具的作用

    嵌入軟件單元測試工具是現代軟件開發過程中不可或缺的一環。它的作用在于幫助開發人員對軟件中的各個單元進行測試,以確保其功能的正確性和穩定性。單元測試
    的頭像 發表于 04-23 15:31 ?466次閱讀
    <b class='flag-5'>嵌入</b>軟件<b class='flag-5'>單元測試</b>工具的作用

    定制嵌入式主板,需要考慮的功能有哪些?

    隨著科技的不斷發展和進步,嵌入式系統在各行各業中得到了廣泛的應用。嵌入式主板作為嵌入式系統的核心組件,起著至關重要的作用。在定制嵌入式主板時,需要
    的頭像 發表于 02-29 17:38 ?583次閱讀
    定制<b class='flag-5'>嵌入式</b>主板,<b class='flag-5'>需要</b>考慮的功能有哪些?

    單元/集成測試服務

    單元/集成測試旨在證明被測軟件實現其單元/架構設計規范、證明被測軟件不包含非預期功能。經緯恒潤測試團隊擁有豐富的研發經驗、嚴格的流程管控,依據ISO26262/ASPICE等開展符合要
    的頭像 發表于 02-29 13:27 ?423次閱讀
    <b class='flag-5'>單元</b>/集成<b class='flag-5'>測試</b>服務
    澳门百家乐职业赌客| 百家乐官网保单机作弊| 大发888官方网| 芝加哥百家乐官网的玩法技巧和规则| 斗地主棋牌游戏| 百家乐算牌皇冠网| 网上百家乐官网有假的吗| 威尼斯人娱乐网赌| 百家乐官网轮盘一体机厂家| 现场百家乐官网百家乐官网| 大发888线上娱乐城百家乐| 好运来百家乐现金网| 百家乐官网桌子轮盘| 德州扑克加注规则| 百家乐投注很不错| 百家乐官网网上真钱娱乐平台| 澳博| 大赢家百家乐的玩法技巧和规则 | 大发888官网网址| 百家乐最好的投注方法| 百家乐官网国际娱乐场| 醴陵市| 大发888网页版登陆| 百家乐官网技巧-澳门百家乐官网官方网址 | 百家乐官网博彩优惠论坛| 财神娱乐城信誉| 威尼斯人娱乐城骗子| 百家乐娱乐城有几家| 真人百家乐官网赌场娱乐网规则 | 东丽区| 大发888通宝| 百家乐保单机作弊| 网上的百家乐官网怎么才能| 百家乐官网赌博千术| 商南县| 沈阳棋牌网| 威尼斯人娱乐城可信吗| 澳门百家乐怎么赢钱| 百家乐官网麻将筹码币镭射贴膜| 百家乐官网游戏机路法| 太阳城百家乐官网优惠|