AQTime教程
1 簡介
AQTime和MemProof都是AutomatedQA旗下的產品,AQTime比MemProof提供了更豐富強大的功能。該產品含有完整的性能和調試工具集,能夠收集程序運行時關鍵的性能信息和內存/資源分配信息,並提交概要報告和詳細報告,還提供所有的程序優化處理工具,囊括了自定義過濾器、圖形化的調用層次結構一直到源代碼瀏覽等內容。AQTime的特色在於它不僅是一款調試工具,還是一款性能優化工具。另外,還支持與基於SCC API的版本控制軟件集成使用。
2 使用方法
本文只針對DELPHI,其他開發語言可以參照。
2.1 下載
AQTime是一個商業軟件,你可以在官方網站上下載試用版本:
下載地址:http://www.automatedqa.com/products/aqtime/index.asp
本文使用的是AQTime 4.92 版本
2.2 安裝
直接運行安裝即可
2.3 準備
和MemProof一樣,要求目標程序帶有完整的調試信息。打開工程選項(Project-Options)
1、 Compiler面板
l 去掉Optimization(代碼優化)選項
l 選擇Stack Frames(爲所有過程函數強制生成調用堆棧)選項
l 選擇Debug information (在DCU文件中生成調試信息)選項
2、Linker面板
l 選擇Detailed(生成完整的MAP文件,包含模塊、單元、過程等地址信息)選項
l 選擇Include TD32 debug info(將調試信息生成到可執行文件)選項
該選項會導致可執行文件體積增大,但不會影響運行效率以及內存佔用,建議在正式發佈時不要帶上該選項。
3、Packages面板
如果希望使用Allocation profiler (資源分配測試方案)
去掉 Build with runtime packages
也可以不去掉該選項,但是必須使用Add Moudle把下列BPL添加進來:
VCL50.BPL - Delphi 5.
RTL60.BPL - Delphi 6.
RTL70.BPL - Delphi 7.
RTL90.BPL - Delphi 2005 for Win32.
2.4 面板簡介
Event View -事件瀏覽,查看運行過程中的事件
Moniter -監視面板,監視運行期間各個模塊的內存使用情況
Disassembler -彙編代碼面板,查看彙編代碼
Editor -代碼瀏覽窗口,如果無法瀏覽代碼,會出現路徑配置,選擇好代碼的路徑即可瀏覽
Details -詳細信息窗口,查看比報告中更詳細的內容
Call Graphic -圖表方式顯示方法調用情況
Call Tree -樹方式顯示方法調用情況
PE Reader - PE文件瀏覽窗口
2.5 開始
選擇File-New Project From Moudle 打開待測試的程序,選擇一種測試方案開始測試。AQTime共有五個大類共八種不同的測試方案,下面一一介紹:
2.5.1 Allocation(資源測試)
測試資源分配釋放情況,檢查內存泄漏。共有兩個測試方案:Allocation Profiler(內存使用剖析)和 Resource profiler(系統資源使用監測)
2.5.1.1 Allocation Profiler(內存使用剖析)
2.5.1.1.1 說明
跟蹤程序執行過程中對內存資源的使用情況,按類、對象檢測並顯示程序中對內存資源使用情況,確定明顯或潛在的內存泄露來源, 避免由此造成的程序崩潰。AQTime會跟蹤TObject繼承下來的對象的創建和刪除,以及通過內存管理函數
· GetMem, ReallocMem, FreeMem
· GetMemory, ReallocMemory, FreeMemory
· SysGetMem, SysReallocMem, SysFreeMem
分配和釋放的內存。
注意:這個方案不會跟蹤使用WINAPI創建和釋放的內存
2.5.1.1.2 測試結果報告
測試結果報告中有類和對象兩種統計報告:
類統計報告:
Class Name
|
Total Created
|
Live Count
|
Live Size
|
Total Size
|
TFont
|
8
|
1
|
36
|
288
|
Class Name -類名稱,如果是通過內存管理函數分配的內存類名爲:VCL native memory,如果選擇了Check Memory Bounds(內存邊界檢查),類名也有可能爲:Memory Overwrite Error
Total Created -程序運行期間創建的內存總數目
Live Count -當前還有多少數目內存未釋放
Live Size -當前還有多大內存未釋放
Total Size -程序運行期間創建的內存總大小
對象統計報告:
Object Name
|
Size
|
Root
|
References To
|
Address
|
Get#
|
TFont.503
|
60
|
False
|
0
|
0x02CA1D9C
|
1
|
Object Name -對象名稱,對象名稱的命名規則爲:Class Name + period + number,如:TFont.503 代表:第503個被創建的TFont對象。
Size -內存泄漏的大小
Root -爲True代表對象可能屬於一個全局變量、本地變量或者函數的參數;爲False代表對象是另一個對象的屬性
References To -當前對象共關聯了多少個其他對象
Address -對象地址
Get# -當運行過程中使用了Run-Get Results手工獲取報告時,Get#代表當前報告屬於第幾次Get Results所獲得的報告。(筆者多次使用Get Results後,所有結果依然爲1,奇怪~~)
2.5.1.2 Resource profiler(系統資源使用監測)
2.5.1.2.1 說明
跟蹤程序運行期間,對操作系統資源(如fonts, brushes, bitmaps, and other graphic components, registry, COM objects, print spooler, etc.)的使用情況(如某時間片內,程序本身開銷的系統資源、因這些資源帶來的內存和CPU開銷、來自於這些資源使用中出現的錯誤)使檢測者很容易獲知在程序運行期間與之相關係統資源的分配和使用情況。
2.5.1.2.2 測試結果報告
測試結果報告中有類、對象和錯誤三種統計報告:
類統計報告:
Module Name
|
Class Name
|
Live Count
|
Total Created
|
Live Size
|
Total Size
|
Image
|
PROJECT1.EXE
|
TLS
|
3
|
13
|
0
|
0
|
|
Module Name -分配這塊資源的模塊
Image -資源類型的圖標
注:其他類型在上面已經介紹過了,不再重複。後面也遵照這條說明
對象統計報告:
Module Name
|
Class Name
|
Object Name
|
Get#
|
Image
|
PROJECT1.EXE
|
TLS
|
TLS.13
|
1
|
|
2.5.2 Coverage(覆蓋率測試)
覆蓋率測試,共有一個測試方案:Coverage profiler(代碼覆蓋率分析)
2.5.2.1 Coverage profiler(代碼覆蓋率分析)
2.5.2.1.1 說明
代碼覆蓋率分析,測試出代碼在運行過程中的執行情況。它提供routine 和 line兩種級別,可以幫助查找出程序中的無用代碼。
2.5.2.1.2 測試級別
AQTime共有3種測試級別:routine, line 和 class。不同的測試方案中支持的級別不同,routine, line 之在Performance 和 Coverage中支持;class只在Allocation中支持。其他測試方案則不支持測試級別的選擇。選擇測試方案可以在Areas面板中選擇。
Routine -按方法,以方法或函數爲單位
Line -按行,以代碼行爲單位
Class -按類,以類爲單位
2.5.2.1.3 測試結果報告
測試報告中有三種類型:方法、模塊和源碼文件。每種類型按照線程劃分報告,每個線程有一個報告結果。
方法統計報告:
Routine Name
|
Hit Count
|
Total Lines
|
Lines Uncovered
|
% Covered
|
Mark
|
TForm1::FormCreate
|
1
|
5
|
0
|
100.00 %
|
|
Routine Name -方法名稱
Hit Count -方法執行時被記錄的次數。這個屬性不一定完全等於這個方法被運行的次數,如果測試過程中選擇了Run-Disable Profiles停止記錄的話,Hit Count將不會增加計數,而是增加Skip Count計數,所以,一個方法的完整運行次數應該等於:Hit Count + Skip Count
Total Lines -方法中總的代碼行數,如果沒有選擇Line測試級別的話,將不會有統計結果。(注意代碼的行數統計包括方法的Begin End,也就是說一個空的過程的代碼行數也會有2行)
Lines Uncovered -方法中未被執行的代碼行數
% Covered -代碼覆蓋率=(Total Lines-Lines Uncovered)/ Total Lines
Mark -該方法在運行期間是否被運行過
模塊統計報告:
Module Name
|
Hit Count
|
% Covered
|
Project1.exe
|
25209
|
75.00 %
|
源碼文件統計報告:
File Name
|
Hit Count
|
% Covered
|
Unit1.pas
|
2
|
71.43 %
|
2.5.3 Performance
性能測試,共有一個測試方案:Performance profiler(代碼層或應用程序層的性能檢測)
2.5.3.1 Performance profiler(代碼層或應用程序層的性能檢測)
2.5.3.1.1 說明
提供針對程序中任意範圍[sourcefile、routine、class、unit]內的程序段或單行代碼進行的性能檢測。在程序執行期間,工具自動收集運行時的性能表徵數據(如調用次數、執行時間、調用與被調用函數、函數調用層次圖、執行期間發生的異常情況等等)。此外,工具提供與運行時間、CPU緩存使用等相關的多種計數器[如Elapsed Time、User Time、User+Kernel Time、CPU Cache Misses、Context Switches等],爲了解應用代碼級和應用程序級上的性能使用和確定可能存在的性能瓶頸提供詳實的參考數據。
2.5.3.1.2 測試結果報告
測試報告中有三種類型:方法、模塊和源碼文件。每種類型按照線程劃分報告,每個線程有一個報告結果。報告上方有四種時間精確度選擇:Seconds, MilliSeconds, MicroSeconds, Machine Cycles
方法統計報告:
Routine Name
|
Time
|
Time with Children
|
Shared Time
|
Hie Count
|
TForm1::FormCreate
|
526
|
526
|
100.00
|
20.77 %
|
Time -方法執行花費的總時間,不包括方法中調用的子方法所花費的時間。
Time with Children -方法執行花費的總時間,包括子方法所花費的時間
Shared Time - Shared Time = Time / Time with Children
模塊統計報告:
Module Name
|
Time
|
% Time
|
Hit Count
|
Project1.exe
|
2532
|
100.00 %
|
3
|
% Time -當前模塊在所有被測試的模塊中所佔用的時間比例
源碼文件統計報告:
File Name
|
Time
|
% Time
|
Hit Count
|
Unit1.pas
|
2022
|
79.86 %
|
2
|
% Time -當前單元文件在所有被測試的單元文件中所佔用的時間比例
以上三種測試報告中還有很多其他的項目,用戶可以自己選擇添加。如:Average Time(平均花費時間)、First Time(第一次被調用的時間)、Max Time and Min Time(最長/短一次調用所花費的時間)等等。
2.5.4 Static Analysis
靜態分析並標識出待測程序的內部結構,共有三個測試方案:Platform ComplianceAPI(API平臺支持測試)、Sequence Diagram Link(UML關係圖)、Static Analysis(靜態分析)
2.5.4.1 Platform ComplianceAPI(API平臺支持測試)
程序中使用的API函數與特定平臺的兼容性分析,識別出與操作系統不兼容的函數。
2.5.4.2 Sequence Diagram Link(UML時序圖)
自動識別出待測程序中的函數調用關係,自動生成UML格式時序圖,並通過word或visio格式顯示。便於檢測者及時檢查程序的行爲。
2.5.4.3 Static Analysis(靜態分析)
靜態分析並標識出待測程序的內部結構[如UML時序圖、函數間調用關係、存在的循環語句、判斷語句、異常處理]和程序規模[Bytes、lines]。
2.5.5 Tracing
異常跟蹤,共有一種測試方案:Exception Tracer(異常跟蹤)
2.5.5.1 Exception Tracer(異常跟蹤)
監測程序運行期間出現的預知和未知異常,並將異常在源代碼中進行定位。當程序出現異常時,Event Log窗口會記錄下來,再Event View窗口選中異常查看,在Editor窗口中可以查看到當前異常所在的代碼位置。
2.6 如何測試COM
COM組件的測試可分爲以下幾類:
in-process servers -進程中組件,如:ActiveX controls
out-of-process servers -進程外組件,如:獨立進程中運行的OLE servers
DCOM -在獨立進程中運行的OLE servers 且支持網絡遠程過程調用COM+ applications 和 MTS -作爲服務程序運行在系統中
2.6.1 in-process servers
1、 根據2.3中介紹的方法爲組件加上調試信息,重新編譯並註冊
2、 在Profiling Mode(工具欄第三個按鈕)中選擇Normal
3、 打開Run-Parameters,選擇HOST APPLICATION(組件的宿主程序),如果有運行參數,在Parameters中加上運行參數
4、 開始測試
2.6.2 out-of-process servers
和普通應用程序一致
2.6.3 DCOM
1、根據2.3中介紹的方法爲組件加上調試信息,重新編譯並註冊
2、在Profiling Mode(工具欄第三個按鈕)中選擇Com Server
3、打開Run-Parameters,選擇HOST APPLICATION(組件的宿主程序),如果有運行參數,在Parameters中加上運行參數
4、開始測試
2.6.4 COM+ applications 和 MTS
1、 根據2.3中介紹的方法爲組件加上調試信息,重新編譯並註冊
2、 在Profiling Mode(工具欄第三個按鈕)中選擇Normal
3、 打開Run-Parameters,選擇C:/Windows/System32/dllhost.exe作爲宿主程序,運行參數:/ProcessID:Application ID。如:/ProcessID:{52FC412B-819B-47BF-8E22-65426D5C11B7}
4、 開始測試
5、 點擊Run-Get Results手工獲取測試報告。這是個特殊的地方,因爲使用Terminate結束運行時,AQTime獲取不到任何通知,所以無法自動生成報告
2.7 如何測試服務程序
1、 根據2.3中介紹的方法爲組件加上調試信息,重新編譯並註冊成系統服務
2、 在Profiling Mode(工具欄第三個按鈕)中選擇Services
3、 開始測試,AQTime會重新啓動服務,掛接上去以獲取測試信息
4、 點擊Run-Get Results手工獲取測試報告。這是個特殊的地方,因爲使用Terminate結束運行時,AQTime獲取不到任何通知,所以無法自動生成報告
2.8 如何測試IIS
1、 根據2.3中介紹的方法爲組件加上調試信息,重新編譯
2、 在Profiling Mode(工具欄第三個按鈕)中選擇IIS
3、 打開Run-Parameters,輸入起始頁面的URL
4、 開始測試,AQTime會重新啓動IIS,掛接上去以獲取測試信息
5、 點擊Run-Get Results手工獲取測試報告。這是個特殊的地方,因爲使用Terminate結束運行時,AQTime獲取不到任何通知,所以無法自動生成報告
2.9 其他功能
2.9.1 選擇測試區域
在Ereas窗口中默認測試區域爲Full Check(測試所有),你可以選擇添加Ereas創建自己的測試區域,然後從左邊的Moudles窗口中選擇需要測試的模塊拖過來即可。這樣就可以測試指定的模塊了。
3 總結
AQTime相對與MemProof來說要龐大複雜多了,需要開發人員有良好的基礎,纔可以應用自如。筆者平時只是拿AQTime來做效率測試,這個功能實在是太棒了。好了,就此打住~~