孫隴平
摘 要: 覆蓋率測試是檢驗軟件測試完整性、充分性的重要方式,這里介紹了覆蓋率測試基礎理論、覆蓋率的測試類型、覆蓋率測試工作流程、比較了覆蓋率測試工具Bullseye Coverage、LDRA TestBed。并通過LDRA Testbed測試工具對被測軟件程序插裝,分析插裝程序輸出的結果得到語句覆蓋率、分支覆蓋率等數據,以達到對軟件問題的查找和對測試充分性、全面性的驗證。同時給出了Turbo C開發環境下DOS操作系統的嵌入式軟件,利用LDRA Testbed進行覆蓋率分析和通過查看未覆蓋的代碼定位軟件問題、測試用例覆蓋情況的詳細步驟。
關鍵詞: 嵌入式軟件; 覆蓋率測試; LDRA Testbed; 測試方法
中圖分類號: TN911?34 文獻標識碼: A 文章編號: 1004?373X(2014)18?0067?03
Research and application of embedded software coverage rate testing
SUN Long?ping
(Jiangsu Automation Research Institute, Lianyungang 222061, China)
Abstract: Coverage testing is an important method to check software integrity and adequacy. This article introduces cover testing theories, testing methods, testing process and compares testing tools, Bullseye Coverage and LDRA TestBed Use testing tool,LDRA Testbed, to instrument tested program, analyze the output of instumentation software to get the data of Statement coverage and branch coverage, and find out the software int question, to check coverage testing adequacy and comprehensiveness. At the same time, it provides the following steps: Embedded software, which running under Turbo developement environment and DOS system, use LDRA Testbed to analyze software coverage, through viewing the code of uncovered prograss to position software problem and check testcase coverage.
Keywords: embedded software; coverage rate testing; LDRA Testbed; testing method
隨著嵌入式設備在越來越多的領域中得到使用,與之相依附的嵌入式軟件也得到了快速的發展。面對日益復雜的嵌入式軟件,如何進行快速、全面、有效地測試已經成為當前測試工作的焦點。嵌入式軟件通常與硬件聯系緊密,常規的測試方法和技術難以對軟件進行全面測試。因此,必須采用基于對軟件程序進行插裝的覆蓋率測試技術,實現對嵌入式軟件的測試,以達到降低測試難度,提高測試效率。
1 覆蓋率測試
1.1 覆蓋率測試概念
覆蓋率測試(也稱邏輯測試)是度量測試完整性和查找軟件問題的必要手段,是測試有效性的度量。
覆蓋率測試的目的是確保軟件所有的程序至少被執行一次,盡可能全的覆蓋軟件程序的各個語句及其分支結構,所以設計測試用例要盡可能多地覆蓋軟件程序的內部邏輯結構,以便發現軟件中的錯誤和問題。覆蓋率測試的類型如下:語句覆蓋率,被測軟件程序中每行語句至少執行一次,語句覆蓋率=至少被執行一次的語句數量/可執行的語句總數;判定覆蓋率,被測軟件程序中每個判定表達式至少獲得一次“true”值和“false”值,以確保程序的每一個分支至少都通過一次,判定覆蓋率=判定結果被評價的次數/判定結果的總數; 條件覆蓋率,確保判定表達式中每個條件的各種可能的值至少出現一次,條件覆蓋率=條件操作數值至少被評價一次的數量/條件操作數值的總數;判定/條件覆蓋率,確保判定表達式的每個條件的所有可能取值至少出現一次,并使每個判定表達式所有可能的結果也至少出現一次,判定/條件覆蓋率=條件操作數值或判定結果至少被評價一次的數量/(條件操作數值總數+判定結果總數);路徑覆蓋率,測試用例覆蓋被測程序中所有可能的路徑,路徑覆蓋率=至少被執行到一次的路徑數/總的路徑數。
1.2 覆蓋率測試方法
覆蓋率測試通過對被測軟件程序進行插裝,并對插裝后的被測軟件程序編譯生成可執行程序。然后在軟件運行的實際環境中運行該可執行程序,同時執行功能、性能、接口、人機交互界面、強度、安全性、邊界、恢復性測試等測試用例和測試數據。如果覆蓋率沒有到軟件規定要求,分析原因后,必要時補充軟件的功能、性能、接口、人機交互界面等測試類型的測試用例,保證覆蓋率測試指標滿足軟件要求。覆蓋率測試的工作流程如圖1所示。覆蓋率測試的關鍵是對軟件程序進行插裝,插裝是在保證軟件程序邏輯完整的基礎上,插入一些探針,通過分析探針執行拋出的特征數據,達到對軟件覆蓋情況的測試。
1.3 覆蓋率測試工具
由于當前潛入式軟件開發語言多為C/C++,而針對C/C++做覆蓋率常用的工具有Bullseye Coverage和LDRA TestBed。Bullseye Coverage是Bullseye公司支持Unix,Windows操作系統和Boland C++,Gun C++,Inter C++等開發環境,提供的覆蓋率是分支覆蓋率而不是一般的覆蓋率。
圖1 覆蓋率測試工作流程
LDRA TestBed是LDRA公司研發的一款成熟的軟件測試商用工具,包括以下多個功能:按照編碼規則對代碼評審;分析代碼的復雜度、密度和可測試性,達到對軟件質量的評審;分析接口,變量使用,控制流,識別隱藏的錯誤變量;對軟件代碼進行單元測試;對軟件代碼進行插裝,并分析軟件的語句、分支等覆蓋率;對測試過程中的用例、文檔等進行管理。
LDRA Testbed提供了BitMap插樁技術來解決覆蓋率測試。BitMap是一種位圖技術,插裝后的軟件在實際環境運行時將探針的特征值信息存放到一個固定大小的數組中,當需要對代碼覆蓋率進行分析時,通過Testbed提供的get_history命令得到歷史文件,再將該內容提供給Testbed進行覆蓋率分析。
TestBed作為覆蓋率測試工具,具有以下特性:
(1) 能夠與被測軟件編譯器相結合對源程序進行自動插裝,被插裝的程序即可以是平臺軟件也可以是嵌入式軟件;
(2) 根據插裝軟件輸出的覆蓋數據,能夠快速、清晰的分析出軟件總體、每個函數的語句覆蓋率、分支覆蓋率等;
(3) 根據分析出的函數覆蓋率數據,幫助測試人員快速定位未覆蓋的軟件程序,便于改進測試用例沒計的缺陷,進而提高軟件的覆蓋率。
2 基于LDRA TestBed的覆蓋率測試應用
2.1 被測軟件概況
被測軟件是基于Turbo C開發環境的嵌入式軟件,運行于微機板上TF存儲卡的DOS系統,通過接收上位機的控制參數及獲取外部導航設備的導航信息、傳感器的傳感器數據后,經數據處理后向外部設備發送控制命令,達到對外部設備的控制。
圖2 軟件運行連接圖
2.2 覆蓋率測試應用
被測軟件通過以下步驟實現覆蓋率測試:
(1) 在Testbed中新建一個Coverage Test的工程,并將被測軟件的程序文件test.c(不需要程序的.h文件)加入工程中。
(2) 選中Configure菜單下的Instrumentation Option選項,去掉:□Instrumentation for MC/DC Coverage;選中:□Compress Execution History Bitmap;在edit Instrument SourceFile Name(s):inszt_name.c中Name不能超過8個字符。然后在Analysis菜單點擊Start Analysis進行插裝,Testbed在和test.c同目錄下產生inszt_test.c文件該文件為經過插裝后的程序文件。
(3) 在inszt_test.c文件中查找“static unsigned int bitmaparr[]”,去掉其中的static;查找qqqbranches,將bitmaparr[qqqbranches/8+1]數據填入該數組;在main函數中添加覆蓋數據輸出到test.txt代碼,如下所示:
char str[sizeof(bitmaparr)];
FILE *dfile=fopen("c:\\test.txt","wt");
int j=sizeof(bitmaparr)/sizeof(int);
for (int i=0;i { sprintf(str,"%d\n",bitmaparr[i]); fprintf(dfile, str); } fclose(dfile); (4) 將inszt_test.c文件,刪除前面的“inszt_”標識后,拷貝到TF卡中,替換未插裝的test.c,啟動Turbo C跟其他的源文件一起編譯,產生可執行的目標文件test.exe; (5) 啟動軟件并執行功能、性能、接口、邊界、性能、安全性、恢復性等測試類型,將軟件輸出的test.txt(文件中的數字內容為186個大于等于0,小于等于255的整型數字)文件修改為history.exh(分析后該文件會被刪除,注意備份),使用Testbed進行分析,即可獲得相應的程序或分支覆蓋率。 分析后找到test.dyn.htm文件就可以看到覆蓋率分析數據如圖3所示。 圖3 軟件覆蓋率分析數據 (6) 如某一個函數覆蓋率沒有達到100%,需要進入函數具體分析界面,如圖4所示。其中線框起來的是未執行到的部分,需要查找原因,如果是用例設計不夠充分,需要添加設計測試用例,執行插裝軟件后再分析覆蓋數據,直到覆蓋率指標達到要求為止。 圖4 軟件程序覆蓋執行情況 3 結 語 通過嵌入式軟件覆蓋率測試研究與應用,發現LDRA TestBed不僅能夠快速地對軟件程序進行插裝、覆蓋數據分析,而且根據覆蓋率結果的函數覆蓋情況,快速定位到未執行的程序。針對開發人員可以定位軟件錯誤,針對測試人員,根據代碼覆蓋情況可以梳理、優化、減少冗余的測試用例,爭取達到對程序的全覆蓋。覆蓋率測試工具在嵌入式軟件測試中廣泛應用,能夠大幅度提高覆蓋水平,規避嵌入式軟件難于測試的缺點,幫助測試人員大幅提高測試效率。 參考文獻 [1] 范勇,蘭景英,李繪卓.軟件測試技術[M].西安:西安電子科技大學出版社,2009. [2] 鄭人杰.軟件工程[M].北京:清華大學出版社,1999. [3] 上海創景計算機系統有限公司.LDRA Testbed中文技術說明[EB/OL].[2007?11?04].http://wenku.baidu.com. [4] 朱紅軍.一種嵌入式軟件覆蓋和分析測試方法[J].航空計算技術,2009(5):65?67. [5] 流螢,王英,劉漫丹.嵌入式軟件的覆蓋測試[J].自動化儀表,2012(6):63?66. [6] 金維佳,施小敏.基于嵌入式軟件的覆蓋測試問題研究[J].信息技術,2011(4):117?120.
由于當前潛入式軟件開發語言多為C/C++,而針對C/C++做覆蓋率常用的工具有Bullseye Coverage和LDRA TestBed。Bullseye Coverage是Bullseye公司支持Unix,Windows操作系統和Boland C++,Gun C++,Inter C++等開發環境,提供的覆蓋率是分支覆蓋率而不是一般的覆蓋率。
圖1 覆蓋率測試工作流程
LDRA TestBed是LDRA公司研發的一款成熟的軟件測試商用工具,包括以下多個功能:按照編碼規則對代碼評審;分析代碼的復雜度、密度和可測試性,達到對軟件質量的評審;分析接口,變量使用,控制流,識別隱藏的錯誤變量;對軟件代碼進行單元測試;對軟件代碼進行插裝,并分析軟件的語句、分支等覆蓋率;對測試過程中的用例、文檔等進行管理。
LDRA Testbed提供了BitMap插樁技術來解決覆蓋率測試。BitMap是一種位圖技術,插裝后的軟件在實際環境運行時將探針的特征值信息存放到一個固定大小的數組中,當需要對代碼覆蓋率進行分析時,通過Testbed提供的get_history命令得到歷史文件,再將該內容提供給Testbed進行覆蓋率分析。
TestBed作為覆蓋率測試工具,具有以下特性:
(1) 能夠與被測軟件編譯器相結合對源程序進行自動插裝,被插裝的程序即可以是平臺軟件也可以是嵌入式軟件;
(2) 根據插裝軟件輸出的覆蓋數據,能夠快速、清晰的分析出軟件總體、每個函數的語句覆蓋率、分支覆蓋率等;
(3) 根據分析出的函數覆蓋率數據,幫助測試人員快速定位未覆蓋的軟件程序,便于改進測試用例沒計的缺陷,進而提高軟件的覆蓋率。
2 基于LDRA TestBed的覆蓋率測試應用
2.1 被測軟件概況
被測軟件是基于Turbo C開發環境的嵌入式軟件,運行于微機板上TF存儲卡的DOS系統,通過接收上位機的控制參數及獲取外部導航設備的導航信息、傳感器的傳感器數據后,經數據處理后向外部設備發送控制命令,達到對外部設備的控制。
圖2 軟件運行連接圖
2.2 覆蓋率測試應用
被測軟件通過以下步驟實現覆蓋率測試:
(1) 在Testbed中新建一個Coverage Test的工程,并將被測軟件的程序文件test.c(不需要程序的.h文件)加入工程中。
(2) 選中Configure菜單下的Instrumentation Option選項,去掉:□Instrumentation for MC/DC Coverage;選中:□Compress Execution History Bitmap;在edit Instrument SourceFile Name(s):inszt_name.c中Name不能超過8個字符。然后在Analysis菜單點擊Start Analysis進行插裝,Testbed在和test.c同目錄下產生inszt_test.c文件該文件為經過插裝后的程序文件。
(3) 在inszt_test.c文件中查找“static unsigned int bitmaparr[]”,去掉其中的static;查找qqqbranches,將bitmaparr[qqqbranches/8+1]數據填入該數組;在main函數中添加覆蓋數據輸出到test.txt代碼,如下所示:
char str[sizeof(bitmaparr)];
FILE *dfile=fopen("c:\\test.txt","wt");
int j=sizeof(bitmaparr)/sizeof(int);
for (int i=0;i { sprintf(str,"%d\n",bitmaparr[i]); fprintf(dfile, str); } fclose(dfile); (4) 將inszt_test.c文件,刪除前面的“inszt_”標識后,拷貝到TF卡中,替換未插裝的test.c,啟動Turbo C跟其他的源文件一起編譯,產生可執行的目標文件test.exe; (5) 啟動軟件并執行功能、性能、接口、邊界、性能、安全性、恢復性等測試類型,將軟件輸出的test.txt(文件中的數字內容為186個大于等于0,小于等于255的整型數字)文件修改為history.exh(分析后該文件會被刪除,注意備份),使用Testbed進行分析,即可獲得相應的程序或分支覆蓋率。 分析后找到test.dyn.htm文件就可以看到覆蓋率分析數據如圖3所示。 圖3 軟件覆蓋率分析數據 (6) 如某一個函數覆蓋率沒有達到100%,需要進入函數具體分析界面,如圖4所示。其中線框起來的是未執行到的部分,需要查找原因,如果是用例設計不夠充分,需要添加設計測試用例,執行插裝軟件后再分析覆蓋數據,直到覆蓋率指標達到要求為止。 圖4 軟件程序覆蓋執行情況 3 結 語 通過嵌入式軟件覆蓋率測試研究與應用,發現LDRA TestBed不僅能夠快速地對軟件程序進行插裝、覆蓋數據分析,而且根據覆蓋率結果的函數覆蓋情況,快速定位到未執行的程序。針對開發人員可以定位軟件錯誤,針對測試人員,根據代碼覆蓋情況可以梳理、優化、減少冗余的測試用例,爭取達到對程序的全覆蓋。覆蓋率測試工具在嵌入式軟件測試中廣泛應用,能夠大幅度提高覆蓋水平,規避嵌入式軟件難于測試的缺點,幫助測試人員大幅提高測試效率。 參考文獻 [1] 范勇,蘭景英,李繪卓.軟件測試技術[M].西安:西安電子科技大學出版社,2009. [2] 鄭人杰.軟件工程[M].北京:清華大學出版社,1999. [3] 上海創景計算機系統有限公司.LDRA Testbed中文技術說明[EB/OL].[2007?11?04].http://wenku.baidu.com. [4] 朱紅軍.一種嵌入式軟件覆蓋和分析測試方法[J].航空計算技術,2009(5):65?67. [5] 流螢,王英,劉漫丹.嵌入式軟件的覆蓋測試[J].自動化儀表,2012(6):63?66. [6] 金維佳,施小敏.基于嵌入式軟件的覆蓋測試問題研究[J].信息技術,2011(4):117?120.
由于當前潛入式軟件開發語言多為C/C++,而針對C/C++做覆蓋率常用的工具有Bullseye Coverage和LDRA TestBed。Bullseye Coverage是Bullseye公司支持Unix,Windows操作系統和Boland C++,Gun C++,Inter C++等開發環境,提供的覆蓋率是分支覆蓋率而不是一般的覆蓋率。
圖1 覆蓋率測試工作流程
LDRA TestBed是LDRA公司研發的一款成熟的軟件測試商用工具,包括以下多個功能:按照編碼規則對代碼評審;分析代碼的復雜度、密度和可測試性,達到對軟件質量的評審;分析接口,變量使用,控制流,識別隱藏的錯誤變量;對軟件代碼進行單元測試;對軟件代碼進行插裝,并分析軟件的語句、分支等覆蓋率;對測試過程中的用例、文檔等進行管理。
LDRA Testbed提供了BitMap插樁技術來解決覆蓋率測試。BitMap是一種位圖技術,插裝后的軟件在實際環境運行時將探針的特征值信息存放到一個固定大小的數組中,當需要對代碼覆蓋率進行分析時,通過Testbed提供的get_history命令得到歷史文件,再將該內容提供給Testbed進行覆蓋率分析。
TestBed作為覆蓋率測試工具,具有以下特性:
(1) 能夠與被測軟件編譯器相結合對源程序進行自動插裝,被插裝的程序即可以是平臺軟件也可以是嵌入式軟件;
(2) 根據插裝軟件輸出的覆蓋數據,能夠快速、清晰的分析出軟件總體、每個函數的語句覆蓋率、分支覆蓋率等;
(3) 根據分析出的函數覆蓋率數據,幫助測試人員快速定位未覆蓋的軟件程序,便于改進測試用例沒計的缺陷,進而提高軟件的覆蓋率。
2 基于LDRA TestBed的覆蓋率測試應用
2.1 被測軟件概況
被測軟件是基于Turbo C開發環境的嵌入式軟件,運行于微機板上TF存儲卡的DOS系統,通過接收上位機的控制參數及獲取外部導航設備的導航信息、傳感器的傳感器數據后,經數據處理后向外部設備發送控制命令,達到對外部設備的控制。
圖2 軟件運行連接圖
2.2 覆蓋率測試應用
被測軟件通過以下步驟實現覆蓋率測試:
(1) 在Testbed中新建一個Coverage Test的工程,并將被測軟件的程序文件test.c(不需要程序的.h文件)加入工程中。
(2) 選中Configure菜單下的Instrumentation Option選項,去掉:□Instrumentation for MC/DC Coverage;選中:□Compress Execution History Bitmap;在edit Instrument SourceFile Name(s):inszt_name.c中Name不能超過8個字符。然后在Analysis菜單點擊Start Analysis進行插裝,Testbed在和test.c同目錄下產生inszt_test.c文件該文件為經過插裝后的程序文件。
(3) 在inszt_test.c文件中查找“static unsigned int bitmaparr[]”,去掉其中的static;查找qqqbranches,將bitmaparr[qqqbranches/8+1]數據填入該數組;在main函數中添加覆蓋數據輸出到test.txt代碼,如下所示:
char str[sizeof(bitmaparr)];
FILE *dfile=fopen("c:\\test.txt","wt");
int j=sizeof(bitmaparr)/sizeof(int);
for (int i=0;i { sprintf(str,"%d\n",bitmaparr[i]); fprintf(dfile, str); } fclose(dfile); (4) 將inszt_test.c文件,刪除前面的“inszt_”標識后,拷貝到TF卡中,替換未插裝的test.c,啟動Turbo C跟其他的源文件一起編譯,產生可執行的目標文件test.exe; (5) 啟動軟件并執行功能、性能、接口、邊界、性能、安全性、恢復性等測試類型,將軟件輸出的test.txt(文件中的數字內容為186個大于等于0,小于等于255的整型數字)文件修改為history.exh(分析后該文件會被刪除,注意備份),使用Testbed進行分析,即可獲得相應的程序或分支覆蓋率。 分析后找到test.dyn.htm文件就可以看到覆蓋率分析數據如圖3所示。 圖3 軟件覆蓋率分析數據 (6) 如某一個函數覆蓋率沒有達到100%,需要進入函數具體分析界面,如圖4所示。其中線框起來的是未執行到的部分,需要查找原因,如果是用例設計不夠充分,需要添加設計測試用例,執行插裝軟件后再分析覆蓋數據,直到覆蓋率指標達到要求為止。 圖4 軟件程序覆蓋執行情況 3 結 語 通過嵌入式軟件覆蓋率測試研究與應用,發現LDRA TestBed不僅能夠快速地對軟件程序進行插裝、覆蓋數據分析,而且根據覆蓋率結果的函數覆蓋情況,快速定位到未執行的程序。針對開發人員可以定位軟件錯誤,針對測試人員,根據代碼覆蓋情況可以梳理、優化、減少冗余的測試用例,爭取達到對程序的全覆蓋。覆蓋率測試工具在嵌入式軟件測試中廣泛應用,能夠大幅度提高覆蓋水平,規避嵌入式軟件難于測試的缺點,幫助測試人員大幅提高測試效率。 參考文獻 [1] 范勇,蘭景英,李繪卓.軟件測試技術[M].西安:西安電子科技大學出版社,2009. [2] 鄭人杰.軟件工程[M].北京:清華大學出版社,1999. [3] 上海創景計算機系統有限公司.LDRA Testbed中文技術說明[EB/OL].[2007?11?04].http://wenku.baidu.com. [4] 朱紅軍.一種嵌入式軟件覆蓋和分析測試方法[J].航空計算技術,2009(5):65?67. [5] 流螢,王英,劉漫丹.嵌入式軟件的覆蓋測試[J].自動化儀表,2012(6):63?66. [6] 金維佳,施小敏.基于嵌入式軟件的覆蓋測試問題研究[J].信息技術,2011(4):117?120.