測(cè)量代碼覆蓋率對(duì)于嵌入式系統(tǒng)來(lái)說(shuō)越來(lái)越重要,但需要一些經(jīng)驗(yàn)。這是因?yàn)橛幸恍┱系K需要克服,尤其是小目標(biāo)。但是,使用正確的方法和合適的工具,無(wú)需過(guò)多努力即可測(cè)量測(cè)試覆蓋率。九個(gè)實(shí)用技巧可幫助您入門(mén)。
測(cè)量測(cè)試覆蓋率,也稱(chēng)為代碼覆蓋率,對(duì)于嵌入式系統(tǒng)變得越來(lái)越重要。在許多情況下,這些設(shè)備對(duì)安全或業(yè)務(wù)至關(guān)重要。流程基于物聯(lián)網(wǎng)設(shè)備,患者依賴(lài)工作起搏器和智能胰島素泵,沒(méi)有嵌入式軟件就無(wú)法想象汽車(chē)和航空業(yè)。這份清單幾乎可以無(wú)限延續(xù)。隨著各種設(shè)備的重要性增加,在安全、安保和功能方面必須滿足的要求也在增加。安全標(biāo)準(zhǔn)將這一點(diǎn)考慮在內(nèi),并明確要求將測(cè)試覆蓋率記錄為產(chǎn)品驗(yàn)證的一部分。
特別是對(duì)于初學(xué)者來(lái)說(shuō),測(cè)量代碼覆蓋率似乎非常復(fù)雜和耗時(shí)。但是,如果您注意一些基本方面,事情很快就會(huì)變得容易。
1.設(shè)定期望
通常并不完全清楚對(duì)代碼覆蓋的期望。覆蓋率測(cè)量并非旨在直接改進(jìn)代碼。他們的目的是確定代碼是否經(jīng)過(guò)全面測(cè)試以及測(cè)試用例是否完整。因此,代碼覆蓋率更適合于改進(jìn)測(cè)試——并最終證明已經(jīng)執(zhí)行了足夠的測(cè)試。
2. 確定所需的測(cè)試覆蓋水平
有許多不同的測(cè)試覆蓋級(jí)別。可以說(shuō):測(cè)試覆蓋率越嚴(yán)格和詳細(xì),實(shí)現(xiàn)它所需的努力和成本就越大。
不幸的是,只有少數(shù)標(biāo)準(zhǔn),如航空領(lǐng)域的 DO-178C、電氣/電子、可編程電子安全相關(guān)系統(tǒng)的功能安全性 IEC 61508 或汽車(chē)領(lǐng)域的 ISO 26262,對(duì)所需的代碼覆蓋級(jí)別給出了具體指導(dǎo)。
根據(jù) IEC 61508 的安全完整性等級(jí) (SIL) 或 ISO 26262 的汽車(chē)安全等級(jí) (ASIL),需要語(yǔ)句覆蓋率、分支覆蓋率或 MC/DC(修改條件/決策覆蓋率)(有關(guān)代碼覆蓋率級(jí)別的更多信息,請(qǐng)參閱單獨(dú)解釋?zhuān)R韵逻m用于所有標(biāo)準(zhǔn):可能錯(cuò)誤的影響越危險(xiǎn),所需的覆蓋級(jí)別就越嚴(yán)格。
這可以從 ISO 26262 標(biāo)準(zhǔn)的下表中看出。最高安全等級(jí) ASIL D 需要最高覆蓋等級(jí) MC/DC。表中++代表強(qiáng)烈推薦,+代表推薦。在這里我們可以說(shuō)完整的修改條件/決策覆蓋自動(dòng)意味著完整的分支覆蓋,而完整的分支覆蓋自動(dòng)意味著完整的語(yǔ)句覆蓋。
圖 1:ISO 26262 表 12 – 軟件單元級(jí)別的結(jié)構(gòu)覆蓋度量(來(lái)源:國(guó)際標(biāo)準(zhǔn) ISO 26262-6)
對(duì)于沒(méi)有通過(guò)標(biāo)準(zhǔn)規(guī)定的軟件,提前確定哪些代碼需要根據(jù)哪些標(biāo)準(zhǔn)進(jìn)行測(cè)試也很重要。將上述標(biāo)準(zhǔn)用作指南并將測(cè)試范圍與系統(tǒng)的關(guān)鍵性保持一致可能會(huì)有所幫助。
三、測(cè)試范圍的確定
完整的代碼覆蓋率最初意味著已達(dá)到指定測(cè)試級(jí)別的 100%。然而,這通常只在安全關(guān)鍵區(qū)域是必要的。
僅僅為了滿足這個(gè)標(biāo)準(zhǔn)而瞄準(zhǔn) 100% 的代碼覆蓋率通常是沒(méi)有幫助的。重要的是要知道為什么要運(yùn)行某些測(cè)試用例。如果您不知道,那么重復(fù)測(cè)試一遍又一遍地運(yùn)行已經(jīng)測(cè)試過(guò)的代碼的風(fēng)險(xiǎn)很高。這種更高的努力并沒(méi)有得到回報(bào),因?yàn)檫@些額外的測(cè)試并沒(méi)有提供任何新的見(jiàn)解。順便說(shuō)一句,使用代碼覆蓋分析器是避免這種冗余測(cè)試的好方法。
在非關(guān)鍵應(yīng)用領(lǐng)域,測(cè)試既不應(yīng)該“太少”也不“完整”,而應(yīng)該“足夠”。
4. 確定支持的編程語(yǔ)言
有許多代碼覆蓋分析器:從免費(fèi)工具(例如 GNU 編譯器集合 (GCC) 的一部分 GNU Coverage Testing Tool Gcov)到全面的解決方案(例如Verifysoft Technology 的Testwell CTC++ ),它除了支持所有代碼覆蓋之外級(jí)別還支持各種語(yǔ)言。如果可能,公司使用的所有語(yǔ)言都應(yīng)該能夠使用單一的覆蓋工具進(jìn)行處理。這樣,開(kāi)發(fā)人員和測(cè)試人員可以在統(tǒng)一的界面中工作,而不必熟悉不同的工具。對(duì)于嵌入式軟件開(kāi)發(fā),該工具應(yīng)至少涵蓋 C、C++ 和 Java。
關(guān)于代碼覆蓋級(jí)別的進(jìn)一步說(shuō)明
功能覆蓋
函數(shù)覆蓋率測(cè)量是否調(diào)用了程序的所有函數(shù)。功能覆蓋率是通常測(cè)試覆蓋率級(jí)別中“最弱的”。由于它忽略了軟件的內(nèi)部工作,所以它的實(shí)用性很低。
聲明覆蓋范圍
語(yǔ)句覆蓋率決定了測(cè)試執(zhí)行了哪些語(yǔ)句。例如,這可以用于檢測(cè)死代碼。它還顯示測(cè)試是否適用于所有語(yǔ)句。
決策覆蓋/分支覆蓋
在此覆蓋級(jí)別上,每個(gè)決策必須至少測(cè)試一次為真,一次為假。對(duì)于普通的 if 語(yǔ)句,這對(duì)應(yīng)于分支覆蓋,其中每個(gè)分支都必須已執(zhí)行。
條件覆蓋
條件覆蓋詳細(xì)考慮復(fù)合決策。對(duì)于由通過(guò)布爾運(yùn)算符組成的多個(gè)原子條件組成的決策,必須將這些條件中的每一個(gè)單獨(dú)測(cè)試為“真”和“假”。
多條件覆蓋和修改條件/決策覆蓋 (MC/DC)
對(duì)于多條件覆蓋,必須檢查所有可能的真假組合以進(jìn)行復(fù)合決策。在一個(gè)決策中有多個(gè)條件的情況下,這需要大量幾乎不切實(shí)際的測(cè)試用例。因此,在實(shí)踐和標(biāo)準(zhǔn)中,修改的條件/決策覆蓋(MC/DC)是相關(guān)的,其中測(cè)試用例的數(shù)量減少了,而測(cè)試覆蓋的信息價(jià)值仍然足夠高。對(duì)于 MC/DC,使用復(fù)合條件的所有原子條件。對(duì)每一個(gè)原子條件測(cè)試一個(gè)測(cè)試用例對(duì),這會(huì)導(dǎo)致復(fù)合條件的整體結(jié)果發(fā)生變化,但只有考慮的原子條件的真值發(fā)生變化,而其他原子條件的真值必須保持不變持續(xù)的。
5.節(jié)省內(nèi)存空間
在小目標(biāo)上測(cè)量代碼覆蓋率時(shí),有限的內(nèi)存空間通常是一個(gè)障礙。原因是需要對(duì)代碼進(jìn)行檢測(cè):為了測(cè)量覆蓋率,代碼覆蓋率工具會(huì)在代碼中插入計(jì)數(shù)器。此外,必須在要測(cè)試的目標(biāo)上實(shí)現(xiàn)一個(gè)庫(kù),其中包括處理到主機(jī)的數(shù)據(jù)傳輸。
計(jì)數(shù)器通常作為全局?jǐn)?shù)組存儲(chǔ)在數(shù)據(jù)存儲(chǔ)器中。特別是對(duì)于尺寸非常緊湊的目標(biāo),這可能會(huì)導(dǎo)致問(wèn)題。
補(bǔ)救措施是專(zhuān)門(mén)用于嵌入式設(shè)備的代碼覆蓋率分析器。此類(lèi)工具盡可能少用。在檢測(cè)開(kāi)銷(xiāo)仍然很高的情況下,可以針對(duì)各個(gè)代碼部分單獨(dú)分析代碼覆蓋率。
第三種方法是減小計(jì)數(shù)器的大小。通常,計(jì)數(shù)器的大小為 32 位。特殊安排將計(jì)數(shù)器大小減少到 16 或 8 位。但是,必須注意避免溢出。覆蓋分析儀 Testwell CTC++ 的 bit-cov-measure 是針對(duì)小型嵌入式目標(biāo)和微處理器的特殊安排。
6. 檢查可能對(duì)處理器造成的影響
為了節(jié)省成本,很多嵌入式設(shè)備不僅內(nèi)存小,而且處理器也經(jīng)常有局限性。但是,儀器也會(huì)影響處理器。因此,可能會(huì)超出定義的時(shí)間,這可能會(huì)導(dǎo)致在某些情況下程序運(yùn)行錯(cuò)誤。
不幸的是,由于處理器負(fù)載略高,無(wú)法提前可靠地預(yù)測(cè)是否會(huì)出現(xiàn)問(wèn)題。可能的影響只會(huì)在相應(yīng)的項(xiàng)目中變得明顯。出于這個(gè)原因,還應(yīng)根據(jù)其對(duì)時(shí)序的影響來(lái)選擇代碼覆蓋分析器。如有必要,使用較小的計(jì)數(shù)器(如上所述)或部分儀器可以糾正這種情況。
也可以在覆蓋分析的情況下運(yùn)行一次測(cè)試,在沒(méi)有覆蓋分析的情況下運(yùn)行一次,以確定覆蓋分析是否導(dǎo)致程序行為的變化。
7.檢查集成到您的工具鏈中的可能性
越來(lái)越多的測(cè)試正在自動(dòng)化。這是有道理的,因?yàn)槿斯じ深A(yù)始終是潛在的錯(cuò)誤來(lái)源,也會(huì)導(dǎo)致巨大的成本。構(gòu)建系統(tǒng)測(cè)試的自動(dòng)化是必需的,尤其是在使用持續(xù)集成/持續(xù)部署 (CI/CD) 的敏捷開(kāi)發(fā)中。但是,這要求使用的代碼覆蓋分析器可以集成到工具鏈和構(gòu)建系統(tǒng)中。此外,覆蓋工具也應(yīng)該獨(dú)立于所使用的編譯器。
尤其是在大型開(kāi)發(fā)項(xiàng)目中,自動(dòng)化測(cè)試和代碼覆蓋率的自動(dòng)捕獲是不可缺少的。因此,重要的是代碼覆蓋工具可以輕松順利地集成到工具鏈中。另一方面,復(fù)雜的儀表板和前端對(duì)于自動(dòng)化測(cè)試來(lái)說(shuō)是微不足道的。
8. 驗(yàn)證報(bào)告的可理解性
代碼覆蓋會(huì)產(chǎn)生大量數(shù)據(jù)。每個(gè)測(cè)試領(lǐng)域——單元測(cè)試、模塊測(cè)試、功能測(cè)試等——都提供了自己的代碼覆蓋率數(shù)據(jù)。為了獲得完整的圖片,應(yīng)該匯總這些信息。由代碼覆蓋率分析器以有意義且可解釋的方式準(zhǔn)備此信息。
此外,這些數(shù)據(jù)在可能需要的認(rèn)證或?qū)徍朔矫嬉埠苤匾?/p>
重要的是,覆蓋工具提供的信息既可以用于進(jìn)一步自動(dòng)處理的機(jī)器可讀形式(例如 XML),也可以以人類(lèi)可讀的形式(例如 HTML)提供,以便快速和良好地概覽。
圖 2:代碼覆蓋率分析器 Testwell CTC++ 的 HTML 報(bào)告(函數(shù)摘要)一目了然地顯示了測(cè)試覆蓋了哪些函數(shù)。完全覆蓋的功能以藍(lán)色顯示。對(duì)于以紅色顯示的功能,覆蓋率低于 100%。例如,函數(shù)“l(fā)ights()”具有 75% 的多條件覆蓋率和 83% 的語(yǔ)句覆蓋率(TER 代表“測(cè)試有效性比率”)。(來(lái)源:Verifysoft Technology)
圖 3:Testwell CTC++ 的執(zhí)行配置文件顯示了源代碼中涵蓋項(xiàng)目的詳細(xì)信息。(來(lái)源:Verifysoft Technology)
9. 檢查代碼覆蓋工具是否適合開(kāi)發(fā)安全關(guān)鍵型軟件
對(duì)于安全關(guān)鍵型軟件的開(kāi)發(fā),不言而喻,代碼覆蓋工具必須支持相應(yīng)標(biāo)準(zhǔn)要求的覆蓋水平。
此外,標(biāo)準(zhǔn)要求對(duì)整個(gè)工具鏈進(jìn)行鑒定。用于代碼覆蓋分析器的工具鑒定工具包的可用性大大簡(jiǎn)化了這項(xiàng)工作。在這種情況下,工具提供商是否在此提供適當(dāng)?shù)慕ㄗh也很重要。
結(jié)論
測(cè)量代碼覆蓋率并非易事,但也不是太復(fù)雜。因此,幾乎沒(méi)有任何充分的理由放棄代碼覆蓋——即使在非關(guān)鍵領(lǐng)域也是如此。測(cè)試覆蓋率在多個(gè)層面上有所幫助:可以優(yōu)化測(cè)試和測(cè)試程序,從而帶來(lái)顯著的成本和時(shí)間優(yōu)勢(shì)。此外,代碼覆蓋率確保產(chǎn)品已經(jīng)過(guò)充分測(cè)試,并以一定的最低質(zhì)量到達(dá)客戶手中。
嵌入式系統(tǒng)供應(yīng)商不應(yīng)該重蹈 IT 行業(yè)的覆轍:交付在客戶現(xiàn)場(chǎng)成熟的“香蕉軟件”。嵌入式設(shè)備的用戶不會(huì)接受這一點(diǎn)——尤其是當(dāng)涉及“關(guān)鍵”產(chǎn)品時(shí),例如汽車(chē)行業(yè)的醫(yī)療設(shè)備或 ECU。
審核編輯 黃昊宇
-
分析器
+關(guān)注
關(guān)注
0文章
93瀏覽量
12557 -
代碼
+關(guān)注
關(guān)注
30文章
4827瀏覽量
69055 -
代碼覆蓋率
+關(guān)注
關(guān)注
0文章
4瀏覽量
6849
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論