王斌 趙連杰 王宏愿
摘要:隨著軟件的廣泛應(yīng)用,在追求滿足越來越復(fù)雜的邏輯功能的同時也在追求高安全、高可靠的軟件。傳統(tǒng)的軟件單元測試,測試工作量巨大,需要耗費大量的人力、物力,發(fā)現(xiàn)缺陷的嚴重等級與數(shù)量與測試投入不成正比。故本文,研究并設(shè)計嵌入式軟件單元的自動化測試工具,解決源碼解析、靜態(tài)分析、控制流分析的自動化執(zhí)行與測試,并進行缺陷追溯與信息統(tǒng)計,形成軟件單元測試的閉環(huán)。
最后針對此工具進行外部接口的開發(fā),可實現(xiàn)與Jenkins等主流工具的持續(xù)集成,真正實現(xiàn)源代碼上傳即可觸發(fā)軟件單元測試的自動化流程。
關(guān)鍵詞:嵌入式;自動化;單元測試;jenkins
1研究背景
本研究主要是基于當前軌道交通裝備技術(shù)的高速發(fā)展,軟件發(fā)展的規(guī)模不斷增大,軟件迭代研發(fā)周期要求越來越短,測試壓力越來越大;軟件單元測試在軟件測試周期中的所占用的測試時間,測試人員,擁有非常大的比重;幾乎每個項目的軟件單元測試的測試需求一致,導(dǎo)致產(chǎn)生大量的重復(fù)性工作量,嚴重延長項目的研發(fā)生產(chǎn)周期。故基于現(xiàn)狀進行深化研究,計劃開發(fā)嵌入式軟件單元自動化測試工具,以實現(xiàn)自源代碼上傳之后可以自動化執(zhí)行軟件單元測試的愿景。
2核心技術(shù)設(shè)計方案
2.1軟件單元自動化測試工具架構(gòu)設(shè)計
此軟件單元自動化測試工具的架構(gòu)設(shè)計如圖1架構(gòu)設(shè)計圖所示
2.2源碼解析
此工具首先解析用戶上傳的源碼庫、編譯依賴庫。在仿真環(huán)境下,將源代碼和編譯依賴進行打包,統(tǒng)一進行編譯鏈接。若編譯失敗,則需要不斷補充編譯依賴庫,使得源碼本身對編譯環(huán)境依賴的頭文件等都導(dǎo)入到系統(tǒng)中。這樣,源碼可不依賴于原有的編譯器和編譯環(huán)境,可實現(xiàn)直接可在工具內(nèi)編譯執(zhí)行。
2.3靜態(tài)分析
此工具對源碼進行解析后,先對待測單元進行度量分析。從三個方向進行度量分析,分別:圈復(fù)雜度分析、注釋率分析、扇入扇出分析。首先對待測單元進行控制流的分析,通過控制流圖的程序流程進行圈復(fù)雜度的分析及統(tǒng)計。其次對待測單元的總行數(shù)、代碼行數(shù)、注釋行數(shù)進行統(tǒng)計,并計算注釋率。最后對待測單元的調(diào)用情況進行數(shù)據(jù)統(tǒng)計,計算統(tǒng)計出待測單元的扇入扇出數(shù)。
工具設(shè)計需具備高效易用的編碼規(guī)則檢查功能模塊,集成了包括MISRA C/C++2012、GJB8114等規(guī)則集中的重要規(guī)則,同時支持自定義規(guī)則集導(dǎo)入。源代碼進入規(guī)則集檢查器,規(guī)則集檢查器運行每條規(guī)則的算法,對代碼進行遍歷檢查。通過的代碼,進行代碼遞增和規(guī)則遞增;未通過的規(guī)則進行缺陷統(tǒng)計和定位。
2.4控制流測試
控制流測試用例自動生成。本工具設(shè)計通過符號執(zhí)行技術(shù)對函數(shù)路徑的遍歷,讓機器理解代碼。用戶將目標程序提供給系統(tǒng)編譯器前端,在編譯解析產(chǎn)生中間文件后,符號執(zhí)行工具對中間代碼進行符號執(zhí)行,即對目標程序路徑空間進行逐路徑探索,從而自動化地對應(yīng)生成較高覆蓋率的測試用例集。
符號執(zhí)行以符號值作為程序的輸入,符號化地執(zhí)行程序,程序的輸出也為變量的表達式。使用約束求解器來判定程序的路徑是否可行。符號執(zhí)行技術(shù)能夠遍歷程序的路徑空間,檢查程序是否滿足特定的性質(zhì)。
2.5功能測試
進行自動化的控制流測試之后,僅能驗證每個軟件單的語句、分支、修正的條件組合覆蓋,無法驗證每個軟件單元的功能。故開發(fā)功能測試模塊,解析羅列出每個軟件單元的全局輸入變量,并對調(diào)用的軟件單元進行打樁。用戶通過圖形化的界面,結(jié)合軟件詳細設(shè)計規(guī)范中,每個軟件單元的功能邏輯,對每個軟件單元的全局輸入變量進行賦值,對樁單元進行返回值設(shè)置。
2.6缺陷追溯
工具在高覆蓋率分析函數(shù)路徑的同時,還具備能實現(xiàn)程序中缺陷的精準查找,結(jié)合系統(tǒng)自動化生成測試框架的能力,工具在測試過程中發(fā)現(xiàn)的缺陷,是在特定的參數(shù)條件下,根據(jù)函數(shù)路徑執(zhí)行求解中確定。所以,所有的缺陷都需要能夠準確定位到代碼具體位置,并展示該缺陷發(fā)生的具體條件。
2.7信息統(tǒng)計
工具對軟件測試信息進行信息統(tǒng)計,提供統(tǒng)計信息界面和項目看板界面。統(tǒng)計信息界面用數(shù)字和圖形方式展示當前用戶全部測試工程統(tǒng)計信息,包括工程數(shù)量、總函數(shù)數(shù)量、總代碼量、測試用例數(shù)量、已分析/未分析函數(shù)數(shù)量、工程類型分布、各工程函數(shù)平均覆蓋率以及不同類型工程中函數(shù)覆蓋率分布。
2.8持續(xù)集成
當前軟件行業(yè)的測試多趨向于自動化、智能化。在此工具中,對關(guān)鍵的功能點進行了后端調(diào)用接口的開發(fā),實現(xiàn)了通過命令行的形式進行自動化調(diào)用。分別實現(xiàn)源碼解析、靜態(tài)分析、控制流測試、數(shù)據(jù)導(dǎo)出的腳本驅(qū)動操作。通過與jenkins進行插件式集成,實現(xiàn)了源碼上傳即可觸發(fā)自動拉取代碼,傳輸至工具,觸發(fā)測試的機制。
3總結(jié)
隨著功能日益強大的嵌入式系統(tǒng)不斷發(fā)展并投入廣泛應(yīng)用,如何保證軟件質(zhì)量成為了工程技術(shù)人員必須要解決的難題。軟件單元測試是嵌入式軟件開發(fā)過程中早期進行軟件功能驗證,可靠性確認的重要手段,對后續(xù)階段軟件測試與保證軟件質(zhì)量具有重要意義。
本文針對嵌入式軟件單元測試,設(shè)計了一款源碼解析、靜態(tài)分析、控制流測試的自動化執(zhí)行工具必將在提升嵌入式軟件質(zhì)量方面發(fā)揮愈加重要的作用。