《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 測(cè)試測(cè)量 > 設(shè)計(jì)應(yīng)用 > HTTP接口自動(dòng)化測(cè)試方法研究
HTTP接口自動(dòng)化測(cè)試方法研究
2016年微型機(jī)與應(yīng)用第18期
楊清玉,,李金麗,陳吉蘭,,李志偉
中標(biāo)軟件有限公司 操作系統(tǒng)測(cè)試認(rèn)證中心,,北京 100190
摘要: 研究了HTTP接口自動(dòng)化測(cè)試方法,采用Python語(yǔ)言開(kāi)發(fā)代碼,,使用Request調(diào)用HTTP接口,。提出了一種分層結(jié)構(gòu)的自動(dòng)化測(cè)試框架,將接口調(diào)用,、測(cè)試用例和測(cè)試數(shù)據(jù)的代碼分層開(kāi)發(fā),,生成基于HTML的測(cè)試報(bào)告。提出了兩種解決CSRF Token驗(yàn)證問(wèn)題的方案,。該方法開(kāi)發(fā)出的自動(dòng)化測(cè)試腳本具有結(jié)構(gòu)清晰,、易維護(hù)等優(yōu)點(diǎn),能夠有效提高測(cè)試效率,,降低測(cè)試成本,。
Abstract:
Key words :

  楊清玉,李金麗,,陳吉蘭,,李志偉

  (中標(biāo)軟件有限公司 操作系統(tǒng)測(cè)試認(rèn)證中心,,北京 100190)

       摘要:研究了HTTP接口自動(dòng)化測(cè)試方法,,采用Python語(yǔ)言開(kāi)發(fā)代碼,使用Request調(diào)用HTTP接口,。提出了一種分層結(jié)構(gòu)的自動(dòng)化測(cè)試框架,,將接口調(diào)用、測(cè)試用例和測(cè)試數(shù)據(jù)的代碼分層開(kāi)發(fā),生成基于HTML的測(cè)試報(bào)告,。提出了兩種解決CSRF Token驗(yàn)證問(wèn)題的方案,。該方法開(kāi)發(fā)出的自動(dòng)化測(cè)試腳本具有結(jié)構(gòu)清晰、易維護(hù)等優(yōu)點(diǎn),,能夠有效提高測(cè)試效率,,降低測(cè)試成本。

  關(guān)鍵詞:HTTP接口,;Python,;Request;自動(dòng)化測(cè)試

0引言

 Web業(yè)務(wù)日趨復(fù)雜,,系統(tǒng)愈加龐大,,版本的發(fā)布周期變短,使得Web產(chǎn)品測(cè)試的難度極大地提高,,工作量也大幅增加[1],。Web產(chǎn)品的測(cè)試中非技術(shù)性、重復(fù)性的測(cè)試工作占總的測(cè)試工作量比例比較大,,因而需要大量的資源來(lái)保障Web產(chǎn)品的質(zhì)量[2 3],。在開(kāi)發(fā)Web產(chǎn)品時(shí),開(kāi)發(fā)過(guò)程中一般采用了分層的軟件體系結(jié)構(gòu),,Web頁(yè)面通過(guò)HTTP協(xié)議向接口發(fā)送請(qǐng)求,,后端處理請(qǐng)求返回結(jié)果。由于業(yè)務(wù)邏輯比較復(fù)雜,,有著大量的接口,,如果使用自動(dòng)化測(cè)試代替手工測(cè)試,可以有效提高測(cè)試效率,,降低測(cè)試成本,。

1HTTP協(xié)議

  超文本傳輸協(xié)議(Hyper Text Transfer Protocol, HTTP)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。HTTP是基于請(qǐng)求和響應(yīng)模式的無(wú)狀態(tài)應(yīng)用層協(xié)議,。其客戶/服務(wù)器模式的信息交換過(guò)程如圖1所示,。信息交換過(guò)程分四個(gè)部分:建立連接、發(fā)送請(qǐng)求信息,、發(fā)送響應(yīng)信息和關(guān)閉連接[4],。

圖像 001.png

  絕大多數(shù)的Web開(kāi)發(fā)都是構(gòu)建在HTTP協(xié)議之上的Web應(yīng)用。本文所進(jìn)行的自動(dòng)化測(cè)試的對(duì)象為中標(biāo)軟件有限公司的微云操作系統(tǒng)產(chǎn)品,,該產(chǎn)品的Web接口為HTTP協(xié)議的接口,。針對(duì)該接口的自動(dòng)化測(cè)試,筆者采用Python語(yǔ)言進(jìn)行代碼的開(kāi)發(fā),,使用Request進(jìn)行HTTP接口的調(diào)用,。使用Eclipse并安裝PyDev插件作為集成開(kāi)發(fā)環(huán)境,在自動(dòng)化測(cè)試框架下開(kāi)發(fā)自動(dòng)化測(cè)試代碼。

2Python和Request

  Python是一個(gè)通用目的的編程語(yǔ)言,,已經(jīng)有很多年的發(fā)展歷程,。這個(gè)穩(wěn)定而成熟的語(yǔ)言是非常高層的、動(dòng)態(tài)的,、面向?qū)ο蟮暮涂缙脚_(tái)的。Python可以在所有主流的硬件平臺(tái)和操作系統(tǒng)上運(yùn)行,。它繼承了傳統(tǒng)編譯語(yǔ)言的強(qiáng)大性和通用性,,同時(shí)也借鑒了簡(jiǎn)單腳本和解釋語(yǔ)言的易用性,語(yǔ)法簡(jiǎn)捷清晰,、可讀性強(qiáng),、便于維護(hù),并且具有一致性和規(guī)律性,、豐富的標(biāo)準(zhǔn)庫(kù),,以及許多可以很容易在Python中使用的第三方模塊。Python還可以被當(dāng)做最適合入門程序員掌握的優(yōu)秀語(yǔ)言,,因?yàn)樗赓M(fèi),、面向?qū)ο蟆U(kuò)展性強(qiáng),,同時(shí)執(zhí)行嚴(yán)格的編碼標(biāo)準(zhǔn)[5],。

  Request對(duì)象的作用是與客戶端交互,收集客戶端的Form,、Cookies,、超鏈接,或者收集服務(wù)器端的環(huán)境變量,。Request對(duì)象是從客戶端向服務(wù)器發(fā)出請(qǐng)求,,包括用戶提交的信息以及客戶端的一些信息??蛻舳丝赏ㄟ^(guò)HTML表單或在網(wǎng)頁(yè)地址后面提供參數(shù)的方法提交數(shù)據(jù),,然后通過(guò)Request對(duì)象的相關(guān)方法來(lái)獲取這些數(shù)據(jù)。Request的各種方法主要用來(lái)處理客戶端瀏覽器提交的請(qǐng)求中的各項(xiàng)參數(shù)和選項(xiàng),。

3自動(dòng)化測(cè)試框架介紹

  3.1自動(dòng)化測(cè)試框架設(shè)計(jì)思想

  本文設(shè)計(jì)的自動(dòng)化測(cè)試框架采用分層結(jié)構(gòu),,依據(jù)模塊化、可復(fù)用,、低冗余等原則,,將代碼根據(jù)不同的功能分為若干個(gè)獨(dú)立的模塊,這里將一類模塊稱為一層,。每一層都完成自己特定的任務(wù),,各層之間根據(jù)需要去進(jìn)行調(diào)用。分層思想最先是在軟件開(kāi)發(fā)過(guò)程中提出來(lái)的。當(dāng)代碼量小的時(shí)候,,采用這種模式會(huì)增加工作量,;但是當(dāng)代碼量變大時(shí),采用這種模式可以使設(shè)計(jì)思路清晰,,代碼冗余度變低,,可擴(kuò)展性更好,代碼維護(hù)更加方便,,程序運(yùn)行效率更高,。

  3.2自動(dòng)化測(cè)試框架實(shí)現(xiàn)

  自動(dòng)化測(cè)試框架是由一個(gè)或多個(gè)自動(dòng)化測(cè)試基礎(chǔ)模塊、自動(dòng)化測(cè)試管理模塊,、自動(dòng)化測(cè)試統(tǒng)計(jì)模塊等組成的工具集合,。本文的自動(dòng)化測(cè)試框架如圖2所示,分為測(cè)試環(huán)境配置層,、接口操作層,、測(cè)試數(shù)據(jù)層、測(cè)試用例層,、測(cè)試用例管理層等,。每一層都實(shí)現(xiàn)自己特定的功能,并提供接口給其他層調(diào)用,。

圖像 002.png

  Config層:測(cè)試環(huán)境配置層,,存儲(chǔ)測(cè)試環(huán)境相關(guān)設(shè)置參數(shù)。比如待測(cè)環(huán)境的IP,、主機(jī)名,、登錄用戶名、密碼等,。

  TestAPI層:接口操作層,,對(duì)HTTP接口的調(diào)用進(jìn)行封裝。比如獲取列表信息,、添加,、刪除、修改等,。

  TestData層:測(cè)試數(shù)據(jù)層,,用于管理測(cè)試用例所需要用到的測(cè)試數(shù)據(jù)。Data文件的名稱需要與對(duì)應(yīng)的Test Case名稱一致,,以便數(shù)據(jù)解析,。

  TestCase層:測(cè)試用例層,每一個(gè)TestCase類均采用單元測(cè)試框架來(lái)構(gòu)造,,即每一個(gè)TestCase均繼承于unittest.testcase類,。在實(shí)際的設(shè)計(jì)中,,通過(guò)繼承unittest.testcase類,重寫并加入一些方法,,從而形成了一個(gè)名為BaseTestCase的父類,,全部的TestCase的類均繼承自這個(gè)父類。

  TestSuite層:測(cè)試用例管理,,包括測(cè)試用例執(zhí)行的級(jí)別,、每種測(cè)試級(jí)別對(duì)應(yīng)的測(cè)試用例集以及日志記錄級(jí)別。

  HTMLTestRunner層:測(cè)試報(bào)告管理模塊,,用于生成測(cè)試報(bào)告,,這個(gè)報(bào)告是基于HTML的,方便瀏覽和統(tǒng)計(jì),。

  TestCenter層:測(cè)試管理層,是整個(gè)測(cè)試程序的入口,。它實(shí)現(xiàn)了解析并找出需要執(zhí)行的測(cè)試用例,,執(zhí)行測(cè)試用例腳本,并生成測(cè)試結(jié)果,。

4測(cè)試代碼開(kāi)發(fā)

  在具體的測(cè)試代碼開(kāi)發(fā)過(guò)程中,,主要編寫TestAPI層、TestCase層和TestData層的代碼,。下面詳細(xì)介紹這三層代碼開(kāi)發(fā)的模式,。

  4.1TestAPI層

  這一層主要進(jìn)行HTTP接口的調(diào)用。為了實(shí)現(xiàn)對(duì)接口的調(diào)用,,首先,,需要從項(xiàng)目組獲取圖3所示的接口說(shuō)明。如果項(xiàng)目組沒(méi)有完整的接口說(shuō)明文檔,,可以結(jié)合firebug獲取,。需要在Firefox瀏覽器中安裝firebug插件,啟用插件后,,在瀏覽器上所進(jìn)行的操作會(huì)被記錄下來(lái),。

圖像 003.png

  然后,編寫代碼調(diào)用HTTP接口,。下面以添加用戶的HTTP接口調(diào)用代碼為例進(jìn)行說(shuō)明,。

  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)}

  由于實(shí)際測(cè)項(xiàng)目中HTTP接口接收的參數(shù)格式和返回的信息是json格式,因此需要導(dǎo)入json模塊,,并在調(diào)用接口前,,使用json.dumps將參數(shù)轉(zhuǎn)換成json格式,對(duì)返回信息使用json.loads轉(zhuǎn)換成字典格式,,以便后續(xù)使用,。

  4.2TestCase層

  TestCase層用于存放編寫的測(cè)試用例,,調(diào)用TestAPI層的方法??梢詫estCase層與實(shí)際的測(cè)試用例對(duì)應(yīng)起來(lái),。當(dāng)接口發(fā)生變化時(shí),只需修改TestAPI中的代碼,,而基本不需要修改或者只需要對(duì)TestCase層代碼進(jìn)行很少量的修改,。每一個(gè)測(cè)試用例用一個(gè)類表示,且均繼承自同一個(gè)父類BaseTestCase,;而B(niǎo)aseTestCase則繼承自u(píng)nittest.testcase類,,所以,TestCase類均具有unittest.testcase類的屬性,。在BaseTestCase類中定義了每個(gè)測(cè)試用例開(kāi)始執(zhí)行和結(jié)束時(shí)的動(dòng)作以及一些case中用到的公共方法,。

  TestCase類的代碼包含四個(gè)部分:數(shù)據(jù)和實(shí)例初始化、測(cè)試環(huán)境準(zhǔn)備,、實(shí)際測(cè)試代碼,、資源回收。代碼結(jié)構(gòu)如下,。

  class ITC_EditUser_LegalName(BaseTestCase):

  ′′′

  @summary:編輯用戶-用戶名合法

  ′′′

  def setUp(self):

  #第一部分——數(shù)據(jù)和實(shí)例初始化

  #調(diào)用父類方法,,獲取該用例所對(duì)應(yīng)的測(cè)試數(shù)據(jù)模塊

  self.user=super(self.__class__, self).setUp()

  self.user_api=UserAPIs()

  self.flag = True

  # 第二部分——測(cè)試環(huán)境準(zhǔn)備

  #添加用戶

  self.user_api.addUser(self.user.add_user)

  def test_EditUser_LegalName(self):

  #第三部分——實(shí)際測(cè)試代碼

  #編輯用戶

  def tearDown(self):

  #第四部分——用例執(zhí)行結(jié)束后的資源回收

  #刪除用戶

  self.user_api.deleteUser(data)

  4.3TestData層

  測(cè)試數(shù)據(jù)文件均存放在TestData層。每一個(gè)測(cè)試用例對(duì)應(yīng)的測(cè)試數(shù)據(jù)文件均以.py格式的文件存在,,且文件名與測(cè)試用例名(TestCase層中的類名)相對(duì)應(yīng),。下面以添加用戶的測(cè)試數(shù)據(jù)文件進(jìn)行說(shuō)明。測(cè)試數(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自動(dòng)化測(cè)試執(zhí)行

  5.1測(cè)試用例管理

  測(cè)試用例管理使用XML文件以及對(duì)應(yīng)的解析代碼來(lái)實(shí)現(xiàn)。測(cè)試用例執(zhí)行的級(jí)別可以根據(jù)項(xiàng)目需要設(shè)置為全用例集,、BVT用例集,、模塊級(jí)用例集、特定用例集等,。每種測(cè)試級(jí)別使用對(duì)應(yīng)的XML文件進(jìn)行配置和管理,。日志級(jí)別包括顯示所有日志信息、只顯示錯(cuò)誤和警告日志信息,、顯示調(diào)試信息等,。

  下面以模塊級(jí)用例集的XML配置文件為例進(jìn)行說(shuō)明。module name為模塊名稱,,description為對(duì)該模塊的功能描述,,filename為該模塊對(duì)應(yīng)的測(cè)試用例腳本存放的文件名稱,run為執(zhí)行標(biāo)志,,如果為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測(cè)試報(bào)告生成

  測(cè)試報(bào)告采用unittest單元測(cè)試庫(kù)擴(kuò)展的HTMLTestRunner.py,可以生成HTML的自動(dòng)化測(cè)試報(bào)告,。使用方法如下面代碼所示,。

  fp=file(result_file, 'wb')

  runner=HTMLTestRunner(

  stream=fp,

  title=u"中標(biāo)麒麟微云操作系統(tǒng)V2.0-HTTP接口自動(dòng)化測(cè)試報(bào)告",

  description=(

  u"中標(biāo)麒麟微云操作系統(tǒng)V2.0-HTTP接口自動(dòng)化測(cè)試報(bào)告\\n"

  u'測(cè)試執(zhí)行方式:%s' % exec_type

  )

  自動(dòng)化測(cè)試執(zhí)行完成后,會(huì)在指定的目錄下生成測(cè)試報(bào)告,。報(bào)告中顯示測(cè)試報(bào)告名稱,、測(cè)試起始時(shí)間、測(cè)試時(shí)長(zhǎng),、狀態(tài)(包括通過(guò)用例數(shù),、失敗用例數(shù)、錯(cuò)誤用例數(shù)),,顯示測(cè)試用例列表,,可以展開(kāi)顯示測(cè)試用例日志詳情,測(cè)試通過(guò)的用例綠色顯示,,失敗的用例橙色顯示,,錯(cuò)誤的用例(一般是測(cè)試腳本有問(wèn)題)紅色顯示,以便后續(xù)可以區(qū)分查看和分析,。

6CSRF Token驗(yàn)證問(wèn)題解決

  跨站請(qǐng)求偽造(Crosssite Request Forgery,CSRF)是一種對(duì)網(wǎng)站的惡意利用,。由于目標(biāo)站無(wú)token/referer限制,,導(dǎo)致攻擊者能以用戶的身份完成操作,達(dá)到各種目的,。

  為了提高Web的安全性,,有些Web在提交Ajax請(qǐng)求時(shí)需要CSRF Token驗(yàn)證。如何在調(diào)用HTTP接口的頭信息中設(shè)置正確的Cookie值,,成為自動(dòng)化測(cè)試HTTP接口的難點(diǎn),。筆者在實(shí)際項(xiàng)目測(cè)試中提出了兩種解決方案,這兩種方案都需要結(jié)合Firefox瀏覽器,。

  6.1通過(guò)Firefox瀏覽器獲取

  在Firefox瀏覽器中安裝firebug插件,,啟用firebug。手動(dòng)登錄待測(cè)Web頁(yè)面,。查看firebug中登錄操作的【網(wǎng)絡(luò)】 【XHR】 【頭信息】 【響應(yīng)頭信息】 【SetCookie】的內(nèi)容,。

  腳本流程圖如圖4所示。使用該方法由于需要模擬用戶進(jìn)行瀏覽器登錄操作,,因此需要導(dǎo)入selenium.Webdriver模塊,。

圖像 004.png

  6.2通過(guò)Logout接口和Login接口獲取

  在Firefox瀏覽器上先手動(dòng)登錄再退出待測(cè)Web頁(yè)面。查看Firebug中退出操作的【網(wǎng)絡(luò)】 【XHR】 【頭信息】 【請(qǐng)求頭信息】 【Cookie】的內(nèi)容,。

  腳本流程圖如圖5所示,。該方法相對(duì)于通過(guò)Firefox瀏覽器獲取的方法,,效率更高。

7結(jié)論

  本文研究了HTTP接口自動(dòng)化測(cè)試方法,,采用Python語(yǔ)言開(kāi)發(fā)代碼,,使用Request調(diào)用HTTP接口。提出了一種分層結(jié)構(gòu)的自動(dòng)化測(cè)試框架,,將接口調(diào)用,、測(cè)試用例和測(cè)試數(shù)據(jù)的代碼分層開(kāi)發(fā),生成基于HTML的測(cè)試報(bào)告,,方便瀏覽和統(tǒng)計(jì),。提出了兩種解決CSRF Token驗(yàn)證問(wèn)題的方案,并在實(shí)際項(xiàng)目中進(jìn)行了應(yīng)用,。該自動(dòng)化測(cè)試方法 開(kāi)發(fā)出的自動(dòng)化腳本結(jié)構(gòu)清晰,,容易維護(hù),有效提高了測(cè)試效率,,降低了測(cè)試成本,。

圖像 005.png

  參考文獻(xiàn)

  [1] 王會(huì)青,,馮秀芳. Web應(yīng)用軟件測(cè)試方法的研究[J]. 太原理工大學(xué)學(xué)報(bào),,2007, 38(4):54 57.

  [2] 瑁靜,,鐘亦平,,張世永. 基于協(xié)議分析的自動(dòng)化Web性能測(cè)試[J]. 計(jì)算機(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.

 ?。?] DOUGLAS E, COMER, DAVID L, 等. 用TCP/IP進(jìn)行網(wǎng)際互連(第1卷)第4版[M].林瑤,蔣慧,,杜蔚軒,,譯.  北京:電子工業(yè)出版社,1998.

 ?。?] CHUN W J. Python核心編程(第2版)[M]. 宋吉廣,譯. 北京:人民郵電出版社,,2008.


此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載,。