楊清玉,李金麗,陳吉蘭,李志偉
(中標軟件有限公司 操作系統(tǒng)測試認證中心,北京 100190)
摘要:研究了HTTP接口自動化測試方法,采用Python語言開發(fā)代碼,使用Request調(diào)用HTTP接口。提出了一種分層結(jié)構(gòu)的自動化測試框架,將接口調(diào)用、測試用例和測試數(shù)據(jù)的代碼分層開發(fā),生成基于HTML的測試報告。提出了兩種解決CSRF Token驗證問題的方案。該方法開發(fā)出的自動化測試腳本具有結(jié)構(gòu)清晰、易維護等優(yōu)點,能夠有效提高測試效率,降低測試成本。
關(guān)鍵詞:HTTP接口;Python;Request;自動化測試
0引言
Web業(yè)務(wù)日趨復(fù)雜,系統(tǒng)愈加龐大,版本的發(fā)布周期變短,使得Web產(chǎn)品測試的難度極大地提高,工作量也大幅增加[1]。Web產(chǎn)品的測試中非技術(shù)性、重復(fù)性的測試工作占總的測試工作量比例比較大,因而需要大量的資源來保障Web產(chǎn)品的質(zhì)量[2 3]。在開發(fā)Web產(chǎn)品時,開發(fā)過程中一般采用了分層的軟件體系結(jié)構(gòu),Web頁面通過HTTP協(xié)議向接口發(fā)送請求,后端處理請求返回結(jié)果。由于業(yè)務(wù)邏輯比較復(fù)雜,有著大量的接口,如果使用自動化測試代替手工測試,可以有效提高測試效率,降低測試成本。
1HTTP協(xié)議
超文本傳輸協(xié)議(Hyper Text Transfer Protocol, HTTP)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。HTTP是基于請求和響應(yīng)模式的無狀態(tài)應(yīng)用層協(xié)議。其客戶/服務(wù)器模式的信息交換過程如圖1所示。信息交換過程分四個部分:建立連接、發(fā)送請求信息、發(fā)送響應(yīng)信息和關(guān)閉連接[4]。
絕大多數(shù)的Web開發(fā)都是構(gòu)建在HTTP協(xié)議之上的Web應(yīng)用。本文所進行的自動化測試的對象為中標軟件有限公司的微云操作系統(tǒng)產(chǎn)品,該產(chǎn)品的Web接口為HTTP協(xié)議的接口。針對該接口的自動化測試,筆者采用Python語言進行代碼的開發(fā),使用Request進行HTTP接口的調(diào)用。使用Eclipse并安裝PyDev插件作為集成開發(fā)環(huán)境,在自動化測試框架下開發(fā)自動化測試代碼。
2Python和Request
Python是一個通用目的的編程語言,已經(jīng)有很多年的發(fā)展歷程。這個穩(wěn)定而成熟的語言是非常高層的、動態(tài)的、面向?qū)ο蟮暮涂缙脚_的。Python可以在所有主流的硬件平臺和操作系統(tǒng)上運行。它繼承了傳統(tǒng)編譯語言的強大性和通用性,同時也借鑒了簡單腳本和解釋語言的易用性,語法簡捷清晰、可讀性強、便于維護,并且具有一致性和規(guī)律性、豐富的標準庫,以及許多可以很容易在Python中使用的第三方模塊。Python還可以被當做最適合入門程序員掌握的優(yōu)秀語言,因為它免費、面向?qū)ο?、擴展性強,同時執(zhí)行嚴格的編碼標準[5]。
Request對象的作用是與客戶端交互,收集客戶端的Form、Cookies、超鏈接,或者收集服務(wù)器端的環(huán)境變量。Request對象是從客戶端向服務(wù)器發(fā)出請求,包括用戶提交的信息以及客戶端的一些信息??蛻舳丝赏ㄟ^HTML表單或在網(wǎng)頁地址后面提供參數(shù)的方法提交數(shù)據(jù),然后通過Request對象的相關(guān)方法來獲取這些數(shù)據(jù)。Request的各種方法主要用來處理客戶端瀏覽器提交的請求中的各項參數(shù)和選項。
3自動化測試框架介紹
3.1自動化測試框架設(shè)計思想
本文設(shè)計的自動化測試框架采用分層結(jié)構(gòu),依據(jù)模塊化、可復(fù)用、低冗余等原則,將代碼根據(jù)不同的功能分為若干個獨立的模塊,這里將一類模塊稱為一層。每一層都完成自己特定的任務(wù),各層之間根據(jù)需要去進行調(diào)用。分層思想最先是在軟件開發(fā)過程中提出來的。當代碼量小的時候,采用這種模式會增加工作量;但是當代碼量變大時,采用這種模式可以使設(shè)計思路清晰,代碼冗余度變低,可擴展性更好,代碼維護更加方便,程序運行效率更高。
3.2自動化測試框架實現(xiàn)
自動化測試框架是由一個或多個自動化測試基礎(chǔ)模塊、自動化測試管理模塊、自動化測試統(tǒng)計模塊等組成的工具集合。本文的自動化測試框架如圖2所示,分為測試環(huán)境配置層、接口操作層、測試數(shù)據(jù)層、測試用例層、測試用例管理層等。每一層都實現(xiàn)自己特定的功能,并提供接口給其他層調(diào)用。
Config層:測試環(huán)境配置層,存儲測試環(huán)境相關(guān)設(shè)置參數(shù)。比如待測環(huán)境的IP、主機名、登錄用戶名、密碼等。
TestAPI層:接口操作層,對HTTP接口的調(diào)用進行封裝。比如獲取列表信息、添加、刪除、修改等。
TestData層:測試數(shù)據(jù)層,用于管理測試用例所需要用到的測試數(shù)據(jù)。Data文件的名稱需要與對應(yīng)的Test Case名稱一致,以便數(shù)據(jù)解析。
TestCase層:測試用例層,每一個TestCase類均采用單元測試框架來構(gòu)造,即每一個TestCase均繼承于unittest.testcase類。在實際的設(shè)計中,通過繼承unittest.testcase類,重寫并加入一些方法,從而形成了一個名為BaseTestCase的父類,全部的TestCase的類均繼承自這個父類。
TestSuite層:測試用例管理,包括測試用例執(zhí)行的級別、每種測試級別對應(yīng)的測試用例集以及日志記錄級別。
HTMLTestRunner層:測試報告管理模塊,用于生成測試報告,這個報告是基于HTML的,方便瀏覽和統(tǒng)計。
TestCenter層:測試管理層,是整個測試程序的入口。它實現(xiàn)了解析并找出需要執(zhí)行的測試用例,執(zhí)行測試用例腳本,并生成測試結(jié)果。
4測試代碼開發(fā)
在具體的測試代碼開發(fā)過程中,主要編寫TestAPI層、TestCase層和TestData層的代碼。下面詳細介紹這三層代碼開發(fā)的模式。
4.1TestAPI層
這一層主要進行HTTP接口的調(diào)用。為了實現(xiàn)對接口的調(diào)用,首先,需要從項目組獲取圖3所示的接口說明。如果項目組沒有完整的接口說明文檔,可以結(jié)合firebug獲取。需要在Firefox瀏覽器中安裝firebug插件,啟用插件后,在瀏覽器上所進行的操作會被記錄下來。
然后,編寫代碼調(diào)用HTTP接口。下面以添加用戶的HTTP接口調(diào)用代碼為例進行說明。
def addWebUser(self, data):
url=self.base_url+"Web_users/"
data=json.dumps(data)
r=requests.post(url=url,data=data,
headers=self.headers, verify=self.verify)
return {'status_code':r.status_code,
'result':json.loads(r.text)}
由于實際測項目中HTTP接口接收的參數(shù)格式和返回的信息是json格式,因此需要導(dǎo)入json模塊,并在調(diào)用接口前,使用json.dumps將參數(shù)轉(zhuǎn)換成json格式,對返回信息使用json.loads轉(zhuǎn)換成字典格式,以便后續(xù)使用。
4.2TestCase層
TestCase層用于存放編寫的測試用例,調(diào)用TestAPI層的方法??梢詫estCase層與實際的測試用例對應(yīng)起來。當接口發(fā)生變化時,只需修改TestAPI中的代碼,而基本不需要修改或者只需要對TestCase層代碼進行很少量的修改。每一個測試用例用一個類表示,且均繼承自同一個父類BaseTestCase;而BaseTestCase則繼承自unittest.testcase類,所以,TestCase類均具有unittest.testcase類的屬性。在BaseTestCase類中定義了每個測試用例開始執(zhí)行和結(jié)束時的動作以及一些case中用到的公共方法。
TestCase類的代碼包含四個部分:數(shù)據(jù)和實例初始化、測試環(huán)境準備、實際測試代碼、資源回收。代碼結(jié)構(gòu)如下。
class ITC_EditUser_LegalName(BaseTestCase):
′′′
@summary:編輯用戶-用戶名合法
′′′
def setUp(self):
#第一部分——數(shù)據(jù)和實例初始化
#調(diào)用父類方法,獲取該用例所對應(yīng)的測試數(shù)據(jù)模塊
self.user=super(self.__class__, self).setUp()
self.user_api=UserAPIs()
self.flag = True
# 第二部分——測試環(huán)境準備
#添加用戶
self.user_api.addUser(self.user.add_user)
def test_EditUser_LegalName(self):
#第三部分——實際測試代碼
#編輯用戶
def tearDown(self):
#第四部分——用例執(zhí)行結(jié)束后的資源回收
#刪除用戶
self.user_api.deleteUser(data)
4.3TestData層
測試數(shù)據(jù)文件均存放在TestData層。每一個測試用例對應(yīng)的測試數(shù)據(jù)文件均以.py格式的文件存在,且文件名與測試用例名(TestCase層中的類名)相對應(yīng)。下面以添加用戶的測試數(shù)據(jù)文件進行說明。測試數(shù)據(jù)以變量的形式存在,其中XML格式的內(nèi)容便于Python裝飾器的使用。
add_user={
"name":"abcd",
"password":"qwer1234"
}
xml_user_name = ′′′
<data_driver>
<user>
<name>abcd</name>
</user>
<user>
<name>ABCDEFG</name>
</user>
</data_driver>
′′′
5自動化測試執(zhí)行
5.1測試用例管理
測試用例管理使用XML文件以及對應(yīng)的解析代碼來實現(xiàn)。測試用例執(zhí)行的級別可以根據(jù)項目需要設(shè)置為全用例集、BVT用例集、模塊級用例集、特定用例集等。每種測試級別使用對應(yīng)的XML文件進行配置和管理。日志級別包括顯示所有日志信息、只顯示錯誤和警告日志信息、顯示調(diào)試信息等。
下面以模塊級用例集的XML配置文件為例進行說明。module name為模塊名稱,description為對該模塊的功能描述,filename為該模塊對應(yīng)的測試用例腳本存放的文件名稱,run為執(zhí)行標志,如果為True表示執(zhí)行,如果為False表示不執(zhí)行。
<?xml version="1.0" encoding="UTF-8"?>
<modules>
<module name="User" id="01">
<description>用戶</description>
<filename>User.py</filename>
<run>True</run>
</module>
</modules>
5.2測試報告生成
測試報告采用unittest單元測試庫擴展的HTMLTestRunner.py,可以生成HTML的自動化測試報告。使用方法如下面代碼所示。
fp=file(result_file, 'wb')
runner=HTMLTestRunner(
stream=fp,
title=u"中標麒麟微云操作系統(tǒng)V2.0-HTTP接口自動化測試報告",
description=(
u"中標麒麟微云操作系統(tǒng)V2.0-HTTP接口自動化測試報告\\n"
u'測試執(zhí)行方式:%s' % exec_type
)
自動化測試執(zhí)行完成后,會在指定的目錄下生成測試報告。報告中顯示測試報告名稱、測試起始時間、測試時長、狀態(tài)(包括通過用例數(shù)、失敗用例數(shù)、錯誤用例數(shù)),顯示測試用例列表,可以展開顯示測試用例日志詳情,測試通過的用例綠色顯示,失敗的用例橙色顯示,錯誤的用例(一般是測試腳本有問題)紅色顯示,以便后續(xù)可以區(qū)分查看和分析。
6CSRF Token驗證問題解決
跨站請求偽造(Crosssite Request Forgery,CSRF)是一種對網(wǎng)站的惡意利用。由于目標站無token/referer限制,導(dǎo)致攻擊者能以用戶的身份完成操作,達到各種目的。
為了提高Web的安全性,有些Web在提交Ajax請求時需要CSRF Token驗證。如何在調(diào)用HTTP接口的頭信息中設(shè)置正確的Cookie值,成為自動化測試HTTP接口的難點。筆者在實際項目測試中提出了兩種解決方案,這兩種方案都需要結(jié)合Firefox瀏覽器。
6.1通過Firefox瀏覽器獲取
在Firefox瀏覽器中安裝firebug插件,啟用firebug。手動登錄待測Web頁面。查看firebug中登錄操作的【網(wǎng)絡(luò)】 【XHR】 【頭信息】 【響應(yīng)頭信息】 【SetCookie】的內(nèi)容。
腳本流程圖如圖4所示。使用該方法由于需要模擬用戶進行瀏覽器登錄操作,因此需要導(dǎo)入selenium.Webdriver模塊。
6.2通過Logout接口和Login接口獲取
在Firefox瀏覽器上先手動登錄再退出待測Web頁面。查看Firebug中退出操作的【網(wǎng)絡(luò)】 【XHR】 【頭信息】 【請求頭信息】 【Cookie】的內(nèi)容。
腳本流程圖如圖5所示。該方法相對于通過Firefox瀏覽器獲取的方法,效率更高。
7結(jié)論
本文研究了HTTP接口自動化測試方法,采用Python語言開發(fā)代碼,使用Request調(diào)用HTTP接口。提出了一種分層結(jié)構(gòu)的自動化測試框架,將接口調(diào)用、測試用例和測試數(shù)據(jù)的代碼分層開發(fā),生成基于HTML的測試報告,方便瀏覽和統(tǒng)計。提出了兩種解決CSRF Token驗證問題的方案,并在實際項目中進行了應(yīng)用。該自動化測試方法 開發(fā)出的自動化腳本結(jié)構(gòu)清晰,容易維護,有效提高了測試效率,降低了測試成本。
參考文獻
[1] 王會青,馮秀芳. Web應(yīng)用軟件測試方法的研究[J]. 太原理工大學學報,2007, 38(4):54 57.
?。?] 瑁靜,鐘亦平,張世永. 基于協(xié)議分析的自動化Web性能測試[J]. 計算機工程,2005, 31(7):66 69.
?。?] WASSERMANN G, Yu Dachuan, CHANDER A. Dynamic test input ceneration for Web apllications[J]. ISST’08, July, 2008:20 24.
[4] DOUGLAS E, COMER, DAVID L, 等. 用TCP/IP進行網(wǎng)際互連(第1卷)第4版[M].林瑤,蔣慧,杜蔚軒,譯. 北京:電子工業(yè)出版社,1998.
[5] CHUN W J. Python核心編程(第2版)[M]. 宋吉廣,譯. 北京:人民郵電出版社,2008.