天天看點

NuMega Devpartner 動态測試工具-白盒測試

1 前言

我在本文中詳細介紹了測試工具NuMega Devpartner(以下簡稱NuMega)的使用方法。

NuMega是一個動态測試工具,主要應用于白盒測試。該工具的特點是學習簡單、使用友善、功能有效。NuMega共有三個獨立的子功能——BoundsChecker、TrueCoverage、TrueTime。BoundsChecker為代碼檢錯工具,TrueCoverage為測試覆寫率統計工具,TrueTime為程式運作性能測試工具。

本文擋通過三章對NuMega三個子功能的使用方法進行了介紹,各部分之間内容獨立。如果你想了解NuMega的各項功能,建議閱讀本文擋全部内容,如果你隻想了解NuMega提供的某一個子功能的相關資訊,按目錄檢視相應的章節即可。

需要說明的一點是,本文擋中所介紹的測試工具NuMega,專指NuMega for Visual C++版,對于NuMega for Visual Basic版和NuMega for Delphi版的使用說明,不在本文擋的介紹範圍之内,這一點請注意。

2安裝

NuMega的安裝很簡單。獲得NuMega安裝程式後,點選setup.exe進行安裝即可。在安裝過程中不需要什麼特殊的設定。

不過有一點需要說明,在安裝NuMega之前,應該確定你的機器上已經安裝好了Visual C++,因為隻有這樣才能使NuMega成功的內建到Visual C++開發環境中去。

好了,下面我們分三個部分,分别介紹BoundsChecker、TrueCoverage、TrueTime的使用方法。

3 BoundsChecker

BoundsChecker 是一個Run-Time錯誤檢測工具,它主要定位程式在運作時期發生的各種錯誤。BoundsChecker能檢測的錯誤包括:

1))1、指針操作和記憶體、資源洩露錯誤,比如:

記憶體洩露;

資源洩露;

對指針變量的錯誤操作。

22、記憶體操作方面的錯誤,比如:

記憶體讀、寫溢出;

使用未初始化的記憶體。

33、API函數使用錯誤

BoundsChecker安裝成功後,在你的VC++內建開發環境中,會多出了一個名為BoundsChecker的菜單,如下所示:

NuMega Devpartner 動态測試工具-白盒測試

圖3-1 BoundsChecker在VC++內建開發環境中添加的菜單

BoundsChecker 已經非常完好的內建到VC++內建開發環境中了。

使用BoundsChecker對程式的運作時錯誤進行檢測,有兩種使用模式可供選擇。一種模式叫做ActiveCheck,一種模式叫做FinalCheck。下面分别進行介紹。

3.1 ActiveCheck

ActiveCheck是BoundsChecker提供的一種友善、快捷的錯誤檢測模式,它能檢測的錯誤種類有限,隻包括:記憶體洩露錯誤、資源洩露錯誤、API函數使用錯誤。

要想使用ActiveCheck模式來檢測程式的運作時錯誤,隻需在VC++內建開發環境中打開BoundsChecker功能,然後從調試狀态運作程式即可。此時ActiveCheck會在背景自動運作,随時檢測程式是否發生了錯誤。下面說一下具體的使用步驟。

3.1.1 用ActiveCheck來檢測錯誤

使用ActiveCheck的具體的操作步驟如下:

首先,在VC++內建開發環境中打開你要對其進行測試的程式,同時保證項目處于Debug編譯狀态下。

其次,確定VC++內建開發環境中[BoundsChecker/Integrated Debugging]菜單項和[BoundsChecker/Report Errors and Events]菜單項處于被選中的狀态。隻有這兩項被選中,BoundsChecker才會在程式運作過程中發揮作用。

最後,在VC++內建開發環境中選擇[Build/ Start Debug/Go]菜單指令,在Debug狀态下運作程式,ActiveCheck也在背景開始運作了。

這時,就可以按照制定好的測試用例,對程式進行操作。凡是程式執行過的代碼,如果存在錯誤,ActiveCheck就會記錄下來。

有一個地方要說一下,在[BoundsChecker]菜單中有一項[Report Errors Immediately],如下圖所示:

NuMega Devpartner 動态測試工具-白盒測試

圖3-2 關于[BoundsChecker / Report Errors Immediately] 菜單項

該菜單項對于ActiveCheck 模式,以及下面就要介紹的FinalCheck模式的作用是一樣的,即:如果不選中該項,則BoundsChecker會記錄程式運作過程中發現的各種錯誤,直到程式結束後再進行報告;當選中該菜單項時,在程式的運作過程中,一旦BoundsChecker發現錯誤,會馬上彈出如下的對話框進行提示:

NuMega Devpartner 動态測試工具-白盒測試

圖3-3 錯誤報告對話框

下面按圖中标注的數字序号解釋一下對話框中各個按鈕的功能:

按鈕1:點選該按鈕,則表示先暫時不理會這個錯誤,繼續執行程式。

按鈕2:點選該按鈕,則會馬上跳轉到出現問題的代碼行處。處理完問題後,點選[Build/ Start Debug/Go]菜單項,可以繼續執行程式,進行檢測。

按鈕3:點選該按鈕,則将該錯誤添加到被忽略的錯誤清單中去,當再次出現這個問題時,BoundsChecker将不會進行報告。

按鈕4:點選該按鈕,則立即終止程式的執行。

按鈕5:點選該按鈕,會顯示目前記憶體的申請、使用情況。

按鈕6:點選該按鈕,會得到目前這個錯誤的幫助資訊。

按鈕7、8: 這兩個按鈕與[BoundsChecker\Report Errors Immediately]和[BoundsChecker\ Report Errors and Event] 菜單指令的功能是完全一樣的,在此不再贅述。

按鈕9:點選該按鈕,會顯示/隐藏與該錯誤有關的函數調用堆棧情況,以及具體的出錯代碼行的位置。

是否選中[BoundsChecker/Report Errors Immediately]菜單項,完全取決于你自己的喜好,以及測試時的具體情況。如果你想要BoundsChecker在程式運作過程中實時向你彙報發現的錯誤,那麼你就選中這個菜單項;如果想等到操作結束後,再對操作過程中BoundsChecker發現的錯誤統一進行分析,就不必選中這個菜單項。我在平常使用過程中更偏向于使用後一種。

3.1.2 分析錯誤

在你操作全部結束,退出程式後,

BoundsChecker 會顯示一個所發現錯誤的清單。我們需要對清單中羅列的錯誤進行分析,來确定錯誤的原因和位置。

在錯誤檢測結果清單中,羅列出了在程式的執行過程中ActiveCheck檢測到的所有的記憶體洩露、資源洩露和API函數使用錯誤的相關資訊。如下圖所示:

NuMega Devpartner 動态測試工具-白盒測試

圖3-4 錯誤檢測結果

在左邊的視窗中,逐條列出了程式在記憶體、資源、API 函數使用上的問題,包括:該問題的種類,該問題發生的次數,如果是記憶體洩露,損失了多少記憶體,以及發生該問題的代碼位置等等。當你用滑鼠單擊選中某一條記錄時,在右邊的視窗中會顯示出與該條錯誤記錄相對應的函數調用堆棧情況。當你用滑鼠輕按兩下某一條錯誤記錄時,會定位到引發該錯誤的源代碼處。

好了,BoundsChecker在ActiveCheck模式下的使用方法至此介紹完了,是不是很簡單?

在ActiveCheck模式下檢測程式時,程式的運作速度基本不受影響,但其缺點是檢測的錯誤種類有限,即隻能檢查出記憶體洩露錯誤、資源洩露錯誤、API函數使用錯誤。BoundsChecker 提供了另外一種檢測錯誤的模式—— FinalCheck,也就是我們在前面提到的BoundsChecker的第二種使用模式。 FinalCheck可以檢測出程式中更多的錯誤。下面我們就對它進行介紹。

3.2 用 FinalCheck檢測更多的錯誤

FinalCheck具有BoundsChecker提供的所有檢錯功能。FinalCheck 是ActiveCheck的超集,它除了能夠檢測出ActiveCheck能夠檢測出的錯誤,還能發現很多 ActiveCheck 不能檢測到的錯誤,包括:指針操作錯誤、記憶體操作溢出、使用未初始化的記憶體等等,并且,對于ActiveCheck能檢測出的錯誤,FinalCheck能夠給出關于錯誤更詳細的資訊。是以,我們可以把FinalCheck認為是ActiveCheck的功能增強版。我們付出的代價是:程式的運作速度會變慢,有時甚至會變的很慢。

要想在FinalCheck 模式下測試程式,不能使用VC++內建開發環境提供的編譯連接配接器來構造程式,而必須要使用BoundsChecker提供的編譯連接配接器來編譯連接配接程式。當 BoundsChecker的編譯連接配接器編譯連接配接程式時,會向程式中插裝一些錯誤檢測代碼,這也就是FinalCheck能夠比ActiveCheck找到更多錯誤的原因。

下面就

介紹一下如何在FinalCheck模式下對程式進行測試:

1在VC++內建開發環境中打開你所要測試的項目。

2由于要使用BoundsChecker的編譯連接配接器重新編譯連接配接程式,是以我們為BoundsChecker獨自構造一個檔案夾。在VC++內建開發環境中,具體操作方法是:

A)點選[ Build/Configurations...]菜單指令。

B)在彈出的對話框中點選 Add 按鈕。在Configuration 編輯框中添入你為BoundsChecker建立的檔案夾的名稱,這個名稱是任意的,比如我們取名為BoundChecker。

C)在 Copy settings from組合框中選中 XXX—Win32 Debug項,然後點選OK按鈕,接着點選Close按鈕。

現在,我們已經為FinalCheck構造好了一個檔案夾。

3 點選[Build/Set Active Configuration…] 菜單指令,選中你剛才為BoundsChecker建的檔案夾, 然後點選OK按鈕。這樣BoundsChecker編譯連接配接程式時生成的中間檔案、可執行程式,都會被放到該檔案夾下。

4選擇[BoundsChecker/Rebuild All with BoundsChecker] 菜單指令,對程式重新進行編譯連接配接,也就是在這時,BoundsChecker向被測程式的代碼中加入了錯誤檢測碼。編譯連接配接完成後,BoundsChecker會在你為BoundsChecker構造的檔案夾中生成可執行檔案。

在FinalCheck模式下對程式進行檢測的準備工作都已經做好,這時可以啟動程式開始測試了,

操作步驟與在ActiveChecker模式下沒什麼差別。具體步驟如下:

  1. 確定VC++內建開發環境中[BoundsChecker/ Integrated Debugging]菜單項和[BoundsChecker/Report Errors and Events]菜單項處于選中狀态。
  2. 點選[ Build\Start Debug]菜單,選中“Go” 菜單項。程式開始在Debug狀态下運作。
  3. 按照你制定好的測試用例,對程式進行操作。
  4. 當BoundsChecker檢測到了錯誤時,會彈出視窗向你彙報,你可以當時就進行處理,也可以等到你的操作全部完成,退出程式之後再對列出的這些錯誤進行分析。這完全取決于你是否選中了[BoundsChecker/Report Errors Immediately] 菜單項。
  5. 退出程式後,BoundsChecker會給出錯誤檢測結果清單。該錯誤清單與ActiveChecker給出的錯誤清單的檢視方法完全一樣。隻不過這個清單中所報告的資訊會更多、更詳細一些。

好了,BoundsChecker在FinalCheck模式下的使用也介紹完了。ActiveChecker、FinalCheck這兩種模式,比較而言各有長短。ActiveChecker使用友善,隻需在Debug狀态下直接運作程式即可,并且程式的運作速度較快,但檢測的錯誤種類有限;FinalCheck模式下,需要使用BoundsChecker的編譯連接配接器重新編譯連接配接生成可執行程式,并且程式的運作速度比較慢,但檢測的錯誤種類、提供的錯誤相關資訊要多于ActiveChecker。是以,何時使用何種模式,應根據當時的具體情況而定。

3.3 檢測Win32 API函數的相容性

BoundsChecker還提供了一個功能——檢測程式中使用的Win32 API函數在不同平台上的相容性。該功能與前面提到的ActiveChecker、FinalCheck模式沒有什麼關系,它是獨立的一個功能。

雖然大多數Win32 API函數都适用于Win95、Win98、Win2000、WinNT等不同的Windows作業系統平台,但并不是所有的API函數都滿足這種情況。你可能不知不覺的使用了在某一個平台下允許,在另一個平台下卻不允許使用的API函數,而項目的要求是:程式能夠在這兩種平台下運作。 BoundsChecker提供的這個檢測Win32 API函數相容性的功能,恰好能夠處理這個問題。

該功能的使用方法如下:

啟動[BoundsChecker/View/Compliance Report]菜單指令,如下圖所示:

NuMega Devpartner 動态測試工具-白盒測試

圖3-5 啟動Win32 API函數相容性檢測功能

會彈出下面的視窗:

NuMega Devpartner 動态測試工具-白盒測試

圖3-6Win32 API函數相容性檢測功能

在對話框中選擇程式承諾能夠運作的平台,以及被要求遵從的其他标準(标準C和擴充的标準C),點選“OK”按鈕,BoundChecker會給出相容性檢測報告。

3.4 忽略錯誤

在某些情況下,我們需要忽略BoundsChecker報告的一些錯誤,這些情況包括:

1 誤報。BoundsChecker 指定程式中的某段代碼存在錯誤,但經過我們的仔細檢查,證明程式确實沒有這個錯誤,這是BoundsChecker的誤報。工具畢竟是工具,它隻能依照為它制定的算法行事,是以會有誤報的情形發生。但千萬不要輕易認定某一個錯誤為誤報,一定要對錯誤進行仔細的分析,确定是真正的誤報。

2第三方的代碼。BoundsChecker指定的錯誤發生位置在第三方提供的代碼中,包括第三方提供的程式庫、DLL、OCX等。對于這種情況,我們也要先進行認真的檢查,确定不是由于我們錯誤的使用第三方的代碼引起的。如果最後确定不是我們的原因,則這樣的錯誤報告可以忽略。

3.5 其他

還有一點需要強調,使用BoundsChecker對程式進行測試時,需要有程式的源代碼。如果沒有源碼,BoundsChecker雖然也可以打開EXE檔案将其執行起來,但得出的測試結果經常是不正确的,是以也就沒有太大的意義。

另外,除了可以在VC++內建開發環境中使用BoundChecker外,從 [開始菜單] 中啟動BoundChecker,然後打開經BoundChecker編譯連接配接生成的可執行檔案,也可以對程式進行測試,操作方法與內建到VC++內建開發環境中的BoundChecker的操作方法是一樣的,在此就不贅述了。

至此,BoundChecker所提供的功能全部介紹完了。

4 TrueCoverage

覆寫率對于測試來說是一項重要的資料。在我們執行了針對一個功能子產品的所有測試用例後,非常想了解測試對于子產品代碼的覆寫情況,也就是測試覆寫率到達了多少,以此來判斷測試工作是否可以結束,如果還未達到測試目标,如何進一步補充測試用例。

對于這些問題,如果沒有覆寫率統計工具的幫助,而想通過手工來進行,幾乎是不可能的。

TrueCoverage的功能就是統計測試覆寫率,它恰好能為我們就上面這個問題提供幫助。TrueCoverage給出的覆寫率是“語句覆寫”,是最低覆寫強度的覆寫率,是以我們測試的項目,用TrueCoverage統計後,應盡量達到100%的覆寫。

TrueCoverage的應用階段為單元測試階段和內建測試階段。

和BoundChecker一樣,TrueCoverage安裝成功後,在你的VC++內建開發環境中,會多出一個名為TrueCoverage的菜單,如下圖所示:

NuMega Devpartner 動态測試工具-白盒測試

圖4-1 TrueCoverage在VC++內建開發環境中添加的菜單

這說明,TrueCoverage已經完好的內建到VC++內建開發環境中了。

下面開始介紹TrueCoverage的具體使用步驟。

4.1 使用TrueCoverage

TrueCoverage使用步驟:

1 在VC++內建開發環境中,打開你所要測試的項目。

2 為TrueCoverage構造一個檔案夾,方法為:

首先,點選[ Build/Configurations...]菜單指令。

其次,在彈出的對話框中點選 Add 按鈕。

然後,在Configuration 編輯框中添入你為TrueCoverage建立的檔案夾的名稱,這個名稱是任意的,比如我們叫做TrueCoverage。

最後,在 Copy settings from組合框中選中 XXX—Win32 Debug項,然後點選OK按鈕,接着點選Close按鈕。

現在,我們已經為TrueCoverage構造好了一個檔案夾。

3 點選[Build/Set Active Configuration…] 菜單指令,選中你剛才為TrueCoverage建的檔案夾,然後點選OK按鈕。

4 選擇[TrueCoverage/Rebuild All with TrueCoverage] 菜單指令,用TrueCoverage的編譯連接配接器對程式重新進行編譯連接配接。TrueCoverage對程式進行編譯連接配接時生成的中間檔案、可執行程式,會放到你剛才為TrueCoverage建立的檔案夾下。在這個編譯連接配接過程中,TrueCoverage向可執行程式中插入了一些資訊,這也就是 TrueCoverage能夠跟蹤、統計測試覆寫率的原因。

5點選[TrueCoverage/Run with TrueCoverage] 菜單指令,TrueCoverage被啟動,接着你的程式也被執行起來。現在就可以按照事先已經制定好的測試用例,在程式中逐個進行執行了, TrueCoverage會在背景記錄程式的執行覆寫情況。

在TrueCoverage界面中有一個工具條,我們有必要在這裡對它做一下說明。如下所示:

NuMega Devpartner 動态測試工具-白盒測試

圖4-2 運作控制工具條

這個工具條在程式運作起來後,會由不可用狀态變為可用狀态。工具條上各按鈕功能為:

按鈕1:如果在程式的運作過程中你按下了該按鈕,則覆寫率的統計隻計算到此,你還可以繼續操作程式,但此時對程式的任何操作都不再計入到覆寫率統計中去了。

按鈕2:如果在程式的運作過程中你按下了該按鈕,則TrueCoverage會馬上顯示截止到目前為止的測試覆寫率情況。之後你可以繼續操作程式,TrueCoverage會繼續在背景記錄程式的執行覆寫情況。

按鈕3:如果在程式的運作過程中你按下了該按鈕,則TrueCoverage會清除在這之前的覆寫資料,使各項覆寫率的資料均為零。你可以繼續操作,TrueCoverage在背景從零開始重新記錄程式的執行覆寫情況。

6 當你退出程式時,TrueCoverage會顯示本次操作結束後,程式的執行覆寫情況,包括:整個可執行程式的覆寫情況、每個代碼檔案的覆寫情況、每個代碼檔案中每個函數的覆寫情況,對于這些覆寫率統計結果,可以檔案的形式進行儲存。要想再次執行程式,點選TrueCoverage 中的[Program/ Start]菜單指令即可。

我們不太可能一次執行完所有的測試用例。TrueCoverage 為我們想到了這一點。在我們每次使用TrueCoverage運作起程式,執行了一些用例,關閉程式,并儲存這一次的覆寫率統計結果後, TrueCoverage會詢問你是否将本次的測試結果合并到總的覆寫率統計結果中去,一般情況下,我們合并進去就可以了。

下面介紹一下TrueCoverage的界面,按圖中的編号分别給出說明。

NuMega Devpartner 動态測試工具-白盒測試

圖4-3 TrueCoverage的運作界面

1:表示程式在某一次執行結束後的測試覆寫情況。輕按兩下某一個條目,會在3、4部分的視窗中顯示關于本次覆寫率的詳細資訊。本圖中的情況,表示測試人員執行了兩次程式。

2:表示程式目前總的測試覆寫情況,是多個1合并後的結果。輕按兩下該條目,會在3、4部分的視窗中顯示關于總覆寫率的詳細資訊。

3:該視窗中顯示的資料與你目前選中的某一次或總的測試覆寫統計結果相對應(即前面說到的1、2)。該視窗中顯示的資料包括:程式的覆寫率、每個代碼檔案的覆寫率。更詳細的資訊顯示在視窗4中。

4:該視窗中顯示的資料與你在視窗3中的選擇相對應,顯示了各個函數的測試覆寫情況。用滑鼠輕按兩下某一個函數,會顯示該函數的源代碼,TrueCoverage用不同的顔色辨別執行過的和未被執行過的代碼,如下圖所示:

NuMega Devpartner 動态測試工具-白盒測試

圖4-4 TrueCoverage用不同顔色辨別執行過的和未被執行過的代碼

TrueCoverage 預設情況下,用綠色代表已執行的代碼,用紅色代表未被執行的代碼,用黑色代表不可執行的代碼(你可以通過選擇TrueCoverage的 [program/setting]菜單指令,在啟動的對話框中的setting标簽頁中進行設定,來改變這種預設情況)。通過這些資訊,我們可以有針對性的增加、修改用例,來提高測試覆寫率。

4.2 對内聯函數的處理

内聯函數雖然具有函數的形式,但其機制與函數完全不同,是以,在用TrueCoverage統計測試覆寫率時,對内聯函數需要采用不同的處理方式。

預設情況下,TrueCoverage是不會統計内聯函數的執行覆寫率的。如果你需要得到内聯函數的覆寫率資料,則需要進行一些額外的設定,具體方法是,在VC++的內建環境中選擇[TrueCoverage/TrueCoverage Setting...]菜單指令,彈出如下對話框:

NuMega Devpartner 動态測試工具-白盒測試

圖4-5 内聯函數設定

選中“Instrument inline function”複選框,點選OK。

然後選擇[TrueCoverage/Rebuild All with TrueCoverage] 菜單指令,重新進行編譯連接配接,對于這個可執行程式,TrueCoverage在其執行過程中就能夠記錄内聯函數的覆寫率資料了。

4.3 TrueCoverage與BoundsChecker的結合使用

TrueCoverage與BoundsChecker可以結合起來使用。在[BoundsChecker]和[TrueCoverage]菜單下,都有一個[Rebuild with BoundsChecker and TrueCoverage]項,通過這一菜單指令編譯連接配接生成的可執行檔案,在程式運作結束後,能同時得到TrueCoverage和BoundsChecker(FinalCheck)的檢測結果。

但這裡有一個限定,那就是:必須由BoundChecker打開該exe程式執行,或是在VC++內建開發環境中通過Debug來運作該exe。這樣在執行完程式後,能同時得到TrueCoverage和BoundsChecker(FinalCheck)的檢測結果,如果你通過TrueCoverage來執行程式,則隻會得到TrueCoverage檢測結果。這一點請注意。

4.4 其他

與BoundsChecker一樣,要使用TrueCoverage,一定要有被測程式的源代碼。如果沒有源碼,TrueCoverage無法統計覆寫率。

除了可以在VC++的內建環境中使用TrueCoverage外,從 [開始菜單] 中啟動TrueCoverage,然後打開經TrueCoverage編譯連接配接生成的可執行檔案,也可以進行覆寫率的統計,操作方法與內建到VC++內建開發環境中的TrueCoverage的操作方法一樣,在此不再贅述。

TrueCoverages的使用介紹到此結束了,該工具對于我們進行測試覆寫率統計、補充測試用例的工作很有用處。

5 TrueTime

如何提高代碼的運作效率,是開發過程中的一個重要問題。一個應用程式運作速度慢,但不容易找到究竟是在哪裡出了問題,是以查找出性能瓶頸的位置是調整代碼性能的關鍵。TrueTime 就是一個對應用程式的運作性能進行分析,查找程式性能瓶頸的工具。

TrueTime 能夠收集、顯示應用程式運作性能的相關資料,這些資料包括每個子產品(EXE、DLL、OCX等)的運作性能,每一個函數的運作性能,對于有源代碼的部分,TrueTime還可以給出每一行代碼的運作性能。通過這些資料,我們可以确定系統的性能瓶頸,進一步優化程式的性能。

值得一提的是,TrueTime 在收集應用程式運作性能資料時,使用了一種叫做“Quantum”的技術。“Quantum”技術能夠将你測試的應用程式所包含的線程的運作時間,與作業系統中同時運作着的其他應用程式的線程的運作時間區分開來計算,也就是說,TrueTime隻會計算花費在你的應用程式的線程上的時間片。這樣一來,在同一台計算機上對同一應用程式的性能測試結果,不會因為在該計算機系統中所運作的程式的多少而改變。是以,隻要程式運作的硬體條件不發生改變, TrueTime的測試結果也基本不會變化,是以TrueTime對應用程式性能測試的結果是可複現的。

TrueTime安裝成功後,在你的VC++內建開發環境中,會多出一個名為TrueTime的菜單,如下圖所示:

NuMega Devpartner 動态測試工具-白盒測試

圖5-1 TrueTime在VC++內建開發環境中添加的菜單

這說明,TrueTime已經完好的內建到VC++內建開發環境中了。

下面開始介紹TrueTime的具體使用步驟。

5.1 使用TrueTime

TrueTime使用步驟:

1在VC++內建開發環境中打開你所要測試的項目。

2 為TrueTime構造一個檔案夾 ,具體方法是:

首先,點選[ Build/Configurations...]菜單指令。

其次,在彈出的對話框中點選 Add 按鈕。

然後,在Configuration 編輯框中添入你為TrueTime建立的構造檔案夾的名稱,這個名稱是任意的。比如我們取名為TrueTime。

最後,在 Copy settings from組合框中選中 XXX—Win32 Debug項,然後點選OK按鈕,接着點選Close按鈕。

現在,我們為TrueTime構造好了一個檔案夾。

3 點選[Build/Set Active Configuration…] 菜單指令,選中你剛才為TrueTime建立的檔案夾, 然後點選OK按鈕。

4 選中[TrueTime/Rebuild All with TrueTime] 菜單指令,用TrueTime的編譯連接配接器對程式重新進行編譯連接配接。TrueTime對程式進行編譯連接配接生成的中間檔案、可執行程式,都會被放到你為 TrueTime建立的檔案夾下。在這個編譯連接配接過程中,TrueTime向可執行程式中插入了一些資訊,這也就是TrueTime能夠記錄程式運作性能的原因。

5點選[TrueTime/Run with TrueTime] 菜單指令,TrueTime被啟動,接着你的程式也被啟動并執行起來。

這時,按照事先制定好的測試用例,執行測試用例。TrueTime會記錄下被執行到的程式代碼的性能資料。

在TrueTime界面中有一個工具條,它的外觀與我們在TrueCoverage中說到的那個工具條完全一樣,實作的功能也基本一樣,隻是在TrueCoverage中,它控制的是覆寫率,在這裡,它控制的是性能資料。我們現在來對它做一下說明。如下所示:

NuMega Devpartner 動态測試工具-白盒測試

圖5-2 運作控制工具條

這個工具條在程式運作起來後,會由不可用狀态變為可用狀态。工具條上各按鈕功能為:

按鈕1:如果在程式的運作過程中你按下了該按鈕,則性能統計隻計算到此,雖然還可以繼續操作程式,但此時對程式的任何操作都不再計入到性能統計中去了。

按鈕2:如果在程式的運作過程中你按下了該按鈕,則TrueTime會馬上顯示截止到目前為止的性能統計情況。之後你可以繼續操作程式,TrueTime會繼續在背景記錄程式的性能資料。

按鈕3:如果在程式的運作過程中你按下了該按鈕,則TrueTime會清除在這之前所記錄的性能資料,使各項性能資料為零。你可以繼續操作,TrueTime在背景從零開始重新記錄程式的性能資料。

6當你退出程式時,TrueTime會顯示本次操作過程中被執行到的子產品、函數、代碼行的執行性能資料。要想對程式開始一次新的性能統計,點選TrueTime 中的[Program / Start]菜單指令即可。

TrueTime檢測結果的界面如下:

NuMega Devpartner 動态測試工具-白盒測試

圖5-3 TrueTime的運作界面

區域1:

列出了多次運作應用程式後,得到的多個性能檢測結果。輕按兩下某一項,會在區域2、區域3中顯示應用程式在這一次運作過程中的詳細性能資料。

區域2:

該視窗中顯示的資料與你在區域1中選中的某一次性能檢測相對應。視窗中顯示的資料以子產品(exe、dll等)為機關,列出了程式在某一次執行過程中,各子產品的性能資料。對于各子產品更為詳細的性能資料,顯示在區域3中。

區域3:

該視窗中顯示的資料與你在區域2中的選擇相對應,顯示了子產品中各個函數的性能資料。在區域3中有三個标簽頁——Function List标簽頁、Source标簽頁、Session Summary标簽頁。每個标簽頁中都列出了一組性能資料。其實要使用TrueTime,也就是要了解這些性能資料的含義。下面按照标簽頁對各項性能資料的含義進行解釋:

Function List标簽頁

在Function List标簽頁中,用滑鼠左鍵輕按兩下某一個函數,會彈出一個對話框,如下圖所示:

NuMega Devpartner 動态測試工具-白盒測試

圖5-4 性能資料檢視對話框

通過該對話框,能夠檢視該函數的父函數(調用該函數的函數)、子函數(被該函數調用的函數)的性能資訊。

Function List标簽頁列出了標明子產品所包含的函數的性能資料,這些資料包括:

Function Name——函數名稱。

% in Function——這是一個百分比,分子為該函數執行的時間,分母為系統從開始運作到結束的時間。

% with Children —— 這是一個百分比,分子為該函數執行的時間,其中包括在該函數中又調用的子函數的運作時間,分母為系統從開始運作到結束的時間。

Called——函數在本次的執行過程中被調用的次數。

Image——函數所在的子產品名稱(子產品指EXE、DLL、OCX等)。

% in Image——這是一個百分比,分子為該函數執行的時間,分母為該函數所在的子產品(EXE、DLL、OCX)運作的時間。

Average——函數多次運作時的平均執行時間,其中不包括該函數調用的子函數的運作時間。

First——函數第一次執行所耗費的時間。

Minimum——函數的多次執行中,耗費時間最短的那一次所用的時間。

Maximum——函數的多次執行中,耗費時間最長的那一次所用的時間。

Average with Children——函數被多次執行時,平均執行時間,其中包括該函數調用的子函數運作的時間。

Real——函數的平均執行時間,包括該函數調用的子函數所運作的時間,除此之外,還包括了花費在系統中同時運作着的其他應用程式的線程所耗費的時間。

Address——函數的入口位址。

Source标簽頁

Source标簽頁列出了標明子產品的指定源檔案所包含的各行程式代碼的性能資料,這些資料包括:

Count——該行代碼在測試過程中被執行的次數。

% of Function——這是一個百分比,分子為該行代碼執行的時間,分母為該函數執行的時間。

% With Children——這也是一個百分比,分子為該行代碼執行的時間,分母為系統從開始運作到結束的時間。

Time——在系統的運作過程中,該行代碼運作時間的累計和。

Functions——該行代碼調用的函數的數量。

Line#——代碼所在行的行号。

Source——源代碼。

Session Summary标簽頁

Session Summarye标簽頁列出了該次性能統計的概要資訊,内容很好了解,在此就不詳細介紹了。

TrueTime為性能資料提供了四種不同的機關,分别是:CPU時鐘周期、微妙、毫秒、秒。我們可通過TrueTime中的[View/Scale]菜單項進行設定,如下:

NuMega Devpartner 動态測試工具-白盒測試

圖5-5 性能資料機關設定菜單

在菜單中選中哪一項,性能資料就會以該時間機關顯示。

5.2 其他

TrueTime可以收集沒有源碼部分(比如第三方的DLL、OCX等)的運作性能資料,但如果我們想獲得某一個子產品的詳細運作性能資料,還是需要該子產品的源代碼。

除了可以在VC++內建環境中使用TrueTime外,從 [開始菜單] 中啟動TrueTime,然後打開經TrueTime編譯連接配接生成的可執行檔案,也可以進行性能資料的收集,操作方法與內建到VC++內建開發環境中的TrueTime的操作方法一樣,在此不再贅述。

TrueTime的介紹到此就結束了。

6 結束