(北京航空航天大學 軟件工程研究所, 北京 100083)
摘 要:為了提高軟件自動化測試腳本的可復用性,提出了一種基于關鍵字驅動的自動化測試框架(LKDT)。首先對目前現有自動化測試框架進行了歸納分析;然后提出了LKDT的系統架構,給出了其中所包含的關鍵技術;最后以實際的Linux桌面應用程序為例對LKDT框架與現有框架進行實際對比驗證,結果表明該框架具有降低測試腳本規模、提高整體測試效率等優越性。
關鍵詞:關鍵字驅動; 自動化測試; Linux GUI測試
中圖分類號:TP311.5 文獻標志碼:A
文章編號:10013695(2009)03092703
Keyword driven automated testing framework
JIE Hui, LAN Yuqing, LUO Pei
(Software Engineering Institute, Beihang University, Beijing 100083, China)
Abstract:In order to improve the reusability of the test scripts during the automation test procedures, this paper proposed a keyword driven automated testing framework (LKDT). At first, it summarized and analyzed the recent automated testing frameworks; then it proposed the LKDT’s system architecture, and also presented the key technology details of the framework. At last, this paper compared LKDT with the recent frameworks by the actual desk programs in Linux, which proved that LKDT had superiority in reducing the scale of test scripts, raising the overall efficiency of testing and so on.
Key words:keyword driven; test automation; Linux GUI testing
0 引言
軟件測試是保障和提高軟件質量的重要手段[1]。軟件開發者和使用者必須對軟件進行充分的測試,以確保其正常工作。統計表明,在典型的軟件開發項目中,軟件測試工作量往往占軟件開發總工作量的40%以上[2,3]。因此提高軟件測試過程的效率至關重要。
為了提高測試效率,越來越多的測試工作引入了自動化測試的思想和方法。實踐證明,軟件自動化測試技術提高了軟件測試的速度和效率,節省了軟件測試成本,縮短了產品發布周期。同時,自動化測試技術也完成了許多手工測試無法實現的工作。所以,采用自動化測試方法和相應的測試框架成為了軟件開發組織測試工作的重要支撐手段。例如,采用自動化測試工具能在測試活動中減少一部分開銷,同時,有些測試活動是靠手工方式難以實現和度量的;自動化測試框架能夠提高測試效率,快速定位測試軟件各版本中的功能、性能缺陷。
目前的自動化測試框架主要可以分為三種:錄制/回放測試框架、數據驅動的自動化測試框架、關鍵字驅動的自動化測試框架。通過比較,發現關鍵字驅動的測試框架較前兩者具有更好的可復用性,而且隨著測試量的增加,測試代碼的不斷累積,其優越性愈加明顯。但當前基于關鍵字驅動的測試框架研究尚未給出直接可用于Linux桌面測試的框架。而Linux下支持GUI自動化測試的測試框架對于Linux的應用程序的豐富與成熟具有至關重要的保障作用。因此為了彌補理論和實踐的差距,本文給出了一種實用、有效的關鍵字驅動的測試框架LKDT,并驗證了LKDT在自動化測試領域的實用性和優越性。
1 自動化測試框架概述
1.1 自動化測試框架定義
一個自動化測試框架就是一個由假設、概念以及為自動化測試提供支持的實踐的集合[4]。自動化測試框架可以減少測試腳本實現和維護的成本,使測試人員把精力集中在測試用例的設計上。自動化測試框架的好壞直接影響到自動化測試的成功與否[2]。
1.2 自動化測試框架開發原則
一個優秀的自動化測試框架應該滿足以下特點:
a)測試框架與被測應用程序獨立。雖然測試的應用程序不一樣,但被測應用程序之間卻會有相同的地方,測試框架應聚焦在不同測試應用程序中共同的部分,把與具體應用程序有關的部分從框架中移除。
b)測試框架應易于擴展、維護。測試框架應被高度模塊化,這樣可以提高框架的維護性。各個模塊之間相互獨立,對模塊內部的修改不應該影響其他模塊。除此之外,系統應該有充足、詳細的文檔,與軟件開發一樣,這也是必不可少的。設計文檔可以幫助開發人員擴展、維護測試框架,而使用文檔則可以告訴用戶要怎么使用該框架。
c)測試腳本所使用的測試語言應該是與框架獨立的。不同的測試框架可能在不同的應用領域有不同的表現,有些適用于Java應用程序的測試,有些可能適用于Web應用程序的測試,如果測試腳本所采用的語言是私有的、與測試框架綁定的,那么當需要從一個測試框架遷移到另外一個測試框架時,所有的測試腳本都需要重寫。
d)測試框架不應該讓框架的復雜性影響到測試人員。在大多數情況下,測試人員就是測試人員而不是開發人員,甚至有的時候,他們不是專業的測試人員,可能只是具有很少軟件開發經驗的某個應用領域的專家。對于這些使用者來說,測試框架的使用要簡單、測試語言要易于理解,這樣可以使他們專注于業務相關內容的編寫。
2 常用的自動化測試框架
2.1 錄制/回放測試框架
錄制/回放測試框架所采用的原理是通過錄制應用程序產生的線性腳本進行回放從而達到自動化測試的目的。
其優點是簡單,通過錄制就可以得到所需腳本。但同時也有很大的缺點,它不具有邏輯判斷的能力,可維護性差,效率低下。
2.2 數據驅動的自動化測試框架
該種框架的原理是采用了數據驅動腳本進行測試,數據驅動腳本是將數據輸入存儲在獨立的數據文件中,腳本只存放控制信息,測試時輸入直接從文件中讀取,這樣同一腳本可以運行于不同的測試用例中,實現了腳本與數據的分離。其優點是可以快速增加相似測試,測試者增加新的測試不必掌握測試工具語言,對此后的類似測試無額外維護開銷;缺點是初始建立測試腳本的開銷較大,進行數據擴展的腳本需要針對相同的測試內容并具有相同的測試邏輯。
2.3 關鍵字驅動的自動化測試框架
關鍵字驅動(表驅動)是對數據驅動的邏輯擴展,它的核心思想可以概括為三個分離。
1)界面元素名與測試內部對象名的分離 在被測應用程序和錄制生成的測試腳本之間增加一個抽象層,它可以將界面上的所有元素映射成相對應的一個邏輯對象,測試針對這些邏輯對象進行,界面元素的改變只會影響映射表,而不會影響測試。
2)測試描述與具體實現細節的分離 把測試描述和測試的具體實現細節分離開來。測試描述只說明軟件測試要做什么以及期待什么樣的結果,而不管怎樣執行測試或怎樣證實結果。這樣做是因為測試的實現細節通常與特定的平臺以及特定的測試執行工具有著密切的聯系。這種分離使得測試描述對于應用實現細節是不敏感的,而且有利于測試在工具和平臺間的移植。
3)腳本與數據的分離 最后,可以把測試執行過程中所需的測試數據從腳本中提取出來,在運行時測試腳本再從數據存放處讀取預先定制好的數據,這樣腳本和數據可以獨立維護。
以上這三個分離各司其職、互相獨立,最大程度地減少相互之間的影響。從關鍵字驅動的思想可以看出,該種測試框架不僅實現了將數據和腳本相分離,而且實現了測試邏輯和數據的分離,大大提高了腳本的復用度和維護性,從而更大限度地實現了測試工具的自動化。
3 用于Linux下桌面應用程序的關鍵字驅動的自動化測試框架
當前Linux下的測試工具主要是針對內核和服務器方面進行測試,對桌面應用程序的測試基本不支持,開發一個支持Linux下桌面應用程序測試的測試框架對于解決Linux下應用程序的發展與成熟具有積極的促進和保障作用。本文根據測試自動化框架開發原則,結合軟件測試的實際需求,提出一個可行的自動化測試框架:LKDT(an automated testing framework of keyword driven for Linux)。
3.1 LKDT總體架構
LKDT主要由測試用例管理、測試計劃、測試腳本編寫、測試執行和測試結果收集等組件構成。其總體架構邏輯圖如圖1所示。
測試用例管理組件采用與測試用例管理工具,如目前常用的test runner管理工具集成的辦法,提供對test runner中已有測試用例的導入、導出功能,從而方便測試人員對于測試用例的統一管理。
測試腳本編寫組件允許采用兩種腳本編寫方式:a)測試人員通過錄制工具產生測試腳本,即測試人員根據測試用例中的步驟,對應用程序進行操作, 錄制工具將這些動作捕獲下來,存成腳本文件;b)測試人員通過關鍵字的方式手動進行編寫,即在該框架中測試人員可以通過拖放關鍵字來進行腳本的編寫。
測試計劃組件的主要作用即允許測試人員對測試用例的執行方式(順序、并行、條件、分支、循環、分布式等)、執行時間、日志級別等進行定制。
測試執行組件是對測試用例或者測試計劃所關聯的測試用例按照要求進行執行,該過程為自動執行過程,無須人工進行干預;如果需要手動控制測試腳本執行,需以debug的方式執行。
測試結果組件收集測試結果信息,包括一個測試結果總結,如測試執行了幾個測試用例、執行時間以及成功、失敗的用例數;還包括一個失敗的測試用例執行的詳細信息,包括失敗的測試腳本所屬的測試計劃、所屬的測試用例、在測試腳本中的位置以及出錯過程中的截圖。
3.2 關鍵字驅動模塊
關鍵字驅動模塊是LKDT的核心模塊,在LKDT框架中起著不可或缺的作用。該模塊主要解決了腳本關鍵字的定義、關鍵字解析等問題。
關鍵字驅動的測試腳本為測試數據關鍵字和測試邏輯關鍵字的有機組合。數據關鍵字相對簡單,與數據驅動技術類似,一個數據關鍵字代表一個測試腳本中的測試數據。在腳本運行時只需通過框架用真實的測試數據對數據關鍵字進行替換。
邏輯關鍵字的定義與測試活動的結構密不可分。在真實的測試活動中,一個測試目標需要有一組測試用例來支持,而每個測試用例又由一系列的測試步驟完成。這是一個三層結構,測試步驟為測試活動中的最小單位,測試目標為最大單位,測試用例居中。邏輯關鍵字基于測試活動的這種結構即可分為高層腳本、中層腳本和底層腳本三層,分別對應于測試中的測試目標、測試用例和測試步驟。高層次腳本由邏輯關鍵字代表的低層次腳本,加上數據關鍵字代表的測試數據組合而成。其組合關系如圖2所示。
根據上述分析可以看出,該模塊主要由核心模塊、腳本語言解釋器模塊和支持庫模塊組成。
3.2.1 核心模塊
該模塊主要作用是對測試腳本中的關鍵字信息進行解析,并控制腳本的執行。它由數據解析器、腳本解析器、腳本執行器、中間層四部分組成。其中,數據解析器負責數據關鍵字的解析;腳本解析器負責解析腳本中的邏輯關鍵字;腳本執行器負責腳本的執行;中間層負責測試庫調用。
3.2.2 腳本語言解釋器模塊
腳本語言解釋器模塊包括三個部分,即詞法分析器、語法分析器和解釋器。詞法分析器負責將輸出的字符流解析為一個個的詞[5~7];語法分析器負責將詞序列解析為具有語義的語句[8];解釋器負責語義的翻譯。
3.2.3 支持庫模塊
支持庫包括兩個部分:a)所有測試可以共用的庫,包括日志庫和測試支持庫。日志庫負責向測試人員提供日志記錄的功能;測試支持庫則提供所有測試能共用的功能。b)GUI測試庫主要作用是支持Linux下對桌面應用程序的測試。其基本結構如圖3所示。
4 LKDT功能驗證
目前,該工具已應用于中標軟件公司測試部,主要對Linux下的GUI應用程序進行功能測試。本章以Linux下的文本編輯器Gedit的編輯功能測試為例,簡要介紹進行實際測試的有效性。
首先對測試目標進行分析,為其制訂兩個測試用例,如表1所示。
根據測試步驟,可知需要創建三個關鍵字,即“打開文件”“編輯文件”和“保存文件”。
根據創建測試腳本的向導創建底層測試腳本,該框架提供了一個支持拖拽的圖形化編輯器,用戶可以按照自己的需要把相應的控件拖放到編輯器上,從而得到三個低層腳本(“打開文件腳本”“編輯文件腳本”“保存文件腳本”)、兩個中層腳本(“新建文件編輯腳本”“已有文件編輯腳本”)、一個高層腳本(“Gedit編輯測試腳本”)。在該框架上運行高層腳本即可進行相應測試。
表1 測試用例圖表
測試用例測試步驟
1.新建文件編輯1)打開Gedit2)輸入“Gedit編輯測試,新建”3)點擊“另存為”4)輸出“新建文件編輯.txt”5)點擊“保存”
2.已有文件編輯1)打開Gedit2)點擊“打開”3)選擇“新建文件編輯.txt”4)點擊“打開”5)修改文件為“Gedit編輯測試,修改”6)點擊“另存為”7)輸出“修改文件編輯.txt”8)點擊“保存”
通過測試發現,上述例子中若用其他測試方式則需要編寫兩個測試腳本,分別包含測試用例中的每個步驟,共需要16條指令;而采用LKDT以后,測試人員需要編寫三個底層腳本,共8條指令,以及幾個關鍵字調用。由于測試腳本編寫的復雜度主要集中在腳本步驟的編寫中,關鍵字的調用幾乎可以忽略不計。因此可以看到,使用了關鍵字技術后,減少了約一半的腳本編寫量。而且隨著測試軟件規模的擴大,腳本本身的復雜度也會隨著增加,關鍵字所起到的作用就會變得愈加明顯。
5 結束語
實踐充分表明,依靠傳統的自動化工具來完成Linux下的GUI測試非常困難。一是因為捕捉產生的腳本維護困難;二是由于錄制的測試腳本與測試數據耦合得太緊密導致錄制生成的測試腳本可復用性較差,生存期短。而LKDT框架采用的關鍵字驅動則是一種截然不同的思想,它把傳統測試腳本中的變化與不變的東西進行了分離,這種分離使得分工更明確,并且避免了它們相互之間的影響。
當然對于該框架仍有許多工作需要探討。例如如何使測試框架提供分布式測試支持以及需要考慮到Linux操作系統中用戶權限問題等,通過后續研究以期使之成為一個更加簡單、易用、高效的自動化測試框架。
參考文獻:
[1]BENNETT J P. Introduction to compiling techniquesfirst course using Ansi C, Lex and Yacc[M]. [S.l.]:McGraw Hill Book Co, 1990.
[2]FEWSTER M, GRAHAM D. 軟件測試自動化技術與實例詳解[M].舒智勇,包曉露,焦躍,等譯.北京:電子工業出版社,1999:333342.
[3]PATTON R.軟件測試[M].北京:機械工業出版社,2002:150.
[4]朱鴻,金凌紫.軟件質量保障和測試[M].北京:科學出版社,1997.
[5]DUSTION E. The automated testing lifecycle methodology[C]//Proc ofInternational Conference on Practical Software Assurance Techniques and Practical Software Test Techniques. 2000:116.
[6]YU Yi,XU Zhongwei,WU Fangmei. A strategy based on a knowledge base for black box software testing[C]//Proc ofInternational Symposium on Test and Measurement(ISTM/99). Xi’an: [s.n],1999:206210.
[7]張克東.軟件工程與軟件測試自動化教程[M].北京:電子工業出版社, 2002.
[8]朱菊,王志堅,楊雪.基于數據驅動的軟件自動化測試框架[J].計算機技術與發展, 2006,16(5):6870.