程式碼的黑盒測試(上)| 目標檔案測試Object File Testing
聽說,VectorCAST又出新功能了?不需要原始碼就可以測試?
瞎說,這功能我們一直就有,只不過哥不在江湖,江湖不多聞而已。
目標檔案
目標檔案是什麼
我們都知道,一個C源程式manager.c 變成可執行程式manager.exe,一般經歷四個過程,分別是預處理(Prepressing)、編譯(Compilation)、彙編(Assembly)和連結(Linking),如下圖所示:
圖1編譯過程
目標檔案是原始碼在經過預處理、編譯、彙編過程後輸出的檔案(原始碼編譯後但未進行連結的中間檔案),其內容至少包含機器指令程式碼,資料以及連結時所須要的一些資訊。
目標檔案的結構組成簡介
目標檔案中的內容資訊一般按照不同的屬性,以“節”(Section)的形式儲存,也叫“段”(Segment),它們都表示一個一定長度的區域。
目標檔案的結構組成主要包含:程式碼段 .text(存放機器指令程式碼)、資料段 .data(存放已初始化的全域性變數和區域性靜態變數的資料)、.bss段(存放未初始化的全域性變數和區域性靜態變數)。
我們通常使用binutils的工具objdump來檢視目標檔案內部的結構,以manager.o為例,如下圖2所示。
圖2 manager.o
使用VectorCAST/C++進行目標檔案測試
VectorCAST/C++ 是Vector公司旗下一款整合的軟體測試解決方案,可顯著減少驗證安全關鍵型和任務關鍵型嵌入式系統所需的測試C/C++軟體元件的時間、精力和成本。
VectorCAST/C++ 不僅支援白盒下的功能測試和結構覆蓋測試,也支援黑盒下的軟體功能測試——目標檔案測試(Object File Testing)和庫介面測試(Library Interface Testing)。
目標檔案測試就是使用目標檔案通過VectorCAST工具生成測試套件而進行的功能測試;庫介面測試方法是指VectorCAST將解析C/C++標頭檔案中存在的函式和方法的定義,並基於這些建立測試環境,允許在沒有可用原始碼的情況下使用現有庫或DLL建立測試。本次主要講解VectorCAST/C++的目標檔案測試方案,以manager.c原始檔為操作物件,使用GCC編譯器進行編譯。
測試輸入物
- 目標檔案
a.單個.obj/.o檔案生成方式
前提條件:該.c檔案“涉及”到的.h檔案都能正確引用
gcc -c source.c(預設在原路徑下生成一個同名的.o檔案),如下圖3所示。
圖3 單個檔案manager.o的生成
b.多個.obj/.o檔案生成方式
前提條件:每個.c檔案“涉及”到的.h檔案都能正確引用
gcc -c source1.c source2.c source3.c或gcc -c *.c(預設在原路徑下生成相應同名的.o檔案),如下圖4所示。
圖4 多個目標檔案的生成
對於其他編譯鏈,可以通過IDE(整合開發環境)生成專案的目標檔案。如CodeWarrior,其一般可以通過其IDE生成相應的目標檔案,如下圖5所示。
圖5 CodeWarriors IDE生成相應的目標檔案
- 修改後的原始檔:是指刪除了函式具體實現的原始碼檔案(仍包含完整的.h檔案),如下圖6所示。
圖6 刪去函式具體實現後的“manager.c”
- 需求文件
由於目標檔案測試屬於一種軟體黑盒測試,所以對於單元測試級別的需求文件的細緻程度可能要達到詳細設計文件的程度,甚至更細緻。
如上int Add_Included_Dessert(struct order_type* Order)函式,對於目標檔案測試的單元需求可能這樣描述:
表 1 Add_Included_Dessert(struct order_type* Order)的單元需求說明示例
即需要明確給出了Add_Included_Dessert(struct order_type* Order)函式的輸入與輸出值。
VectorCAST/C++ 進行目標檔案測試
- 單元測試操作步驟:
a.啟動工具,設定工作路徑,建立新工程並命名,選擇正確的編譯鏈(以GCC編譯鏈為例);
b.進入建立測試環境(8大步)。
Step1:選擇編譯器,已在前面配置好了,直接跳過。
Step2:命名測試環境(預設字母大寫,空格為下劃線)。
Step3:測試方式。選擇目標檔案測試方式,然後選擇待測目標檔案manager.o。如下圖7所示。
圖7 選擇待測目標檔案“manager.o”
Step4:構建選項。要選擇Code Coverage為None,VectorCAST才會使用之前編譯的目標檔案。
Step5:本地原始碼檔案。使用雙加號新增包含修改後的原始檔所在路徑。
Step6:選擇UUTs和樁。
Step7:User Code可選選項。本例項不需要,直接跳過。
Step8:測試環境配置概覽。成功構建測試環境,如下圖8所示。
圖8 成功構建測試環境
c.構建測試環境後,我們就可以根據測試需求(功能需求,表1中序號1),建立和執行測試用例,如下圖9所示。
圖9 建立、執行測試用例
- 整合測試
整合測試工程構建內容與單元測試很類似,僅在構建測試環境的第3步和第6步不同。整合測試一般會在第3步將相應的多個.o檔案同時加進來;第6步將相應的多個修改後的原始檔同時加進來。
然後使用組合測試功能,將單體測試用例按照一定的邏輯功能進行排列,執行組合測試用例。
總結
目標檔案測試過程中,使用修改後的原始碼進行測試,可以將一些核心演算法的程式碼實現部分進行刪除,能夠較大程度的避免直接使用原始碼,更好的保護客戶程式碼。
當然進行目標檔案測試的要求比較高。需要完善的測試需求文件,對於單元測試來說,一般需要軟體詳細設計文件以及單元需求文件等,對於軟體整合測試來說,一般需要軟體架構設計規範文件及整合需求文件等。
此外目標檔案測試,只能進行功能測試,沒有結構覆蓋度。為了得到覆蓋度資訊,我們還是要轉向白盒測試。將之前的測試用例匯入到白盒測試工程中的測試環境中去執行,獲取覆蓋度。
北匯信息專注於汽車電子測試,提供專業的汽車電子測試系統搭建及測試諮詢服務;提供完整的汽車新能源測試服務;提供完整的軟體生命週期的軟體測試服務。
VectorCAST/C++作為Vector公司的程式碼動態測試工具,支援自動生成測試用例,提供完善的覆蓋度資訊檢視,還可以與Git/SVN/Jekins等工具整合等等。
本次為大家簡單介紹了VectorCAST/C++在軟體測試方面的軟體黑盒測試。後續將會為大家帶來更多基於VectorCAST/C++的動態測試相關內容。同時也歡迎垂詢和溝通,共同探討測試相關問題。
注:1. manager.c是一個點餐demo程式,且本文對manager.c的相關操作都是在Windows平臺實現的。
2.文中圖片來源於VectorCAST/C++工具截圖。
參考文獻:
[1] 《程式設計師的自我修養—連結、裝載與庫》
[2] VectorCAST/C++工具幫助文件
本文來自部落格園,作者:{北匯信息},轉載請註明原文連結:{https://www.cnblogs.com/polelink/}