使用Rational PureCoverage測試程式碼覆蓋率

Just4life發表於2013-08-27
軟體測試是軟體構建過程中非常重要的一環,測試可以完成許多事,但最重要的是可以衡量正在開發的軟體的質量。有一種觀點認為,在開發週期中,越早使測試成為投入的一部分越好。一個軟體從程式碼編寫開始就要面臨這各種各樣的測試,單元測試、整合測試、迴歸測試等等,其中與軟體開發人員關係最緊密的就是單元測試。

    單元測試的主要目的是獲取應用程式中可測試軟體的最小片段,將其同程式碼的其餘部分隔離開來,然後確定它的行為是否與預期的一樣。單元測試並不能保證程式是完美無缺的,但是在所有的測試中,單元測試是第一個環節,也是最重要的一個環節。單元測試的物件是軟體設計中的最小單位--模組,它是一種程式設計師對自己的程式碼進行自測試的工作,其測試依據就是軟體模組的詳細設計文件。單元測試通常採用白盒測試的方式,白盒測試也稱結構測試或邏輯驅動測試,已知產品內部工作過程,通過測試來檢測內部動作是否正常。測試按照程式內部結構進行,檢驗程式中的每條通路是否正確工作,而不顧它的功能。測試是從程式碼的路徑結構和內部邏輯資訊設計測試用例並覆蓋全部程式碼、分支、路徑、條件。 所以,單元測試的一個很重要的指標就是程式碼覆蓋率,很多軟體開發標準化組織都對單元測試的程式碼覆蓋率有很明確的要求,低於標準就意味著單元測試不通過。

    目前有很多單元測試工具都支援程式覆蓋率的自動統計,應用較廣的分析覆蓋率的工具有 Logiscope TestChecker、 TrueCoverage 、 PureCoverage 等,本文主要是介紹如何使用Rational公司的PureCoverage工具統計測試程式碼覆蓋率。PureCoverage是Rational公司的單元測試工具PurifyPlus三套件之一,PurifyPlus的另外兩個套件分別是記憶體檢查工具purify和程式碼效率分析工具pureQuantity。本文主要介紹如何使用PureCoverage配合Microsoft的開發工具Visual C++統計單元測試的程式碼覆蓋率。PureCoverage通過記錄執行過的程式碼,生成程式碼覆蓋分析報告,其程式碼覆蓋分析可以詳細到語句級,技術上的原理就是使用目標碼插入OCI(Object Code Insertion)技術。所謂的目標物件插入技術,就是直接對目標碼進行分析,並插入相應的彙編程式碼,不過原始碼插入SCI(Source Code Instrumentation)和執行碼替換ECI(Executable Code Interception)都需要原始碼或編譯環境的支援,並且會引起程式執行緩慢和系統資源佔用過多的問題。但是瑕不掩瑜,PureCoverage憑藉著與Visual Studio整合開發環境的無縫連線,依然是單元測試工具的首選利器。

    PureCoverage有兩種執行介面,一種是應用程式介面,可以脫離開發環境獨立執行;另一種是嵌入式介面,可以整合到Visual Studio的整合開發環境中,不過兩種執行方式的基本功能是相同的。下面用一個簡單的例子作個演示,使大家對PureCoverage有一個感性的認識,這個例子就是PureCoverage自帶的一個例子hello.exe。
    首先執行PureCoverage,然後選擇“File”選單的“Run”命令,在彈出的“Run Program”對話方塊中選擇hello.exe程式:


圖1. 選擇程式

由於hello.exe是使用Visual C++ 6.0編寫的Win32應用程式,所以在“Collect Data From”選項處選擇“Unmanaged Code(非託管程式碼)”,點選“Run”按鈕就開始執行Hello.exe。PureCoverage首先分析Hello.exe裝載的模組,然後潤行hello.exe,出現一個標題是“Hello,World”的訊息框,這是hello.exe程式的提示,要使用者選擇是不是看看當前的時間,我們先點選“確定”按鈕看看結果。hello.exe彈出另一個訊息框顯示當前時間,點選“確定”按鈕結束程式的執行,此時PureCoverage已經統計出了結果,如圖(2)所示:


圖2. 執行結果的“Module View”檢視

這個檢視顯示了hello.c的有兩個函式,DisplayLocalTime()和WinMain(),在剛才那次測試執行中被呼叫的次數和程式碼行覆蓋率。用滑鼠雙擊函式名可以將檢視切換到程式碼視窗,如圖(3)所示:


圖3. 執行結果的“Source Code”檢視

程式碼檢視中被標記為藍色的程式碼是剛才這次測試走過的程式碼,被標記為紅色的程式碼表示這次測試沒有走過的程式碼。如果想了解每個函式的具體情況,可以點選工具欄的“Function List”圖示,圖(4)就是本例中的函式列表,包括函式被呼叫的次數,總的程式碼行數,被測試過的行數以及程式碼覆蓋率。


圖4. Function List 顯示

    有時候一次測試通常不能覆蓋所有的程式碼,以上面的hello.exe為例,WinMain()函式的一個分支就沒有走到,PureCoverage充分考慮到了這種情況,它能夠記錄每一次測試結果,並提供了對結果進行分析、對比和合並的功能。下面我們再Run一下hello.exe,這次選擇不看當前時間,使程式走過WinMain()函式的另一個流程。此時PureCoverage右邊的“Navigator”視窗就記錄下了對hello.exe的兩次測試結果,如圖(5)所示:


圖5. 檢視Navigator視窗

在Navigator視窗上用滑鼠雙擊第二次測試的結果條目,就可以在右邊看到這次測試的詳細資訊,如圖(6)所示,這次測試Missing了DisplayLocalTime()函式,只走過了WinMain()函式的else分支。


圖6. 第二次測試結果檢視

此時在Navigator視窗中可以看到兩個測試結果和一個自動合併結果,每測試一次PureCoverage就會自動將當前測試的結果合併到最上邊的“Auto Merge”結果上。使用者可以選擇某幾個測試結果合併成一個合併結果,比如在某種特殊條件下的幾次測試就可以合併到一個結果中,以便集中統計在這種特殊條件下的測試結果。合併操作非常簡單,在需要合併的測試結果上單擊滑鼠右鍵,在彈出的選單中選擇“Merge Runs”選單,然後在彈出的結果列表中選擇另一個測試結果就可以將兩者合併成一個合併結果。現在用滑鼠雙擊Navigator視窗的“Auto Merge”結果,看看兩次測試的合併結果吧。圖(7)顯示了合併結果的,兩次測試,兩個函式各被呼叫兩次,程式碼覆蓋率都是100%。

圖7. 合併結果檢視

生成一個比較結果也很簡單,在Navigator視窗中選擇一個測試結果,單擊滑鼠右鍵,接著在彈出的選單中選擇“Compare Runs”,最後再選擇另一個結果進行比較就可以了,PureCoverage會自動生成一個比較結果,用滑鼠雙擊這個比較結果,右邊就會顯示詳細的內容,如圖(8)所示,Base是原來的結果,New是新結果:


圖8. 檢視結果比較

    通過上面的介紹,相信大家對PureCoverage已經有了初步的瞭解,PureCoverage的用法非常簡單,本文只是用一個簡單的例子介紹了它的基本功能。俗話說“工欲善其事,必先利其器”,使用PureCoverage配合Visual Studio開發工具,能夠極大的提高軟體開發的質量。接下來的“PureCoverage的使用技巧”一文將以本人最近釋出的開源軟體--Windows系統鉤子檢測程式AntiHook為例,介紹一些PureCoverage的高階用法。

相關文章