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

浙公網(wǎng)安備 33010602011771號