汪邦慧
我們這里說軟件測試框架是軟件自動化測試的整體解決方案,是一組自動化測試的規(guī)范、測試腳本的基礎(chǔ)代碼,以及測試思想、慣例的集合,所有這一切的出發(fā)點是為了減少冗余代碼、提高代碼生產(chǎn)率、提高代碼重用性和可維護性, 保證自動化測試的高效率和高收益。
自動化測試框架一般可以分為上下兩個層次,上層是管理整個自動化測試的開發(fā),執(zhí)行以及維護。它可以管理整個自動測試,包括自動化測試用例執(zhí)行的次序、測試腳本的維護、以及集中管理測試用例、測試報告和測試任務(wù)等。下層主要是測試腳本的開發(fā),充分的使用相關(guān)的測試工具,構(gòu)建測試驅(qū)動,并完成測試業(yè)務(wù)邏輯。
1.1 自動化關(guān)鍵技術(shù)簡介
自動化測試的核心就是對象識別技術(shù)。腳本錄制的主要目的是采集對象信息并生成相應(yīng)的腳本?;胤诺倪^程就是根據(jù)這些信息進行對象的識別和執(zhí)行相應(yīng)的腳本。
對象識別本質(zhì)是根據(jù)關(guān)鍵屬性來確認(rèn)對象,然后在該對象上執(zhí)行相應(yīng)的操作。如下圖所示:
1.2 自動化測試框架的作用
●減少冗余代碼、提高代碼生產(chǎn)率、提高代碼重用性和可維護性。提高開發(fā)速度,提升測試代碼的執(zhí)行效率。
●提高軟件代碼質(zhì)量,同時引入重構(gòu)概念,讓代碼更干凈和富有彈性。
1.3 自動化測試框架的主要類型
●數(shù)據(jù)驅(qū)動測試框架
數(shù)據(jù)驅(qū)動測試是測試腳本從數(shù)據(jù)文件(數(shù)據(jù)池,CVS文件,Excel文件等)中讀取輸入和輸出數(shù)值并載入到錄制的或手工編寫的腳本變量中的一種框架。在這種框架里,輸入數(shù)值和輸出數(shù)值都使用變量。測試數(shù)據(jù)包含在數(shù)據(jù)文件里而不是在腳本中被硬編碼。不同的數(shù)據(jù)文件對應(yīng)不同的測試用例。在這種模式下數(shù)據(jù)和腳本分離,腳本的利用率、可維護性大大提高。
●關(guān)鍵字驅(qū)動或表格驅(qū)動測試測試框架
關(guān)鍵字驅(qū)動和表格驅(qū)動測試在是數(shù)據(jù)驅(qū)動基礎(chǔ)之上,進一步提高自動化測試的靈活性和擴展性的框架解決方案。在關(guān)鍵字驅(qū)動框架下,除了要設(shè)計應(yīng)用程序的測試數(shù)據(jù)表,還要生成一個關(guān)鍵字?jǐn)?shù)據(jù)表。這個關(guān)鍵字包含了程序的特性,或者是有關(guān)程序的操作。
基于UI功能的自動化測試
圖形用戶界面(Graphical User InterFace, GUI)就是使用圖像,輸入的文字,帶有圖標(biāo)的計算機界面。GUI可以讓用戶通過圖標(biāo)和鼠標(biāo)與計算機進行交互,而不是在命令行中輸入文本。 一般來說,應(yīng)用程序(包括桌面程序和web應(yīng)用)有一些基本的界面控件, 如窗口, 消息對話框, 菜單, 按鈕, 復(fù)選框, 組合框, 列表框, 文本輸入框, 組選框, 樹形視圖, 瀏覽器, 日期選擇控件等。它們有些是屬于Windows桌面應(yīng)用程序, 有些是屬于Web DOM對象。
所有軟件的指令都通過這些控件以事件或消息的形式傳遞給后臺處理程序。自動化測試腳本的開發(fā)過程就是一個工具模擬人工操作的過程。人員要通過工具去操作(錄制), 工具要能“學(xué)習(xí)”并掌握這個過程(對界面控件的識別能力),最終能夠獨立完成測試(回放)。
2.1 利用HTML DOM編程接口實現(xiàn)UI自動化測試
HTML DOM(HTML Document Object Model)文檔對象模型定義了訪問和處理HTML文檔的標(biāo)準(zhǔn)方法。所有的WEB瀏覽器都內(nèi)嵌了DOM解析技術(shù),包括IE和FireFox等。要改變頁面的某個元素或節(jié)點,瀏覽器中的JavaScript就需要獲得文檔中所有元素進行訪問來獲得每個對象的入口。這個入口,連同對HTML元素進行添加, 移動, 改變或移除的方法和屬性,都是通過文檔對象模型來獲得的(DOM)。
我們來看下,如何用HTML DOM接口來實現(xiàn)在百度的首頁(見下圖)上完成自動搜索。
“文本輸入框”源碼:
“百度一下按鈕”源碼:
如果想通過DOM接口來完成自動搜索的過程,則VBScript代碼如下。以下代碼保存在VBS文件里, 雙擊運行。
Set WshShell=WScript.CreateObject("WScript.Shell")
Set ie=CreateObject("internetexplorer.application")
ie.visible=1
ie.navigate("http://www.baidu.com")
Do while (ie.busy=True)
wscript.sleep 1000
Loop
Set docRoot=ie.Document
docRoot.getElementById("kw").value="163"
docRoot.getElementById("su").click
DOM對象接口就是對WEB UI實施自動化測試的技術(shù)基礎(chǔ), 理論上,只要獲得DOM的根節(jié)點,依次遍歷,就可以對根下所有的對象進行操作了。但它的缺點是過于低層,需要自動化測試開發(fā)人員對DOM非常的精通,而且要開發(fā)大量的遍歷函數(shù),才能完成一個基本功能的操作。
2.2 QTP測試工具
QTP(Quick Test Professional)是HP公司提供的自動化測試工具,其腳本語言為VBScript, 目前最新版本為11。 主要為GUI自動化測試提供解決方案。 QTP提供了VB Object, Windows Object, Web Object等對象接口, 生成的VB Script腳本好具有可讀性好,面向?qū)ο蟮葍?yōu)點。
使用QTP錄制百度搜索的操作, 生成的腳本如下:
QTP在錄制的過程中, 捕捉頁面上的元素,錄制生成了4個QTP對象(如下圖)。這些對象以樹狀的組織形式存儲在QTP的對象庫里。每個對象的屬性存儲了此對象的相關(guān)信息,對象的層次關(guān)系代表對象在界面上的隸屬關(guān)系,即DOM的層次關(guān)系。
當(dāng)腳本回放時, QTP會從對象庫中讀出對象的屬性, 按對象層次結(jié)構(gòu), 依次與頁面上的各個元素進行比較。如果匹配成功則執(zhí)行QTP腳本里的動作, 完成回放, 否則,腳本將會報錯, 停止運行。
因此,可以看出QTP是在HTML DOM的基礎(chǔ)上封閉了一套強大的QTP對象, 使得用戶對DOM的操作更加直觀和方便。
2.3 QC簡介
QC(Quality Center)是HP公司的一個基于 Web 且支持測試管理的所有必要方面的應(yīng)用程序。QC測試流程包括四個階段(指定需求,計劃測試,運行測試,跟蹤缺陷)。
指定需求階段, 您可以創(chuàng)建一個“需求樹”,用于定義您的總體測試需求, 針對需求樹中的每個需求主題, 創(chuàng)建詳細的測試需求列表; 計劃測試階段, 創(chuàng)建“測試計劃樹”, 向計劃樹中添加每個測試的基本定義, 對于確定要自動化測試的, 使用測試工具創(chuàng)建測試腳本; 運行測試階段, 計劃測試執(zhí)行并將任務(wù)分配給測試人員, 自動或手動執(zhí)行測試集中的測試;跟蹤缺陷階段, 可以添加缺陷,查看新缺陷, 修復(fù)打開的缺陷。
QTP + QC + 測試數(shù)據(jù)管理工具 框架實例
測試管理平臺: 管理腳本的開發(fā);管理腳本的執(zhí)行;管理腳本的維護;管理測試的任務(wù); 管理測試的報告
Quick Test Professional (QTP):讀取測試數(shù)據(jù)及全局環(huán)境變量;生成測試腳本 (對象識別); 執(zhí)行測試腳本 (腳本回放);報告測試結(jié)果
測試數(shù)據(jù)管理工具(JAVA):從數(shù)據(jù)庫提取自動化測試數(shù)據(jù);將測試數(shù)據(jù)存入測試數(shù)據(jù)管理文件;多線程并發(fā)提取數(shù)據(jù)
Excel(測試數(shù)據(jù)驅(qū)動): 保存測試數(shù)據(jù) (輸入?yún)?shù));保存測試結(jié)果 (輸出參數(shù))
XML(全局環(huán)境配置): 保存全局環(huán)境變量
構(gòu)建測試數(shù)據(jù)文件實例
建立外部測試數(shù)據(jù)文件(Test_Data.xls)。QTP腳本需要從此配置文件里讀取測試數(shù)據(jù),需要將輸出參數(shù)寫回該配置文件。實現(xiàn)腳本與測試數(shù)據(jù)的分離。
此數(shù)據(jù)文件包含三張表(General, SQL, Other)。 第一張表(General)存放全局性的配置信息(如數(shù)據(jù)庫連接串,站點URL,是否“下載測試時所需動態(tài)鏈接庫文件”標(biāo)志等);第二張表(SQL)存放所有QTP腳本需要讀取的測試數(shù)據(jù)和需要保存的輸出參數(shù);第三張表(Other)保存一些其它的信息。一般情況下腳本開發(fā)人員需要使用“SQL”表。在該表內(nèi)定義輸入?yún)?shù)的名稱(供腳本讀取),定義輸出參數(shù)的名稱(供腳本寫入),相應(yīng)的SQL(供腳本運行此SQL,從DB里自動獲取測試數(shù)據(jù))。如下面的圖片所示:
管理測試數(shù)據(jù)工具研發(fā)實例
通常對于大型項目的回歸測試來說, 一般自動化測試數(shù)據(jù)比較多;有的時候,測試數(shù)據(jù)需要實時從數(shù)據(jù)庫里提取, 這時候就需要有方法在啟動腳本前能夠快速的準(zhǔn)備好測試數(shù)據(jù),因為QTP本身對多線程支持的不是很好,所以可能需要開發(fā)另外的多線程的工具來支持快速的獲取測試數(shù)據(jù)。這很重要,不然手工維護大量的測試數(shù)據(jù)將會是令人沮喪的一件工作。
可以將該配置文件存于MQC的固定路徑下(自動化回歸測試腳本\通用\下載全局配置文件),在QC里建立測試集的時候,“下載全局配置文件”腳本應(yīng)該首先被選中運行,腳本運行后,該配置文件將被下載到測試機上(c:\temp\目錄)供QTP使用。
研發(fā)工具工作流程的基本思路為:讀取測試數(shù)據(jù)配置文件(Excel) → 加載配置文件中的SQL語句到內(nèi)存 →查詢SQL需要連接的數(shù)據(jù)庫的類型 →連接對應(yīng)的數(shù)據(jù)庫(并發(fā)) → 執(zhí)行SQL查詢(并發(fā)) → 返回查詢結(jié)果(并發(fā)) →將結(jié)果寫入數(shù)據(jù)配置文件(Excel)→關(guān)閉數(shù)據(jù)庫連接、關(guān)閉系統(tǒng)文件連接
腳本的復(fù)用實例
為提高QTP腳本的復(fù)用度, 盡可能將常用功能以函數(shù)庫的形式提供出來,或二次封裝常用的函數(shù)接口以方便調(diào)用,或編寫常用的Action供別的腳本調(diào)用?;旧峡梢詫⒋a大致分成三類,如下圖所示:
6.1 構(gòu)建底層庫函數(shù)實例
6.2 構(gòu)建公共庫模塊腳本實例
“登錄腳本”:用于登錄系統(tǒng)
“退出腳本”: 該腳本用于退出系統(tǒng)
“獲取訂單腳本”: 該腳本用于從頁面獲取訂單號
腳本規(guī)范實例
●在腳本最前面加上基本信息: IE版本,QTP版本,項目名稱,腳本編寫人, 腳本創(chuàng)建時間,腳本修改時間,修改說明,輸入?yún)?shù),輸出參數(shù),功能描述, 調(diào)用庫函數(shù)說明,調(diào)用共享對象庫說明,調(diào)用場景恢復(fù)文件說明,調(diào)用存在的Action說明,更改默認(rèn)Action的名稱,業(yè)務(wù)流程說明,其它說明。舉例如上。
●輸入,輸出參數(shù): 原則上,所有的輸入?yún)?shù)需要定義在配置文件內(nèi)(Test_Data.xls)供腳本讀??; 所有的輸出參數(shù)需要保存入配置文件內(nèi)(Test_Data.xls)供其它腳本視需要讀取。
●檢驗點: 一般情況,腳本里應(yīng)該需要加上必要的校驗點; 業(yè)務(wù)完成后,需要在頁面上對業(yè)務(wù)結(jié)果進行校驗; 有訂單產(chǎn)生的,需要在數(shù)據(jù)庫里校驗訂單是否竣工。
●常量命名規(guī)范: 常量的命名應(yīng)該全部用大寫,使用"_"作為單詞間的分隔符,單詞盡量使用全名稱. 如: Public Const MSG_EMPTY_ROW As String = "有空行存在"。
●變量命名規(guī)范: 變量命名大小寫:盡量使用錯落有致的大小寫字母命名變量,錯誤的命名如STRNAME,正確的命名如strName.用標(biāo)志性的前綴來指明一個變量的數(shù)據(jù)類型,如:strName, intQuantity, blnFound, dteNow, objCurrent。如果是一般的臨時性變量定義,應(yīng)該盡可能地簡單 (如for循環(huán):for i=0 to 5).
●參數(shù)命名規(guī)范: 參數(shù)命名的原則是全部用小寫,如果參數(shù)包括兩個或兩個以上的單詞時,首單詞字母小寫,其他單詞首字母大寫,如stepName、stepDescription。
●函數(shù)命名規(guī)范: 動詞+名詞,動詞必須小寫,后面的名稱首字母大寫,如getMaterialCode; 當(dāng)函數(shù)名稱不足以表達其功能時,應(yīng)使用在函數(shù)頭部加上讓調(diào)用者足夠明白的注釋。
●縮進: 必須嚴(yán)格執(zhí)行縮進,變量聲明塊不縮進,實現(xiàn)塊必須保證全部縮進; 對于基本的控制結(jié)構(gòu)來說,必須要有縮進,如IF、DO、WITH、FOR、WHILE塊。