高安全領(lǐng)域?qū)﹄娮赢a(chǎn)品的安全性分析提出了具體的要求。作為運(yùn)行在高安全系統(tǒng)中的軟件,必須在測(cè)試過(guò)程中進(jìn)行代碼覆蓋率分析,通常要求MC/DC覆蓋率達(dá)到100%。本文分析了常用單元測(cè)試軟件對(duì)C語(yǔ)言開發(fā)的嵌入式項(xiàng)目進(jìn)行自動(dòng)化單元測(cè)試的覆蓋率情況,通過(guò)比較得出單元測(cè)試的最優(yōu)解決方案。
隨著工業(yè)互聯(lián)網(wǎng)技術(shù)的發(fā)展,嵌入式系統(tǒng)的應(yīng)用越來(lái)越廣。嵌入式軟件單元測(cè)試成為嵌入式系統(tǒng)功能安全測(cè)試的一項(xiàng)重要工作。通過(guò)單元測(cè)試往往能夠發(fā)現(xiàn)代碼中潛在的邏輯缺陷及隱藏的運(yùn)行錯(cuò)誤。高安全領(lǐng)域,如航天、軌道交通、核電等行業(yè)對(duì)產(chǎn)品的安全性有更高的要求。運(yùn)行在高安全系統(tǒng)中的軟件,在測(cè)試過(guò)程中必須進(jìn)行代碼覆蓋率分析,MC/DC覆蓋率一般要求達(dá)到100%。
從軟件代碼覆蓋率可以詳細(xì)了解被測(cè)代碼的測(cè)試覆蓋情況,通過(guò)分析明確如何補(bǔ)充測(cè)試用例去驗(yàn)證未執(zhí)行的代碼;或者找出代碼未被執(zhí)行的原因,幫助發(fā)現(xiàn)程序中的潛在缺陷,提高軟件質(zhì)量。
為了大幅提高測(cè)試人員的工作效率,保障軟件測(cè)試質(zhì)量,并且將測(cè)試人員從繁重的用例編寫任務(wù)中解脫出來(lái),很多單元測(cè)試工具能夠自動(dòng)生成滿足語(yǔ)句、分支、MC/DC準(zhǔn)則的測(cè)試用例,本文對(duì)幾個(gè)常用單元測(cè)試軟件Testbed、Cantata、SmartUnit的單元測(cè)試覆蓋率情況進(jìn)行了分析。
Testbed、Cantata、SmartUnit是目前嵌入式領(lǐng)域常用的單元測(cè)試軟件,它們都通過(guò)了國(guó)際上功能安全認(rèn)證,符合IEC 61508-3∶2010(工業(yè)通用)、EN 50128∶2011(軌道交通)、ISO 26262-8∶2018(汽車電子)等行業(yè)功能安全標(biāo)準(zhǔn)對(duì)單元測(cè)試工具的要求。
Testbed軟件測(cè)試工具功能較強(qiáng)大,適用于嵌入式軟件靜態(tài)分析及單元測(cè)試,較廣泛地應(yīng)用于國(guó)內(nèi)各大研究機(jī)構(gòu)、軟件測(cè)試部門。
Testbed可以自動(dòng)生成測(cè)試驅(qū)動(dòng),在代碼更新后能對(duì)需要修改的測(cè)試數(shù)據(jù)進(jìn)行跟蹤和報(bào)告,便于回歸測(cè)試。工具提供圖形界面和命令行兩種操作方式,支持文本和圖形化方式查看代碼覆蓋率;有助于測(cè)試結(jié)果的分析和白盒測(cè)試用例設(shè)計(jì)。
通過(guò)Testbed可實(shí)現(xiàn)自動(dòng)化單元測(cè)試,提高單元測(cè)試效率。它能夠提供包括語(yǔ)句、分支、調(diào)用、MC/DC、測(cè)試路徑(LCSAJ)、目標(biāo)碼等覆蓋率指標(biāo),滿足不同安全等級(jí)軟件的覆蓋率要求。
Cantata提供基于Eclipse的完整測(cè)試開發(fā)環(huán)境,可以對(duì)C/C++代碼進(jìn)行單元和集成測(cè)試,自動(dòng)生成用例、測(cè)試執(zhí)行后對(duì)測(cè)試結(jié)果進(jìn)行評(píng)估并生成測(cè)試報(bào)告等。
Cantata可以自動(dòng)生成調(diào)用接口控制(Stubs、Isolates和Wrappers)測(cè)試腳本,用戶可以通過(guò)圖形界面設(shè)定變量和返回值的期望值,或者直接編輯測(cè)試腳本,即可運(yùn)行測(cè)試。測(cè)試腳本管理器可以實(shí)現(xiàn)腳本的復(fù)用。
Cantata可以自動(dòng)生成測(cè)試用例的驅(qū)動(dòng)函數(shù)和樁函數(shù),自動(dòng)判定實(shí)際結(jié)果是否和期望結(jié)果一致。工具能記錄測(cè)試過(guò)程并輸出到文件,包括全局變量、參數(shù)和返回值、函數(shù)調(diào)用順序等詳細(xì)信息,通過(guò)分析這些信息可以對(duì)失敗的用例進(jìn)行準(zhǔn)確的定位,進(jìn)而找到測(cè)試失敗的根本原因。
可通過(guò)Stubs/Isolates模擬或通過(guò)Wrapper真實(shí)調(diào)用來(lái)實(shí)現(xiàn)任意調(diào)用(編譯單元邊界內(nèi)或邊界外),自動(dòng)檢查調(diào)用接口的參數(shù)/返回值,驗(yàn)證真實(shí)調(diào)用順序或時(shí)間是否匹配。使得測(cè)試更加充分靈活,將被測(cè)單元從系統(tǒng)中完全獨(dú)立出來(lái),實(shí)現(xiàn)對(duì)函數(shù)的完全控制。
Cantata支持函數(shù)入口點(diǎn)、語(yǔ)句、調(diào)用返回、判定、條件和MC/DC覆蓋等。
SmartUnit工具是依托國(guó)家可信嵌入式軟件工程技術(shù)研究中心所研發(fā)的一款智能化單元測(cè)試工具,根據(jù)需要能對(duì)C語(yǔ)言自動(dòng)生成滿足分支、語(yǔ)句、邊界及 MC/DC覆蓋準(zhǔn)則的測(cè)試用例,實(shí)現(xiàn)全自動(dòng)化單元測(cè)試。
SmartUnit采用人工智能算法,利用自動(dòng)推理與符號(hào)執(zhí)行技術(shù),分析程序路徑,生成測(cè)試用例并執(zhí)行測(cè)試。SmartUnit 分析的數(shù)據(jù)包含了被測(cè)函數(shù)形參、全局變量、樁函數(shù)以及樁函數(shù)形參等數(shù)據(jù),全面涵蓋了單元測(cè)試的用例數(shù)據(jù)。
在某嵌入式實(shí)時(shí)操作系統(tǒng)功能安全認(rèn)證項(xiàng)目中,分別采用Testbed、Cantata和SmartUnit工具對(duì)被測(cè)操作系統(tǒng)的源碼進(jìn)行單元測(cè)試,并獲取代碼覆蓋情況。
根據(jù)測(cè)試計(jì)劃,單元測(cè)試運(yùn)行在工具安裝平臺(tái),使用工具自帶的編譯器完成代碼的編譯運(yùn)行,如表1所示。
表1 測(cè)試環(huán)境Tab.1 Test environment
各工具使用的編譯器的版本不一致,但對(duì)測(cè)試過(guò)程中單元測(cè)試代碼語(yǔ)句覆蓋情況統(tǒng)計(jì)并無(wú)明顯影響。
不管使用什么工具,單元測(cè)試中代碼的覆蓋率都取決于測(cè)試用例的設(shè)計(jì)。為了達(dá)到MC/DC100%覆蓋要求,測(cè)試人員需要對(duì)分析代碼結(jié)構(gòu),設(shè)計(jì)不同等價(jià)類的輸入?yún)?shù)組合,以實(shí)現(xiàn)各條路徑及分支的覆蓋,最終使得所有用例的組合覆蓋率盡可能達(dá)到MC/DC100%覆蓋,滿足測(cè)試要求。
雖然在安全軟件中不建議指針的使用,但由于操作系統(tǒng)軟件的特殊性,指針的使用難以避免,被測(cè)源碼中存在大量結(jié)構(gòu)體及指針,如果人工直接分析代碼設(shè)計(jì)用例,效率很低。單元測(cè)試工具的自動(dòng)用例生成功能對(duì)提高測(cè)試效率有著極大的幫助。
項(xiàng)目部分源碼使用不同工具自動(dòng)生成單元測(cè)試用例執(zhí)行后所得到的覆蓋率的對(duì)比情況見圖1。
圖1 單元測(cè)試用例執(zhí)行覆蓋率統(tǒng)計(jì)Fig.1 Unit test case execution coverage statistics
Testbed工具的Extrme test功能能夠自動(dòng)生成測(cè)試用例,但所生成的用例主要是針對(duì)邊界值及異常測(cè)試,對(duì)于MC/DC覆蓋率并沒(méi)有太大作用。SmartUnit 和Cantata軟件自動(dòng)生成的單元測(cè)試用例MC/DC覆蓋率較好。經(jīng)過(guò)數(shù)據(jù)對(duì)比發(fā)現(xiàn)Cantata工具自動(dòng)生成用例的覆蓋率表現(xiàn)最佳,SmartUnit軟件所生成用例的覆蓋率優(yōu)于Testbed工具,但該軟件對(duì)被測(cè)代碼的部分語(yǔ)法支持并不完善??紤]項(xiàng)目執(zhí)行效率,最終選定Cantata工具作為項(xiàng)目單元測(cè)試工具。
2.3.1 自動(dòng)生成用例失敗的解決
在使用Cantata工具執(zhí)行單元測(cè)試過(guò)程中,工具在對(duì)部分源碼生成測(cè)試用例時(shí)會(huì)進(jìn)入無(wú)響應(yīng)狀態(tài),等待很長(zhǎng)時(shí)間也無(wú)法得到生成結(jié)果。如:semaphore_create函數(shù)。經(jīng)分析,發(fā)現(xiàn)是因?yàn)楣ぞ邔?duì)特定語(yǔ)法的支持不完善。經(jīng)過(guò)反復(fù)試驗(yàn),得到如下解決方案:
(1)修改源代碼,通過(guò)定義全局變量,先生成測(cè)試腳本。
(2)后續(xù)按正常步驟生成測(cè)試腳本,根據(jù)測(cè)試需要對(duì)測(cè)試腳本進(jìn)行修改。
(3)將源代碼復(fù)原,然后再運(yùn)行測(cè)試腳本。
2.3.2 生成用例運(yùn)行結(jié)果失敗的解決
工具自動(dòng)生成的用例有可能出現(xiàn)樁函數(shù)預(yù)期返回值與實(shí)際結(jié)果不符的情況,從而導(dǎo)致用例運(yùn)行結(jié)果為不通過(guò)。此時(shí)可以修改該樁代碼實(shí)例,指定正確的預(yù)期返回值結(jié)果,與期望結(jié)果匹配。
經(jīng)過(guò)項(xiàng)目實(shí)踐,得出如下結(jié)果:
(1)Testbed、Cantata、SmartUnit三個(gè)工具對(duì)嵌入式C軟件代碼覆蓋率測(cè)試都可以提供充分的支持。工具自動(dòng)化測(cè)試用例生成后再通過(guò)人工補(bǔ)充用例設(shè)計(jì),最終軟件代碼覆蓋率均能達(dá)到MC/DC100%覆蓋要求(部分軟件代碼由于設(shè)計(jì)缺陷,存在不可達(dá)路徑,測(cè)試執(zhí)行中不可能得到MC/DC100%的結(jié)果,對(duì)此類代碼應(yīng)采用人工走查方式進(jìn)行分析說(shuō)明)。
(2)通過(guò)對(duì)比各工具自動(dòng)生成用例的執(zhí)行結(jié)果,目前版本下Cantata工具單元測(cè)試自動(dòng)生成用例執(zhí)行結(jié)果的MC/DC覆蓋率較高。作為國(guó)產(chǎn)研制的嵌入式軟件單元測(cè)試工具,SmartUnit的單元測(cè)試用例MC/DC覆蓋率結(jié)果與Cantata相差不大,但對(duì)被測(cè)代碼的語(yǔ)法支持能力稍差,建議作為項(xiàng)目的備選方案。
(3)各工具版本都在不斷更新,新版本發(fā)布后需要重新進(jìn)行工具的對(duì)比研究。