摘要:單元測試是對嵌入式軟件進行測試的最低級別的活動,是保障整個測試效果、保證產品質量的基礎。RTRT(Rational Test RealTime)是IBM Ratioanl提供的典型嵌入式軟件代碼級自動化測試工具,可同時對宿主機和目標機進行測試和調試,自動生成測試腳本、測試樁和測試報告。通過研究應用表明利用RTRT進行嵌入式軟件單元測試實現自動化,能大量減少測試工作量,有效提高測試效率和軟件質量。
關鍵詞:單元測試;嵌入式軟件;RTRT
信息技術的飛速發展帶動在嵌入式系統中軟件越來越多地取代硬件的功能,研究嵌入式軟件測試技術用以保證軟件質量成為近年來關注的熱點。單元測試作為軟件測試過程中的第一階段,是軟件測試的基礎,效果會直接影響后期測試;另外,從修復軟件缺陷與花費的成本關系考慮,在單元測試階段修復缺陷將比在后一個階段發現缺陷節約5~10倍的成本,可見無論從質量還是成本的角度單元測試都是非常關鍵的。但在實際測試中,僅依靠人工編寫函數并統計分析結果的測試方法已不能滿足測試準確性和測試效率的要求,要引進自動化的測試工具。RTRT是一個跨平臺組件和運行時分析測試工具,支持測試的各個階段,其單元測試自動生成測試用例模板,自動生成測試樁程序,自動運行測試程序,自動生成測試報告。
一、單元測試基本理論
(一)單元測試定義
單元測試是對每個最小的軟件模塊進行的正確性檢驗的測試,在于發現各模塊內部可能存在的各種差錯。包含模塊接口測試、局部數據結構測試、路徑測試、錯誤處理測試和邊界測試,依據詳細設計說明書和源程序清單,從程序的內部結構出發設計測試用例。主要采用白盒測試的測試用例,輔之以黑盒測試,使之對任何合理和不合理的輸入,都能鑒別和響應。
(二)單元測試環境
單元是軟件的基本組成模塊,但本身不是一個獨立的程序,在考慮測試模塊時,同時要考慮它和外界的聯系,必須為每個單元測試開發驅動模塊和樁模塊。驅動模塊相當于被測模塊的主程序,它接收測試數據,把這些數據傳送給被測模塊,然后輸出實測結果。樁模塊是指用來替代被測模塊調用的子模塊。所以被測模塊、與它相關的驅動模塊及樁模塊,同時包括測試用例是共同構成一個單元測試測試環境必需的要素。基于交叉開發環境,嵌入式軟件單元測試環境分為基于宿主機和目標機環境兩種。宿主機中單元測試與通用軟件測試相同。目標機中的單元測試被測模塊運行在目標機中,所有驅動模塊和被測模塊的數據傳遞都需要網線或者串口線完成,測試工具還要將測試結果再傳送到宿主機中。單元測試都可以在宿主機平臺完成,對特別指定在目標機中進行的測試必須在目標機完成。
(三)單元測試的覆蓋評測
單元測試中主要的評價方法是覆蓋評測,指所測試的源代碼占代碼總數的百分比。為了保證軟件代碼都被執行到,防止從不執行到的代碼存在潛在的缺陷,導致產品失效。主要包括語句覆蓋、判定覆蓋、條件覆蓋、判定-條件覆蓋等。語句覆蓋指設計較少的測試用例,使被測程序中每個語句至少執行一次;判定覆蓋,即程序中每個判定的每個可能的結果都應該至少執行一次;條件覆蓋,要求程序中每個判定的條件的所有可能值至少執行一次。由上述內容可知,一個完整的單元測試若完全利用人工來執行,則需要開發相應的測試驅動和樁程序,根據需求設計不同測試用例或大量測試用例組合,在宿主機和目標機環境下運行測試程序,判斷測試用例是否正確,是否達到需要的測試覆蓋率,最后編寫測試報告。在代碼修改的情況下,還要進行回歸測試。測試過程比較繁瑣且不受控,這導致很多程序員迫于時間和成本壓力,逃避單元測試,結果本應單元測試解決的軟件缺陷在后續的測試中較難查找和定位,花費更多的時間和成本來修復問題。自動化測試工具解決了由傳統手工測試帶來的困擾,典型的嵌入式軟件測試工具包括CodeTest、Testbed和RTRT,即Rational Test RealTime的首字母縮寫,具有強大的測試分析功能。
二、IBM RTRT嵌入式軟件單元測試
(一)RTRT簡介
RTRT是IBM Ratioanl提供的嵌入式軟件代碼級自動化測試工具集,成功地提供了自動化的、可重復的、可追蹤判定的、標準化的測試,對提高嵌入式軟件可靠性和開發測試速度起著巨大的幫助作用。所具有的突出特性如下:
1.支持廣泛的測試功能,覆蓋測試的各個階段,包括靜態度量、代碼規則檢查、單元測試、內存分析、覆蓋率分析、代碼運行時跟蹤、性能分析和基于消息的系統測試。
2.為單一的測試環境中的宿主機和目標機進行自動化的單元測試、運行時分析。
3.自動創建和部署單元的測試樁模塊和測試驅動程序。
4.繪制內存和性能曲線并對運行時追蹤進行可視化顯示。
5.支持代碼的靜態分析和基于MISRA標準的代碼規則檢查。
6.直接在目標機上進行測試和分析,支持所有從8位微芯片到64位RTOS。
(二)RTRT單元測試工作原理分析
RTRT單元測試工具支持C、C++、Jave和Ada語言編寫的代碼,提供全自動化的解決方案,大幅度提高了測試效率。分析RTRT的單元測試工作原理如下圖1(以.c文件為例)。
圖1顯示了RTRT單元測試時測試程序經編譯、鏈接、運行到測試報告產生的整個過程。開發人員在自動生成的測試腳本的編輯環境中根據需求開發測試用例,設計輸入和預期輸出。在模擬環境或目標機環境下自動運行測試程序,測試報告產生器自動生成測試報告,展示通過或失敗的測試用例和代碼覆蓋率分析報告,發現錯誤可直接修改,自動進行回歸測試。RTRT的變量測試包括所有的全局變量、函數間傳遞參數和函數返回值。RTRT基于TDP的目標機部署技術,通過對該技術進行定制可以支持全面的嵌入式目標系統,使RTRT可以同時對宿主機和目標機進行測試和調試,并對兩者進行有效協調。RTRT單元測試階段支持絕大多數項目要求的語句覆蓋率、決策覆蓋率、MC/DC覆蓋率。
(三)基于RTRT的單元測試步驟設計
通過以上分析結合幾個項目單元測試之后,我們總結了使用RTRT進行單元測試的基本步驟如下圖2所示。
三、RTRT單元測試實例
以電器嵌入式軟件豆漿機代碼為例。目前電器產品由傳統機械式控制向嵌入式的智能化控制轉型,電器產品的安全也不僅限于傳統的電氣、電磁、機械及環境等方面,軟件也成為需要檢測的重點。選取豆漿機Relay單元,主要功能為繼電器控制。部分代碼如下:
void Relay(void)
{〓if(irq_r)〓〓〓〓//處理繼電器動作請求
{〓if(lr_on)〓〓〓//轉換繼電器開
{
if(!f_lr_on)
{
〓〓f_lr_on=1;
〓〓hms3=2;〓〓〓〓//延時200ms
〓〓t2ms=0;
〓〓〓}
〓else
〓{
〓〓〓〓if(!hms3)〓〓//轉換繼電器確認打開
〓〓〓…………….
}
RTRT自動生成relay函數的測試例用設計模板,包含函數中出現的每個全局變量,編寫上述if語句為真的測試用例,只需要編寫測試輸入與預期輸出。如下:
VAR irq_r,〓init = 1,〓ev=init
VAR lr_on,〓init = 1,〓ev=init
VAR f_lr_on,,init=0,ev=1
VAR hms3,init=2,ev=init
VAR 2ms,init=0,ev=init
預期值與實際測試運行結果比較,生成測試報告會自動判斷測試用例是否通過,可根據代碼路徑的覆蓋要求,在測試模板中設計不同測試用例,達到需要的覆蓋率,并在測試覆蓋率報告中查看覆蓋率百分比。為獲得可靠的代碼質量保證,繼續根據未執行到的代碼情況,編寫合適的測試用例,使代碼覆蓋率得以提高。
四、總結
本文首先分析了嵌入式軟件單元測試的基本理論,測試過程復雜,工作量較大,所以在實際的測試中,完全依靠人力確保單元測試有效實施存在困難,自動化的測試工具RTRT提供了全套自動的解決方案,自動生成測試腳本、測試程序、樁,減少了測試工作量,能自動進行回歸測試,并且自動生成測試報告,以圖形的形式使測試結果一目了然。不僅提高了測試效率,而且保證了測試質量。強大的TDP定制使RTRT可以支持大多數嵌入式產品的軟件測試,在嵌入式領域已逐漸被廣泛應用。
參考文獻:
[1]蔡建平.嵌入式軟件測試實用技術[M].北京:清華大學出版社,2010.
[2]姜龍,王冬星.使用IBM Rational Test RealTime進行嵌入式軟件測試[J].電腦學習,2010,32(3):135-136.
[3]徐潤德,陳亞,趙慕奇.基于LDRA Testbed的軟件單元測試[J].海軍航空工程學院學報,2011,26(3):356-360.
[4]http://www-306.ibm.com/software/awdtools/realtime.
[5]馬可.嵌入式車載電子系統軟件測試方法的研究與應用[D].重慶:重慶大學,2008.
基金項目:浙江省大學生科研創新團隊資助項目(編號:2012R409046);2011國家公益性質檢行業科研專項資助項目(編號:201110059);2012國家公益性質檢行業科研專項資助項目(編號:201210101)
作者簡介:汪萍萍(1987-),女,碩士在讀,研究方向:嵌入式軟件測試技術。