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