楊清玉,李金麗,陳吉蘭,李志偉
(中標軟件有限公司 操作系統測試認證中心,北京 100190)
?
HTTP接口自動化測試方法研究*
楊清玉,李金麗,陳吉蘭,李志偉
(中標軟件有限公司 操作系統測試認證中心,北京 100190)
研究了HTTP接口自動化測試方法,采用Python語言開發代碼,使用Request調用HTTP接口。提出了一種分層結構的自動化測試框架,將接口調用、測試用例和測試數據的代碼分層開發,生成基于HTML的測試報告。提出了兩種解決CSRF Token驗證問題的方案。該方法開發出的自動化測試腳本具有結構清晰、易維護等優點,能夠有效提高測試效率,降低測試成本。
HTTP接口;Python;Request;自動化測試
引用格式:楊清玉,李金麗,陳吉蘭,等. HTTP接口自動化測試方法研究[J].微型機與應用,2016,35(18):22-25.
Web業務日趨復雜,系統愈加龐大,版本的發布周期變短,使得Web產品測試的難度極大地提高,工作量也大幅增加[1]。Web產品的測試中非技術性、重復性的測試工作占總的測試工作量比例比較大,因而需要大量的資源來保障Web產品的質量[2-3]。在開發Web產品時,開發過程中一般采用了分層的軟件體系結構,Web頁面通過HTTP協議向接口發送請求,后端處理請求返回結果。由于業務邏輯比較復雜,有著大量的接口,如果使用自動化測試代替手工測試,可以有效提高測試效率,降低測試成本。

圖1 客戶/服務器模式的信息交換過程
超文本傳輸協議(Hyper Text Transfer Protocol, HTTP)是互聯網上應用最為廣泛的一種網絡協議。HTTP是基于請求和響應模式的無狀態應用層協議。其客戶/服務器模式的信息交換過程如圖1所示。信息交換過程分四個部分:建立連接、發送請求信息、發送響應信息和關閉連接[4]。
絕大多數的Web開發都是構建在HTTP協議之上的Web應用。本文所進行的自動化測試的對象為中標軟件有限公司的微云操作系統產品,該產品的Web接口為HTTP協議的接口。針對該接口的自動化測試,筆者采用Python語言進行代碼的開發,使用Request進行HTTP接口的調用。使用Eclipse并安裝PyDev插件作為集成開發環境,在自動化測試框架下開發自動化測試代碼。
Python是一個通用目的的編程語言,已經有很多年的發展歷程。這個穩定而成熟的語言是非常高層的、動態的、面向對象的和跨平臺的。Python可以在所有主流的硬件平臺和操作系統上運行。它繼承了傳統編譯語言的強大性和通用性,同時也借鑒了簡單腳本和解釋語言的易用性,語法簡捷清晰、可讀性強、便于維護,并且具有一致性和規律性、豐富的標準庫,以及許多可以很容易在Python中使用的第三方模塊。Python還可以被當做最適合入門程序員掌握的優秀語言,因為它免費、面向對象、擴展性強,同時執行嚴格的編碼標準[5]。
Request對象的作用是與客戶端交互,收集客戶端的Form、Cookies、超鏈接,或者收集服務器端的環境變量。Request對象是從客戶端向服務器發出請求,包括用戶提交的信息以及客戶端的一些信息。客戶端可通過HTML表單或在網頁地址后面提供參數的方法提交數據,然后通過Request對象的相關方法來獲取這些數據。Request的各種方法主要用來處理客戶端瀏覽器提交的請求中的各項參數和選項。
3.1自動化測試框架設計思想
本文設計的自動化測試框架采用分層結構,依據模塊化、可復用、低冗余等原則,將代碼根據不同的功能分為若干個獨立的模塊,這里將一類模塊稱為一層。每一層都完成自己特定的任務,各層之間根據需要去進行調用。分層思想最先是在軟件開發過程中提出來的。當代碼量小的時候,采用這種模式會增加工作量;但是當代碼量變大時,采用這種模式可以使設計思路清晰,代碼冗余度變低,可擴展性更好,代碼維護更加方便,程序運行效率更高。
3.2自動化測試框架實現
自動化測試框架是由一個或多個自動化測試基礎模塊、自動化測試管理模塊、自動化測試統計模塊等組成的工具集合。本文的自動化測試框架如圖2所示,分為測試環境配置層、接口操作層、測試數據層、測試用例層、測試用例管理層等。每一層都實現自己特定的功能,并提供接口給其他層調用。

圖2 自動化測試框架
Config層:測試環境配置層,存儲測試環境相關設置參數。比如待測環境的IP、主機名、登錄用戶名、密碼等。
TestAPI層:接口操作層,對HTTP接口的調用進行封裝。比如獲取列表信息、添加、刪除、修改等。
TestData層:測試數據層,用于管理測試用例所需要用到的測試數據。Data文件的名稱需要與對應的Test Case名稱一致,以便數據解析。
TestCase層:測試用例層,每一個TestCase類均采用單元測試框架來構造,即每一個TestCase均繼承于unittest.testcase類。在實際的設計中,通過繼承unittest.testcase類,重寫并加入一些方法,從而形成了一個名為BaseTestCase的父類,全部的TestCase的類均繼承自這個父類。
TestSuite層:測試用例管理,包括測試用例執行的級別、每種測試級別對應的測試用例集以及日志記錄級別。
HTMLTestRunner層:測試報告管理模塊,用于生成測試報告,這個報告是基于HTML的,方便瀏覽和統計。
TestCenter層:測試管理層,是整個測試程序的入口。它實現了解析并找出需要執行的測試用例,執行測試用例腳本,并生成測試結果。
在具體的測試代碼開發過程中,主要編寫TestAPI層、TestCase層和TestData層的代碼。下面詳細介紹這三層代碼開發的模式。
4.1TestAPI層
這一層主要進行HTTP接口的調用。為了實現對接口的調用,首先,需要從項目組獲取圖3所示的接口說明。如果項目組沒有完整的接口說明文檔,可以結合firebug獲取。需要在Firefox瀏覽器中安裝firebug插件,啟用插件后,在瀏覽器上所進行的操作會被記錄下來。

圖3 接口說明
然后,編寫代碼調用HTTP接口。下面以添加用戶的HTTP接口調用代碼為例進行說明。
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接口接收的參數格式和返回的信息是json格式,因此需要導入json模塊,并在調用接口前,使用json.dumps將參數轉換成json格式,對返回信息使用json.loads轉換成字典格式,以便后續使用。
4.2TestCase層
TestCase層用于存放編寫的測試用例,調用TestAPI層的方法??梢詫estCase層與實際的測試用例對應起來。當接口發生變化時,只需修改TestAPI中的代碼,而基本不需要修改或者只需要對TestCase層代碼進行很少量的修改。每一個測試用例用一個類表示,且均繼承自同一個父類BaseTestCase;而BaseTestCase則繼承自unittest.testcase類,所以,TestCase類均具有unittest.testcase類的屬性。在BaseTestCase類中定義了每個測試用例開始執行和結束時的動作以及一些case中用到的公共方法。
TestCase類的代碼包含四個部分:數據和實例初始化、測試環境準備、實際測試代碼、資源回收。代碼結構如下。
class ITC_EditUser_LegalName(BaseTestCase):
′′′
@summary:編輯用戶-用戶名合法
′′′
def setUp(self):
#第一部分——數據和實例初始化
#調用父類方法,獲取該用例所對應的測試數據模塊
self.user=super(self.__class__, self).setUp()
self.user_api=UserAPIs()
self.flag = True
# 第二部分——測試環境準備
#添加用戶
self.user_api.addUser(self.user.add_user)
def test_EditUser_LegalName(self):
#第三部分——實際測試代碼
#編輯用戶
def tearDown(self):
#第四部分——用例執行結束后的資源回收
#刪除用戶
self.user_api.deleteUser(data)
4.3TestData層
測試數據文件均存放在TestData層。每一個測試用例對應的測試數據文件均以.py格式的文件存在,且文件名與測試用例名(TestCase層中的類名)相對應。下面以添加用戶的測試數據文件進行說明。測試數據以變量的形式存在,其中XML格式的內容便于Python裝飾器的使用。
add_user={
"name":"abcd",
"password":"qwer1234"
}
xml_user_name = ′′′
′′′
5.1測試用例管理
測試用例管理使用XML文件以及對應的解析代碼來實現。測試用例執行的級別可以根據項目需要設置為全用例集、BVT用例集、模塊級用例集、特定用例集等。每種測試級別使用對應的XML文件進行配置和管理。日志級別包括顯示所有日志信息、只顯示錯誤和警告日志信息、顯示調試信息等。
下面以模塊級用例集的XML配置文件為例進行說明。module name為模塊名稱,description為對該模塊的功能描述,filename為該模塊對應的測試用例腳本存放的文件名稱,run為執行標志,如果為True表示執行,如果為False表示不執行。
5.2測試報告生成
測試報告采用unittest單元測試庫擴展的HTMLTestRunner.py,可以生成HTML的自動化測試報告。使用方法如下面代碼所示。
fp=file(result_file, 'wb')
runner=HTMLTestRunner(
stream=fp,
title=u"中標麒麟微云操作系統V2.0-HTTP接口自動化測試報告",
description=(
u"中標麒麟微云操作系統V2.0-HTTP接口自動化測試報告 "
u'測試執行方式:%s' % exec_type
)
自動化測試執行完成后,會在指定的目錄下生成測試報告。報告中顯示測試報告名稱、測試起始時間、測試時長、狀態(包括通過用例數、失敗用例數、錯誤用例數),顯示測試用例列表,可以展開顯示測試用例日志詳情,測試通過的用例綠色顯示,失敗的用例橙色顯示,錯誤的用例(一般是測試腳本有問題)紅色顯示,以便后續可以區分查看和分析。
跨站請求偽造(Cross-site Request Forgery,CSRF)是一種對網站的惡意利用。由于目標站無token/referer限制,導致攻擊者能以用戶的身份完成操作,達到各種目的。
為了提高Web的安全性,有些Web在提交Ajax請求時需要CSRF Token驗證。如何在調用HTTP接口的頭信息中設置正確的Cookie值,成為自動化測試HTTP接口的難點。筆者在實際項目測試中提出了兩種解決方案,這兩種方案都需要結合Firefox瀏覽器。
6.1通過Firefox瀏覽器獲取
在Firefox瀏覽器中安裝firebug插件,啟用firebug。手動登錄待測Web頁面。查看firebug中登錄操作的【網絡】-【XHR】-【頭信息】-【響應頭信息】-【Set-Cookie】的內容。
腳本流程圖如圖4所示。使用該方法由于需要模擬用戶進行瀏覽器登錄操作,因此需要導入selenium.Webdriver模塊。

圖4 通過Firefox瀏覽器獲取Cookie流程圖
6.2通過Logout接口和Login接口獲取
在Firefox瀏覽器上先手動登錄再退出待測Web頁面。查看Firebug中退出操作的【網絡】-【XHR】-【頭信息】-【請求頭信息】-【Cookie】的內容。
腳本流程圖如圖5所示。該方法相對于通過Firefox瀏覽器獲取的方法,效率更高。
本文研究了HTTP接口自動化測試方法,采用Python語言開發代碼,使用Request調用HTTP接口。提出了一種分層結構的自動化測試框架,將接口調用、測試用例和測試數據的代碼分層開發,生成基于HTML的測試報告,方便瀏覽和統計。提出了兩種解決CSRF Token驗證問題的方案,并在實際項目中進行了應用。該自動化測試方法

圖5 通過Logout接口和Login接口獲取Cookie流程圖
開發出的自動化腳本結構清晰,容易維護,有效提高了測試效率,降低了測試成本。
[1] 王會青,馮秀芳. Web應用軟件測試方法的研究[J]. 太原理工大學學報,2007, 38(4):54-57.
[2] 瑁靜,鐘亦平,張世永. 基于協議分析的自動化Web性能測試[J]. 計算機工程,2005, 31(7):66-69.
[3] 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進行網際互連(第1卷)第4版[M].林瑤,蔣慧,杜蔚軒,譯. 北京:電子工業出版社,1998.
[5] CHUN W J. Python核心編程(第2版)[M]. 宋吉廣,譯. 北京:人民郵電出版社,2008.
陳吉蘭:(1986-),女,碩士,工程師,主要研究方向:軟硬件兼容性測試。
Research on automatic testing method for HTTP interface
Yang Qingyu, Li Jinli, Chen Jilan, Li Zhiwei
(Operating System Test and Certification Center,China Standard Software Co., Ltd., Beijing 100190, China)
An automatic testing method for HTTP interface was investigated. It used Python to develop codes and used Request to call the HTTP Interface. A hierarchical framework for automatic testing was proposed. In this framework, the codes of interface called, test cases and test data were developed separately. It generated test report based on HTML. In this paper, two solutions for the problem of CSRF Token verification were proposed. The automatic testing scripts developed with this method had the advantages of clear structure and easy to maintain. It could effectively improve the efficiency of testing and reduce the cost of testing.
HTTP interface; Python; Request; automatic testing
國家高技術研究發展計劃(863計劃)(2014AA123001)
TP311.5
ADOI: 10.19358/j.issn.1674- 7720.2016.18.006
2016-05-16)
楊清玉(1986-),女,碩士,工程師,主要研究方向:云計算技術、自動化測試技術。
李金麗(1974-),女,學士,高級工程師,主要研究方向:操作系統及相關應用軟件測試及自動化。