我在本文中詳細介紹了測試工具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版的使用說明,不在本文擋的介紹範圍以內,這一點請注意。
NuMega的安裝很簡單。得到NuMega安裝程序後,點擊setup.exe進行安裝便可。在安裝過程當中不須要什麼特殊的設置。
不過有一點須要說明,在安裝NuMega以前,應該確保你的機器上已經安裝好了Visual C++,由於只有這樣才能使NuMega成功的集成到Visual C++開發環境中去。
好了,下面咱們分三個部分,分別介紹BoundsChecker、TrueCoverage、TrueTime的使用方法。
BoundsChecker 是一個Run-Time錯誤檢測工具,它主要定位程序在運行時期發生的各類錯誤。BoundsChecker能檢測的錯誤包括:
1))一、指針操做和內存、資源泄露錯誤,好比:
內存泄露;
資源泄露;
對指針變量的錯誤操做。
2二、內存操做方面的錯誤,好比:
內存讀、寫溢出;
使用未初始化的內存。
3三、API函數使用錯誤
圖3-1 BoundsChecker在VC++集成開發環境中添加的菜單
BoundsChecker 已經很是無缺的集成到VC++集成開發環境中了。
使用BoundsChecker對程序的運行時錯誤進行檢測,有兩種使用模式可供選擇。一種模式叫作ActiveCheck,一種模式叫作FinalCheck。下面分別進行介紹。
ActiveCheck是BoundsChecker提供的一種方便、快捷的錯誤檢測模式,它能檢測的錯誤種類有限,只包括:內存泄露錯誤、資源泄露錯誤、API函數使用錯誤。
要想使用ActiveCheck模式來檢測程序的運行時錯誤,只需在VC++集成開發環境中打開BoundsChecker功能,而後從調試狀態運行程序便可。此時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],以下圖所示:
圖3-2 關於[BoundsChecker / Report Errors Immediately] 菜單項
該菜單項對於ActiveCheck 模式,以及下面就要介紹的FinalCheck模式的做用是同樣的,即:若是不選中該項,則BoundsChecker會記錄程序運行過程當中發現的各類錯誤,直到程序結束後再進行報告;當選中該菜單項時,在程序的運行過程當中,一旦BoundsChecker發現錯誤,會立刻彈出以下的對話框進行提示:
圖3-3 錯誤報告對話框
下面按圖中標註的數字序號解釋一下對話框中各個按鈕的功能:
按鈕1:點擊該按鈕,則表示先暫時不理會這個錯誤,繼續執行程序。
按鈕2:點擊該按鈕,則會立刻跳轉到出現問題的代碼行處。處理完問題後,點擊[Build/ Start Debug/Go]菜單項,能夠繼續執行程序,進行檢測。
按鈕3:點擊該按鈕,則將該錯誤添加到被忽略的錯誤列表中去,當再次出現這個問題時,BoundsChecker將不會進行報告。
按鈕4:點擊該按鈕,則當即終止程序的執行。
按鈕5:點擊該按鈕,會顯示當前內存的申請、使用狀況。
按鈕6:點擊該按鈕,會獲得當前這個錯誤的幫助信息。
按鈕七、8: 這兩個按鈕與[BoundsChecker\Report Errors Immediately]和[BoundsChecker\ Report Errors and Event] 菜單命令的功能是徹底同樣的,在此再也不贅述。
按鈕9:點擊該按鈕,會顯示/隱藏與該錯誤有關的函數調用堆棧狀況,以及具體的出錯代碼行的位置。
是否選中[BoundsChecker/Report Errors Immediately]菜單項,徹底取決於你本身的喜愛,以及測試時的具體狀況。若是你想要BoundsChecker在程序運行過程當中實時向你彙報發現的錯誤,那麼你就選中這個菜單項;若是想等到操做結束後,再對操做過程當中BoundsChecker發現的錯誤統一進行分析,就沒必要選中這個菜單項。我在日常使用過程當中更偏向於使用後一種。
在你操做所有結束,退出程序後,
BoundsChecker 會顯示一個所發現錯誤的列表。咱們須要對列表中羅列的錯誤進行分析,來肯定錯誤的緣由和位置。
在錯誤檢測結果列表中,羅列出了在程序的執行過程當中ActiveCheck檢測到的全部的內存泄露、資源泄露和API函數使用錯誤的相關信息。以下圖所示:
圖3-4 錯誤檢測結果
在左邊的窗口中,逐條列出了程序在內存、資源、API 函數使用上的問題,包括:該問題的種類,該問題發生的次數,若是是內存泄露,損失了多少內存,以及發生該問題的代碼位置等等。當你用鼠標單擊選中某一條記錄時,在右邊的窗口中會顯示出與該條錯誤記錄相對應的函數調用堆棧狀況。當你用鼠標雙擊某一條錯誤記錄時,會定位到引起該錯誤的源代碼處。
好了,BoundsChecker在ActiveCheck模式下的使用方法至此介紹完了,是否是很簡單?
在ActiveCheck模式下檢測程序時,程序的運行速度基本不受影響,但其缺點是檢測的錯誤種類有限,即只能檢查出內存泄露錯誤、資源泄露錯誤、API函數使用錯誤。BoundsChecker 提供了另一種檢測錯誤的模式—— FinalCheck,也就是咱們在前面提到的BoundsChecker的第二種使用模式。 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模式下沒什麼區別。具體步驟以下:
好了,BoundsChecker在FinalCheck模式下的使用也介紹完了。ActiveChecker、FinalCheck這兩種模式,比較而言各有長短。ActiveChecker使用方便,只需在Debug狀態下直接運行程序便可,而且程序的運行速度較快,但檢測的錯誤種類有限;FinalCheck模式下,須要使用BoundsChecker的編譯鏈接器從新編譯鏈接生成可執行程序,而且程序的運行速度比較慢,但檢測的錯誤種類、提供的錯誤相關信息要多於ActiveChecker。因此,什麼時候使用何種模式,應根據當時的具體狀況而定。
BoundsChecker還提供了一個功能——檢測程序中使用的Win32 API函數在不一樣平臺上的兼容性。該功能與前面提到的ActiveChecker、FinalCheck模式沒有什麼關係,它是獨立的一個功能。
雖然大多數Win32 API函數都適用於Win9五、Win9八、Win2000、WinNT等不一樣的Windows操做系統平臺,但並非全部的API函數都知足這種狀況。你可能不知不覺的使用了在某一個平臺下容許,在另外一個平臺下卻不容許使用的API函數,而項目的要求是:程序可以在這兩種平臺下運行。 BoundsChecker提供的這個檢測Win32 API函數兼容性的功能,剛好可以處理這個問題。
該功能的使用方法以下:
啓動[BoundsChecker/View/Compliance Report]菜單命令,以下圖所示:
圖3-5 啓動Win32 API函數兼容性檢測功能
會彈出下面的窗口:
圖3-6Win32 API函數兼容性檢測功能
在對話框中選擇程序承諾可以運行的平臺,以及被要求聽從的其餘標準(標準C和擴展的標準C),點擊「OK」按鈕,BoundChecker會給出兼容性檢測報告。
在某些狀況下,咱們須要忽略BoundsChecker報告的一些錯誤,這些狀況包括:
1 誤報。BoundsChecker 指定程序中的某段代碼存在錯誤,但通過咱們的仔細檢查,證明程序確實沒有這個錯誤,這是BoundsChecker的誤報。工具畢竟是工具,它只能依照爲它制定的算法行事,因此會有誤報的情形發生。但千萬不要輕易認定某一個錯誤爲誤報,必定要對錯誤進行仔細的分析,肯定是真正的誤報。
2第三方的代碼。BoundsChecker指定的錯誤發生位置在第三方提供的代碼中,包括第三方提供的程序庫、DLL、OCX等。對於這種狀況,咱們也要先進行認真的檢查,肯定不是因爲咱們錯誤的使用第三方的代碼引發的。若是最後肯定不是咱們的緣由,則這樣的錯誤報告能夠忽略。
還有一點須要強調,使用BoundsChecker對程序進行測試時,須要有程序的源代碼。若是沒有源碼,BoundsChecker雖然也能夠打開EXE文件將其執行起來,但得出的測試結果常常是不正確的,所以也就沒有太大的意義。
另外,除了能夠在VC++集成開發環境中使用BoundChecker外,從 [開始菜單] 中啓動BoundChecker,而後打開經BoundChecker編譯鏈接生成的可執行文件,也能夠對程序進行測試,操做方法與集成到VC++集成開發環境中的BoundChecker的操做方法是同樣的,在此就不贅述了。
至此,BoundChecker所提供的功能所有介紹完了。
覆蓋率對於測試來講是一項重要的數據。在咱們執行了針對一個功能模塊的全部測試用例後,很是想了解測試對於模塊代碼的覆蓋狀況,也就是測試覆蓋率到達了多少,以此來判斷測試工做是否能夠結束,若是還未達到測試目標,如何進一步補充測試用例。
對於這些問題,若是沒有覆蓋率統計工具的幫助,而想經過手工來進行,幾乎是不可能的。
TrueCoverage的功能就是統計測試覆蓋率,它剛好能爲咱們就上面這個問題提供幫助。TrueCoverage給出的覆蓋率是「語句覆蓋」,是最低覆蓋強度的覆蓋率,因此咱們測試的項目,用TrueCoverage統計後,應儘可能達到100%的覆蓋。
TrueCoverage的應用階段爲單元測試階段和集成測試階段。
和BoundChecker同樣,TrueCoverage安裝成功後,在你的VC++集成開發環境中,會多出一個名爲TrueCoverage的菜單,以下圖所示:
圖4-1 TrueCoverage在VC++集成開發環境中添加的菜單
這說明,TrueCoverage已經無缺的集成到VC++集成開發環境中了。
下面開始介紹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界面中有一個工具條,咱們有必要在這裏對它作一下說明。以下所示:
圖4-2 運行控制工具條
這個工具條在程序運行起來後,會由不可用狀態變爲可用狀態。工具條上各按鈕功能爲:
按鈕1:若是在程序的運行過程當中你按下了該按鈕,則覆蓋率的統計只計算到此,你還能夠繼續操做程序,但此時對程序的任何操做都再也不計入到覆蓋率統計中去了。
按鈕2:若是在程序的運行過程當中你按下了該按鈕,則TrueCoverage會立刻顯示截止到目前爲止的測試覆蓋率狀況。以後你能夠繼續操做程序,TrueCoverage會繼續在後臺記錄程序的執行覆蓋狀況。
按鈕3:若是在程序的運行過程當中你按下了該按鈕,則TrueCoverage會清除在這以前的覆蓋數據,使各項覆蓋率的數據均爲零。你能夠繼續操做,TrueCoverage在後臺從零開始從新記錄程序的執行覆蓋狀況。
6 當你退出程序時,TrueCoverage會顯示本次操做結束後,程序的執行覆蓋狀況,包括:整個可執行程序的覆蓋狀況、每一個代碼文件的覆蓋狀況、每一個代碼文件中每一個函數的覆蓋狀況,對於這些覆蓋率統計結果,能夠文件的形式進行保存。要想再次執行程序,點擊TrueCoverage 中的[Program/ Start]菜單命令便可。
咱們不太可能一次執行完全部的測試用例。TrueCoverage 爲咱們想到了這一點。在咱們每次使用TrueCoverage運行起程序,執行了一些用例,關閉程序,並保存這一次的覆蓋率統計結果後, TrueCoverage會詢問你是否將本次的測試結果合併到總的覆蓋率統計結果中去,通常狀況下,咱們合併進去就能夠了。
下面介紹一下TrueCoverage的界面,按圖中的編號分別給出說明。
圖4-3 TrueCoverage的運行界面
1:表示程序在某一次執行結束後的測試覆蓋狀況。雙擊某一個條目,會在3、4部分的窗口中顯示關於本次覆蓋率的詳細信息。本圖中的狀況,表示測試人員執行了兩次程序。
2:表示程序當前總的測試覆蓋狀況,是多個1合併後的結果。雙擊該條目,會在3、4部分的窗口中顯示關於總覆蓋率的詳細信息。
3:該窗口中顯示的數據與你當前選中的某一次或總的測試覆蓋統計結果相對應(即前面說到的1、2)。該窗口中顯示的數據包括:程序的覆蓋率、每一個代碼文件的覆蓋率。更詳細的信息顯示在窗口4中。
4:該窗口中顯示的數據與你在窗口3中的選擇相對應,顯示了各個函數的測試覆蓋狀況。用鼠標雙擊某一個函數,會顯示該函數的源代碼,TrueCoverage用不一樣的顏色標識執行過的和未被執行過的代碼,以下圖所示:
圖4-4 TrueCoverage用不一樣顏色標識執行過的和未被執行過的代碼
TrueCoverage 默認狀況下,用綠色表明已執行的代碼,用紅色表明未被執行的代碼,用黑色表明不可執行的代碼(你能夠經過選擇TrueCoverage的 [program/setting]菜單命令,在啓動的對話框中的setting標籤頁中進行設置,來改變這種默認狀況)。經過這些信息,咱們能夠有針對性的增長、修改用例,來提升測試覆蓋率。
內聯函數雖然具備函數的形式,但其機制與函數徹底不一樣,因此,在用TrueCoverage統計測試覆蓋率時,對內聯函數須要採用不一樣的處理方式。
默認狀況下,TrueCoverage是不會統計內聯函數的執行覆蓋率的。若是你須要獲得內聯函數的覆蓋率數據,則須要進行一些額外的設置,具體方法是,在VC++的集成環境中選擇[TrueCoverage/TrueCoverage Setting...]菜單命令,彈出以下對話框:
圖4-5 內聯函數設置
選中「Instrument inline function」複選框,點擊OK。
而後選擇[TrueCoverage/Rebuild All with TrueCoverage] 菜單命令,從新進行編譯鏈接,對於這個可執行程序,TrueCoverage在其執行過程當中就可以記錄內聯函數的覆蓋率數據了。
TrueCoverage與BoundsChecker能夠結合起來使用。在[BoundsChecker]和[TrueCoverage]菜單下,都有一個[Rebuild with BoundsChecker and TrueCoverage]項,經過這一菜單命令編譯鏈接生成的可執行文件,在程序運行結束後,能同時獲得TrueCoverage和BoundsChecker(FinalCheck)的檢測結果。
但這裏有一個限定,那就是:必須由BoundChecker打開該exe程序執行,或是在VC++集成開發環境中經過Debug來運行該exe。這樣在執行完程序後,能同時獲得TrueCoverage和BoundsChecker(FinalCheck)的檢測結果,若是你經過TrueCoverage來執行程序,則只會獲得TrueCoverage檢測結果。這一點請注意。
與BoundsChecker同樣,要使用TrueCoverage,必定要有被測程序的源代碼。若是沒有源碼,TrueCoverage沒法統計覆蓋率。
除了能夠在VC++的集成環境中使用TrueCoverage外,從 [開始菜單] 中啓動TrueCoverage,而後打開經TrueCoverage編譯鏈接生成的可執行文件,也能夠進行覆蓋率的統計,操做方法與集成到VC++集成開發環境中的TrueCoverage的操做方法同樣,在此再也不贅述。
TrueCoverages的使用介紹到此結束了,該工具對於咱們進行測試覆蓋率統計、補充測試用例的工做頗有用處。
如何提升代碼的運行效率,是開發過程當中的一個重要問題。一個應用程序運行速度慢,但不容易找到到底是在哪裏出了問題,因此查找出性能瓶頸的位置是調整代碼性能的關鍵。TrueTime 就是一個對應用程序的運行性能進行分析,查找程序性能瓶頸的工具。
TrueTime 可以收集、顯示應用程序運行性能的相關數據,這些數據包括每一個模塊(EXE、DLL、OCX等)的運行性能,每個函數的運行性能,對於有源代碼的部分,TrueTime還能夠給出每一行代碼的運行性能。經過這些數據,咱們能夠肯定系統的性能瓶頸,進一步優化程序的性能。
值得一提的是,TrueTime 在收集應用程序運行性能數據時,使用了一種叫作「Quantum」的技術。「Quantum」技術可以將你測試的應用程序所包含的線程的運行時間,與操做系統中同時運行着的其餘應用程序的線程的運行時間區分開來計算,也就是說,TrueTime只會計算花費在你的應用程序的線程上的時間片。這樣一來,在同一臺計算機上對同一應用程序的性能測試結果,不會由於在該計算機系統中所運行的程序的多少而改變。因此,只要程序運行的硬件條件不發生改變, TrueTime的測試結果也基本不會變化,因此TrueTime對應用程序性能測試的結果是可復現的。
TrueTime安裝成功後,在你的VC++集成開發環境中,會多出一個名爲TrueTime的菜單,以下圖所示:
圖5-1 TrueTime在VC++集成開發環境中添加的菜單
這說明,TrueTime已經無缺的集成到VC++集成開發環境中了。
下面開始介紹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中,它控制的是覆蓋率,在這裏,它控制的是性能數據。咱們如今來對它作一下說明。以下所示:
圖5-2 運行控制工具條
這個工具條在程序運行起來後,會由不可用狀態變爲可用狀態。工具條上各按鈕功能爲:
按鈕1:若是在程序的運行過程當中你按下了該按鈕,則性能統計只計算到此,雖然還能夠繼續操做程序,但此時對程序的任何操做都再也不計入到性能統計中去了。
按鈕2:若是在程序的運行過程當中你按下了該按鈕,則TrueTime會立刻顯示截止到目前爲止的性能統計狀況。以後你能夠繼續操做程序,TrueTime會繼續在後臺記錄程序的性能數據。
按鈕3:若是在程序的運行過程當中你按下了該按鈕,則TrueTime會清除在這以前所記錄的性能數據,使各項性能數據爲零。你能夠繼續操做,TrueTime在後臺從零開始從新記錄程序的性能數據。
6當你退出程序時,TrueTime會顯示本次操做過程當中被執行到的模塊、函數、代碼行的執行性能數據。要想對程序開始一次新的性能統計,點擊TrueTime 中的[Program / Start]菜單命令便可。
TrueTime檢測結果的界面以下:
圖5-3 TrueTime的運行界面
區域1:
列出了屢次運行應用程序後,獲得的多個性能檢測結果。雙擊某一項,會在區域二、區域3中顯示應用程序在這一次運行過程當中的詳細性能數據。
區域2:
該窗口中顯示的數據與你在區域1中選中的某一次性能檢測相對應。窗口中顯示的數據以模塊(exe、dll等)爲單位,列出了程序在某一次執行過程當中,各模塊的性能數據。對於各模塊更爲詳細的性能數據,顯示在區域3中。
區域3:
該窗口中顯示的數據與你在區域2中的選擇相對應,顯示了模塊中各個函數的性能數據。在區域3中有三個標籤頁——Function List標籤頁、Source標籤頁、Session Summary標籤頁。每一個標籤頁中都列出了一組性能數據。其實要使用TrueTime,也就是要了解這些性能數據的含義。下面按照標籤頁對各項性能數據的含義進行解釋:
Function List標籤頁
在Function List標籤頁中,用鼠標左鍵雙擊某一個函數,會彈出一個對話框,以下圖所示:
圖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]菜單項進行設置,以下:
圖5-5 性能數據單位設置菜單
在菜單中選中哪一項,性能數據就會以該時間單位顯示。
TrueTime能夠收集沒有源碼部分(好比第三方的DLL、OCX等)的運行性能數據,但若是咱們想得到某一個模塊的詳細運行性能數據,仍是須要該模塊的源代碼。
除了能夠在VC++集成環境中使用TrueTime外,從 [開始菜單] 中啓動TrueTime,而後打開經TrueTime編譯鏈接生成的可執行文件,也能夠進行性能數據的收集,操做方法與集成到VC++集成開發環境中的TrueTime的操做方法同樣,在此再也不贅述。
TrueTime的介紹到此就結束了。
至此,NuMega for Visual C++的三個子功能——BoundChecker、TrueCoverage、TrueTime的使用方法,都已經介紹完畢。如今咱們應該作的就是使用NuMega去測試程序,在實踐中進一步深刻了解這個白盒測試工具。