翻譯|行業資訊|編輯:李顯亮|2021-04-19 14:01:35.497|閱讀 265 次
概述:許多軟件開發和驗證工程師并不真正理解為什么獲得結構覆蓋很重要。許多人這樣做只是因為這是他們行業的功能標準所要求的,而不是認真對待。讓我們來看看什么是結構性覆蓋,以及它為什么重要的更多原因。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
許多軟件開發和驗證工程師并不真正理解為什么獲得結構覆蓋很重要。許多人這樣做只是因為這是他們行業的功能標準所要求的,而不是認真對待。
像ADAS這樣的安全關鍵系統可以在沒有司機的情況下運送乘客,使自動駕駛儀能夠讓人們在我們的天空中飛行,并通過醫療設備讓病人活著。人們的生活依賴于這些系統。獲得結構代碼覆蓋率至關重要。讓我們來看看什么是結構性覆蓋,以及它為什么重要的更多原因。
簡而言之,結構覆蓋是為了確定系統是否經過充分測試而執行和記錄的代碼的標識。安全關鍵系統覆蓋的徹底性取決于安全完整性等級(SIL)、汽車工業中的ASIL和航空電子設備中常用的開發保證等級(DAL)。
在嵌入式系統中,這些通常被分解到代碼語句、分支、修改的條件決定,你還可以鉆研到更細的粒度,比如對象代碼或匯編語言。
你可能會聽到或讀到其他類型的覆蓋指標,比如函數、調用、循環、條件、跳轉、決策等。但對于嵌入式安全關鍵型系統來說,你目前需要了解的是語句、分支、MC/DC和對象代碼。
目前有一種趨勢是采用多條件覆蓋(MCC),它比MC/DC更徹底。MCC要求的測試用例數量要多得多-2,達到條件數的冪。其計算公式為 2C
語句覆蓋是最簡單的工作,代表了程序中的每一行代碼。然而,代碼語句可以有不同程度的復雜性。例如,分支語句表示代碼中的if then else條件。case或switch等語句被解釋為分支。不過,如果你要獲得分支的覆蓋率,這意味著必須覆蓋真和假決策路徑的執行。
在關注更高的安全水平時,可能需要修改后的條件決定覆蓋范圍(MC/DC)。分支的復雜程度會越來越高,在一個決策中存在多個條件,而且每個條件都必須獨立測試。
語句覆蓋是最簡單的工作,代表了程序中的每一行代碼。然而,代碼語句可以有不同程度的復雜性。例如,分支語句表示代碼中的if then else條件。case或switch等語句被解釋為分支。不過,如果你要獲得分支的覆蓋率,這意味著必須覆蓋真和假決策路徑的執行。
對于覆蓋標準來說,這意味著決策中的每個條件都已被證明會獨立影響該決策的結果。
同時,程序中的每一個決策中的條件都至少采取了一次所有可能的結果,程序中的每一個決策都至少采取了一次所有可能的結果。在下面有4個條件語句的例子中,有16個可能的測試用例。MC/DC在這個例子中只需要5個。取條件數加1。
對于最嚴格的安全關鍵型應用,如航空電子,工藝標準DO-178B/C Level A規定了對象代碼覆蓋。這是由于編譯器或鏈接器會產生額外的代碼,這些代碼不能直接追溯到源代碼語句。因此,必須進行匯編級覆蓋。
想象一下,必須執行這項任務的嚴謹性和人力成本。幸運的是,有Parasoft ASMTools,一個關于獲得對象代碼覆蓋的自動化解決方案。
代碼覆蓋率往往是通過對代碼進行檢測來確定的。檢測指的是在用戶代碼中加入額外的代碼,以便在執行過程中確定該語句、分支或MC/CD是否被執行。
基于嵌入式目標或設備,覆蓋數據可以存儲在文件系統中,寫入內存,或通過各種通信渠道,如串行端口、TCP/IP端口、USB甚至JTAG發送出去。
對于代碼覆蓋率的要求,比如規定的100%的結構、分支和MC/DC覆蓋率,或者是可選的、個人想要的80%,有幾種測試方法用來滿足你的目標。最常見的方法。
綜合這些不同做法的覆蓋率指標是典型的。但代碼覆蓋率究竟如何確定呢?
通過系統測試獲得代碼覆蓋率是一個很好的方法,可以確定是否已經進行了足夠的測試。方法是運行所有的系統測試,然后檢查代碼中哪些部分沒有被行使。
未執行的代碼意味著可能需要新的測試用例來行使未被觸及的代碼,在這些代碼中可能潛伏著缺陷,并有助于回答這樣一個問題:我是否做了足夠的測試?
當我在系統測試期間進行過代碼覆蓋率的測試時,平均得出的指標是60%的覆蓋率。40%的未執行代碼中的大部分是由于你的應用程序中的防御性代碼。
還有你的編碼準則規定的防御性代碼,系統測試永遠無法執行。由于這些原因,系統測試不能帶你達到100%的結構代碼覆蓋率。你需要采用其他的測試方法,如手動和/或單元測試來讓你達到100%。要知道,流程標準允許合并從各種測試方法獲得的覆蓋率指標。
如前所述,單元測試可以作為系統測試的補充方法,以獲得100%的覆蓋率。通過單元測試獲得代碼覆蓋率是比較流行的方法之一,但它并不能暴露你是否對系統做了足夠的測試,因為重點是在單元級(函數/程序)。
這里的目標是創建一組單元測試用例,在所需的覆蓋率合規性需求(語句、分支和MC/DC)下行使整個單元,以達到該單個單元100%的覆蓋率。每一個單元都要重復這樣做,直到覆蓋整個代碼庫。然而,要想從單元測試中獲得最大的收益,不要只關注獲得代碼覆蓋率。
為了幫助通過單元測試加快代碼覆蓋率,Parasoft C/C++test中存在可配置的自動測試用例生成功能。測試用例可以自動生成,以測試空指針、最小-中間-最大范圍、邊界值等的使用。這種自動化可以讓你走得更遠。在幾分鐘內,你將獲得大量的代碼覆蓋率。
然而,與系統測試一樣,由于使用防御性代碼或形式化語言語義,獲得100%的代碼覆蓋率是難以實現的。在單元的顆粒級別上,防御性代碼可能以開關中的默認語句的形式出現。如果一個開關中的每一個可能的情況都被捕獲,這就使得缺省語句無法到達。
那么,對于這些特殊情況,如何才能獲得100%的保障呢?
答案是需要部署手動方法。用戶可以通過使用調試器,修改調用棧,執行return 0;語句,將該語句標注或標注為覆蓋。目視見證執行過程,至少要記錄現在被認為是覆蓋的文件名、代碼行和代碼語句。
這種通過手動/視覺檢查和報告執行的覆蓋可以用來補充通過單元測試捕獲的覆蓋。這兩種覆蓋報告的補充可以用來證明100%的結構代碼覆蓋。
如果系統測試覆蓋發生了,并且要包括在內,則可以使用所有三個覆蓋報告(系統、單元、手動)來顯示和證明100%的覆蓋率和合規性。
當標準基于您的SIL、ASIL或DAL級別時,可能需要執行不同級別的覆蓋(聲明、分支、MC/DC和目標代碼)。幸運的是,Parasoft提供了自動化的軟件測試解決方案,以及您在獲得100%結構代碼覆蓋率時需要解決的方法。
了解如何為您的嵌入式項目利用代碼分析技術。請點擊下方圖片觀看視頻。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn