前言
許多軟件開發(fā)和驗證工程師其實(shí)并不能真正理解獲得結(jié)構(gòu)覆蓋率的重要性。大部分人這么做只是因為這是他們行業(yè)的功能標(biāo)準(zhǔn)所要求的,而并沒有真正認(rèn)真對待它。
像ADAS這樣的安全關(guān)鍵系統(tǒng)能夠?qū)崿F(xiàn)在沒有司機(jī)的情況下運(yùn)送乘客、能夠讓自動駕駛飛行器能夠在天空中飛行、通過醫(yī)療設(shè)備維持患者的生命。人們的生命依賴于這些系統(tǒng)。因此,獲得結(jié)構(gòu)化代碼覆蓋率是至關(guān)重要的。接下來讓我們來看看什么是結(jié)構(gòu)覆蓋率,以及它重要的更多原因。
什么是結(jié)構(gòu)覆蓋率
簡而言之,結(jié)構(gòu)覆蓋率是為了確定系統(tǒng)是否經(jīng)過充分測試而對已執(zhí)行和記錄的代碼的標(biāo)識。安全關(guān)鍵系統(tǒng)覆蓋率的徹底性取決于安全完整性級別(SIL)、汽車工業(yè)中的ASIL和航空電子設(shè)備中常用的開發(fā)保證級別(DAL)。
所謂徹底性,指的是代碼中的結(jié)構(gòu)元素。在嵌入式系統(tǒng)中,這些通常被細(xì)分為代碼語句、分支、修改的條件決策,此外還可以深入到更細(xì)的粒度級別,如目標(biāo)代碼或匯編語言。
語句及分支覆蓋率
語句覆蓋是最簡單的工作,它表示程序中的每一行代碼。然而,代碼語句可能具有不同程度的復(fù)雜性。例如,分支語句在代碼中表示if then else條件,像case或switch這樣的語句被解釋為分支。但是,如果您要獲得分支的覆蓋率,這意味著必須同時覆蓋真實(shí)和錯誤決策路徑的執(zhí)行。
如果需要考慮更高的安全級別,則可能需要修改條件/決策覆蓋率(MC/DC)。分支的復(fù)雜性可能會逐步遞增,其中一個決策中有多個條件,而每個條件都必須獨(dú)立測試。
對于覆蓋率標(biāo)準(zhǔn),這意味著決策中的每個條件都已被證明能夠獨(dú)立地影響該決策的結(jié)果。真值表可用于幫助進(jìn)行分析,如下圖所示。
此外,程序中決策的每個條件都至少采用了一次所有可能的結(jié)果,程序中的每個決策至少一次采用了所有可能的結(jié)果。
在下面包含4個條件語句的示例中,有16個可能的測試用例。在本例中,MC/DC只需要5個。取條件的數(shù)量并添加1。
公式:(C + 1)
目標(biāo)代碼覆蓋率
對于最嚴(yán)格的安全關(guān)鍵應(yīng)用,如航空電子設(shè)備,流程標(biāo)準(zhǔn)DO-178B/C Level A要求目標(biāo)代碼覆蓋率。這是由于編譯器或鏈接器會產(chǎn)生額外的代碼,這些代碼不能直接追蹤到源代碼語句。因此,必須進(jìn)行匯編級覆蓋。
想象一下執(zhí)行這項任務(wù)的嚴(yán)格程度和人工成本。幸運(yùn)的是,有Parasoft ASMTools這樣一個獲得目標(biāo)代碼覆蓋率的自動化解決方案。
(Parasoft ASMTools匯編語言代碼覆蓋)
獲取代碼覆蓋率
代碼覆蓋率通常是通過對代碼進(jìn)行檢測來確定的。工具化是指在用戶代碼中添加額外的代碼,以便在執(zhí)行期間確定該語句、分支或MC/CD是否已被執(zhí)行。
根據(jù)嵌入式目標(biāo)或設(shè)備的不同,覆蓋數(shù)據(jù)可以存儲在文件系統(tǒng)中,也可以寫入內(nèi)存,也可以通過串口、TCP/IP端口、USB甚至JTAG等各種通信通道發(fā)送出去。
部分插樁
值得注意的是,代碼插樁會導(dǎo)致代碼膨脹,代碼大小的增加可能會影響將代碼加載到內(nèi)存受限的目標(biāo)硬件上進(jìn)行測試的能力。
其解決方法是對部分代碼進(jìn)行插樁。
運(yùn)行您的測試并獲取覆蓋率。
對另一部分代碼進(jìn)行插樁
再次執(zhí)行測試
獲取覆蓋率。
合并以往測試執(zhí)行的覆蓋率。
根據(jù)您的目標(biāo)限制,理想狀態(tài)是不會有太多的插樁分區(qū)要處理。不停重復(fù)運(yùn)行相同的測試會非常耗時及花費(fèi)成本。簡單來說,插樁也許還會導(dǎo)致有關(guān)不良的時間和性能影響。
獲得嵌入式功能及信息安全關(guān)鍵系統(tǒng)的代碼覆蓋率
讓我們深入了解一下組織如何獲得嵌入式功能及信息安全關(guān)鍵系統(tǒng)獲得代碼覆蓋率。
對于代碼覆蓋率需求,比如強(qiáng)制的100%結(jié)構(gòu)、分支和MC/DC覆蓋率,有幾種測試方法可以用來滿足您的目標(biāo)。以下為最常見的方法:
系統(tǒng)測試
單元測試
手動測試
結(jié)合這些不同實(shí)踐的覆蓋率指標(biāo)是典型的。
系統(tǒng)測試覆蓋率
通過系統(tǒng)測試獲得代碼覆蓋率是確定是否執(zhí)行了足夠測試的最佳方法。其方法是運(yùn)行所有的系統(tǒng)測試,然后檢查代碼的哪些部分沒有執(zhí)行。
未執(zhí)行的代碼意味著可能需要新的測試用例來執(zhí)行可能潛伏著缺陷的未觸及代碼,并有助于確認(rèn)以下問題:我們是否做了足夠的測試?
單元測試覆蓋率
如前所述,單元測試可以作為系統(tǒng)測試的補(bǔ)充方法,以獲得100%的覆蓋率。通過單元測試獲得代碼覆蓋率是一種比較流行的方法,但是它并不能暴露您是否對系統(tǒng)進(jìn)行了足夠的測試,因為重點(diǎn)是在單元級別(函數(shù)/過程)。
這里的目標(biāo)是創(chuàng)建一組單元測試用例,在所需的覆蓋率遵從性需求(語句、分支和MC/DC)下執(zhí)行整個單元,以便達(dá)到單個單元的100%覆蓋率。每個單元都要重復(fù)做,直到覆蓋整個代碼庫。然而,要充分利用單元測試,不能只關(guān)注獲得代碼覆蓋率。這通??梢酝ㄟ^行路徑測試用例來完成。
為了通過單元測試加速代碼覆蓋,Parasoft C/ C++test中存在可配置的和自動化的測試用例生成功能??梢宰詣由蓽y試用例來測試空指針、最小-中-最大值范圍、邊界值的使用等。這種自動化可以讓您走得更遠(yuǎn),在幾分鐘內(nèi),您將獲得大量的代碼覆蓋率。
然而,與系統(tǒng)測試一樣,由于使用了防御性代碼或形式語言語義,獲得100%的代碼覆蓋率是難以實(shí)現(xiàn)的。在單元的粒度級別上,防御代碼可能以交換機(jī)中的默認(rèn)語句的形式出現(xiàn)。如果捕獲了交換機(jī)中所有可能的情況,則會導(dǎo)致無法訪問默認(rèn)語句。在下面的例子中,返回0;將永遠(yuǎn)不會被執(zhí)行,因為while(1)是無限的。
用戶可以使用調(diào)試器對語句進(jìn)行標(biāo)記或標(biāo)記,修改調(diào)用堆棧并執(zhí)行返回0;聲明。視覺上見證執(zhí)行過程,至少記錄文件名、代碼行和代碼語句。
通過手動/可視化檢查執(zhí)行的覆蓋率和報告可以用來補(bǔ)充通過單元測試捕獲的覆蓋率。兩個覆蓋率報告的添加可以用來證明100%的結(jié)構(gòu)代碼覆蓋率。
(Parasoft DTP儀表板代碼覆蓋報告示例)
總結(jié)
結(jié)構(gòu)代碼覆蓋率可以幫助回答以下問題:我是否進(jìn)行了足夠的測試?
它也可能是您必須滿足的遵從性需求。獲得代碼覆蓋率的目標(biāo)是幫助我們確保代碼功能安全、信息安全和可靠性的一種附加手段。它顯示已執(zhí)行測試的證據(jù)。通過該測試我們能夠識別和修復(fù)缺陷。
您可能需要執(zhí)行不同級別的覆蓋(語句、分支、MC/DC等覆蓋率),其中所用標(biāo)準(zhǔn)是基于您的SIL、ASIL或DAL級別。幸運(yùn)的是,Parasoft提供了自動化軟件測試解決方案和為了獲得100%的結(jié)構(gòu)代碼覆蓋率而所需的解決方法。
審核編輯:湯梓紅
-
匯編語言
+關(guān)注
關(guān)注
14文章
409瀏覽量
35793 -
代碼
+關(guān)注
關(guān)注
30文章
4779瀏覽量
68521 -
結(jié)構(gòu)化
+關(guān)注
關(guān)注
0文章
27瀏覽量
10308 -
覆蓋率
+關(guān)注
關(guān)注
0文章
7瀏覽量
6864
原文標(biāo)題:如何獲得100%的安全關(guān)鍵系統(tǒng)結(jié)構(gòu)代碼覆蓋率
文章出處:【微信號:麥克泰技術(shù),微信公眾號:麥克泰技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論