1. 程式人生 > >unittest實現HTTP介面功能測試

unittest實現HTTP介面功能測試

作者:vickygui

一、背景

目前主流的H5頁面動態獲取內容的方式是採用ajax非同步請求後臺資料實現實時重新整理,實際上就是用GET/POST的HTTP請求後臺介面,再將返回的資料(一般是json或xml格式)渲染在頁面上,因此保證H5頁面介面的功能正確性就成為了頁面內容資料正確的關鍵,普通的H5頁面測試通常會採用手工測試的方式,這樣只能模擬到正常的場景,對於異常的資料請求是無法覆蓋的,並且對於請求引數很多的情況,效率很低,另外還有一部分資料內容介面是無頁面的,如外部合作介面,只提供資料,對應的頁面由合作方自己來做,則無法採用手工的方式進行測試。

實際上H5頁面介面測試與傳統的介面測試的基本思路是一致的,就是通過資料準備(包括正常和異常的引數)、介面呼叫、結果觀察這三個流程來驗證介面的功能邏輯符合預期,並且對於未預期的異常情況有較好的容錯性和魯棒性,只不過介面的呼叫引數形式有所不同,如下表所示。

另外在H5頁面介面測試中還需要根據介面的實際情況模擬請求的HTTP頭部,這些也是驗證介面資料和邏輯的一部分,這些都是與傳統的介面測試不同的部分。

文章接下來的部分就提供了一種能夠完成H5頁面介面測試的方法,主要應用於新開發的H5頁面介面的功能測試。

二、為什麼選擇unittest

通過第一部分的闡述,我們對H5頁面介面測試的基本流程有了瞭解,那麼為了實現H5頁面測試,我們就需要一種工具,它需要有以下功能:

  • 1、進行GET&POST請求呼叫
  • 2、模擬HTTP頭部進行請求
  • 3、方便的構造引數
  • 4、豐富的斷言庫,對結果進行判斷
  • 5、清晰的結果展示,SUCC /FAIL
  • 6、方便的執行和除錯,用例FAIL時給出除錯資訊

以上需求按照優先順序排列,其中1和2是必須的,之前的測試工作中都是採用python來進行HTTP請求,原因是python中的requests庫能夠方便的模擬各種HTTP請求,並且呼叫非常簡潔,因此很自然的想到了用python,而為了能夠對結果進行斷言並且清晰的展示測試結果,於是我們採用了unittest。

三、什麼是unittest

unittest是python自帶的單元測試模組,與java的單元測試框架junit類似,一個測試類中可以包含多個測試用例,每個用例以test_開頭,執行前在setUp方法中進行初始化工作,執行後在tearDown方法中完成退出清理。多個測試類可以組成test suite同時進行測試。unittest同樣包含豐富的斷言庫,可以對結果型別、內容等多個方面進行驗證,在結果展示方面,在python的IDE Pycharm中能夠得到清晰的結果以及錯誤資訊,如下圖。


在上面的測試結果中,能夠清晰的看到用例總數、執行的用例數及失敗的用例數,點選左邊的用例名稱,可以看到失敗資訊,還可以直接跳至對應的出錯行,最左邊的功能區的第二個按鈕可以重跑所有失敗用例。最後對於執行失敗的用例,只要在對於用例區域右擊,選擇對應的”Debug…”選項就可以單獨除錯用例以確定是否是測試用例的問題導致執行失敗,從而保證結果的準確性。

3.1 unittest基本用法

下面是unittest的基本使用方法,不同的測試用例可能稍有不同,但思路是一致的。

    1. import unittest
    1. 定義一個繼承自unittest.TestCase的測試用例類
    1. 定義setUp和tearDown,在每個測試用例前後做一些輔助工作
    1. 定義測試用例,名字以test開頭
    1. 一個測試用例應該只測試一個方面,測試目的和測試內容應該很明確。進行了測試所需的操作後獲取結果,然後呼叫assertEqual、assertRaises等斷言方法判斷程式執行結果和預期值是否相符,unittest提供的結果斷言主要有以下幾個,後面的註釋部分是各個斷言的含義
    1. 呼叫unittest.main()啟動測試
    1. 觀察測試結果,根據結果調整指令碼或反饋問題

四、需要怎麼做

在開始編寫測試用例之前需要確定介面的請求方式(GET/POST)、請求引數、請求所需的HTTP頭部、返回的結果型別和內容基本要素等。其中請求引數又需要知道引數的型別、範圍。根據這些資訊能夠組合出需要測試的場景,每一個場景就是一個測試用例,需要覆蓋正常和異常的情況。

一個基本的用例流程如下圖:

下面將逐一介紹如何實現H5頁面介面的功能測試。

4.1 請求引數設定

這個部分需要根據測試場景設定所需的請求引數,包括呼叫引數和HTTP頭部(主要是referer、content-type、cookie等),對於呼叫引數的多種正常組合,可以使用單個引數迴圈遍歷然後組合的方式,只需要一個測試用例即可,這樣可以減少用例編寫的工作量以及維護的成本。

4.2 介面呼叫

介面呼叫可以採用python的第三方庫—Requests實現,Requests基於urllib,採用Apache2 Licensed開源協議的HTTP庫,支援HTTP連線保持和連線池,支援使用cookie保持會話,支援檔案上傳,支援自動確定響應內容的編碼,支援國際化的URL和POST資料自動編碼。它比 urllib 更加方便,可以節約我們大量的工作,完全滿足HTTP測試需求。

使用requests進行HTTP請求非常簡單,下面分別是GET和POST基本請求:

GET:

POST:

對於POST請求,requests還支援自動編碼,只要將請求body傳入json關鍵字引數即可,上面的程式碼將請求http://httpbin.org/post且請求body為:{“key1”: “value1”, “key2”: “value2”},如果請求body不是json格式,而是string格式,可以用data關鍵字引數直接設定。另外requests還會對引數自動進行URL編碼。

如果需要為請求新增HTTP頭部,只要簡單地傳遞一個 dict 給頭部 引數即可:

上面的程式碼示例是POST請求,當然對於GET請求也是同樣的。

對於請求得到的響應,requests也有豐富的方法處理,比較關鍵的幾個方法:

上面程式碼執行後,code是響應的狀態碼,r_text是響應的內容,r_json是響應內容的json格式。

4.3 結果斷言

得到了響應的狀態和內容之後,就可以利用unittest的斷言庫對結果進行校驗了,首先需要校驗的是響應的狀態碼,上面介紹瞭如何得到響應的狀態碼,直接與預期值進行判等,如:

其次是響應頭,可能需要對Content-Type、Content-Length等關鍵欄位進行驗證,同樣從響應中獲取對應欄位的值,然後直接用asserTrue斷言去驗證。

最後是響應的內容,HTTP介面的響應的內容一般來說有三種格式:json(最主要)、xml和html,對於json格式的響應可以直接用requests自帶的json解析器進行解析,然後判斷其中的關鍵key的值等,如下面的程式碼斷言響應中的”success”是否為”True”;對於xml格式的響應,可以先獲取響應的文字內容然後採用python的第三方類庫如:lxml等,將xml文字轉成標籤樹,然後通過對應的xpath讀取值並進行校驗;對於html格式的響應,獲取響應的文字內容後用正則匹配或者xpath來得到需要校驗的值。

總結

本文主要介紹了一種利用python第三方類庫requests及單元測試工具unittest實現H5頁面介面功能測試的方法,主要運用場景是對於新開發的H5頁面介面的功能測試,能夠模擬到手工測試無法覆蓋的異常場景並且有效降低測試工作量,並且能反覆測試,快速驗證問題。當然對於功能已經比較穩定的介面,需要其他的H5頁面介面測試工具對介面進行監控及質量保證,多種方式結合才能更好的把控H5頁面介面的質量。

本章完~~

我們專注於移動測試技術精華,飽含騰訊多款億級APP的品質祕密,文章皆獨家原創,我們不談虛的,只談乾貨!

掃碼關注我們

掃一掃 關注TMQ
精彩分享不斷

相關推薦

unittest實現HTTP介面功能測試

作者:vickygui 一、背景 目前主流的H5頁面動態獲取內容的方式是採用ajax非同步請求後臺資料實現實時重新整理,實際上就是用GET/POST的HTTP請求後臺介面,再將返回的資料(一般是json或xml格式)渲染在頁面上,因此保證H5頁面介面的功能正

學習總結——JMeter做http介面功能測試 學習總結——JMeter做http介面功能測試

JMeter對各種型別介面的測試 預設做介面測試前,已經給出明確的介面文件(如,http://test.nnzhp.cn/wiki/index.php?doc-view-59);本地配好了JMeter 3.x的執行環境; 開啟JMeter,新增一個執行緒組和該執行緒組的檢視結果樹。以下的幾種介面請求我們都

java單元測試之如何實現非同步介面測試案例

測試是軟體釋出的重要環節,單元測試在實際開發中是一種常用的測試方法,java單元測試主要用junit,最新是junit5,本人開發一般用junit4。因為單元測試能夠在軟體模組組合之前儘快發現問題,所以實際開發中投入產出比很高。實際使用難免會遇到非同步操作的介面測試,最常用的情景是別人家的SD

使用httpclient實現http介面呼叫遇到的坑

最近做一個使用httpclient傳輸json格式引數的介面,使用spring定時器定時觸發呼叫。本來感覺一個簡單的小程式,但是上線之後遇到了很奇葩的問題,執行一段時間後spring定時器莫名的死掉了,然後重啟服務,幾天之後又死掉了。當時第一感覺是不是資料庫連線沒關閉,導致程式死掉,檢查程式碼連線都正常關閉了

使用Jmeter應該如何進行http介面效能測試

在進行網頁或應用程式後臺介面開發時,一般要及時測試開發的介面能否正確接收和返回資料,對於單次測試,Postman外掛是個不錯的Http請求模擬工具。  但是Postman只能模擬單客戶端的單次請求,而對於模擬多使用者併發等效能測試,就必須藉助其他的工具了,這裡推薦功能強大的JMe

使用jmeter+maven+jenkins實現restful介面自動化測試

一、環境搭建 安裝 jdk、eclipse、git Jdk下載路徑:http://rj.baidu.com/soft/detail/14459.html?ald Eclipse線上安裝包下載地址:http://www.eclipse.org/downl

Postman介面功能測試介紹

Postman介紹&測試準備 Postman介紹:postman是一個開源的介面測試工具,無論是做單個介面的測試還是整套測試指令碼的撥測都非常方便。   前期準備:測試前,需要安裝好postman, 客戶端版本跟外掛版本都行,根據個人需要選擇安裝。   五種請求介紹:這裡介紹get/post/帶

介面自動化測試持續整合--Soapui介面功能測試資料傳遞

做介面測試經常會遇到如下兩種情況需要處理資料傳遞 介面間的資料依賴,A介面請求的引數需要用到B介面的返回值 介面請求通常要用到鑑權的介面獲取Token,Token通常會跟其他介面構成一對多的關係,這種情況下我們可以把Token的介面做成一個公共的TestCase,供其他的TestCas

介面自動化測試持續整合--Soapui介面功能測試持續整合

Soapui介面功能測試持續整合,需要先安裝好maven和jenkins,maven和jenkins安裝和系統環境配置比較簡單,在這裡不做敘述。     1.Soapui儲存的工程檔案

springmvc 實現http介面 接受json引數

使用springmvc實現http介面時,發現問題。將引數直接放入url裡面引數能被正常解析到如下: public void test(  Long roleId,  Integer roleCod

免費的https、http介面測試介面可以使用

本文轉自:https://blog.csdn.net/ak341221/article/details/61205789 2017年03月10日 20:30:18 凡人不羨仙 閱讀數:19013 標籤: https免費介面http免費介面免費可用的網路介面

jMeter介面測試-一個簡單http介面測試案例

注:1)複雜的測試案例都是在這個簡單的測試案例上進行擴充套件2)一個子系統建議放在同一個測試計劃中,流程測試可以通過執行緒組區分,便於設定不同的測試資料個數。比較獨立的介面,可以統一放線上程組內,順序完成測試。3)流程性介面測試:如果要測試的介面可以組成一個流程,執行順序新增

netty實現http api功能

無可致疑,netty是java的網路通訊框架,支援高併發。本文掃描使用netty完成簡單的http的能力,不涉及安全,業務過濾等內容。 片段1 /** * 啟動http伺服器 * @throws InterruptedException */ private

介面功能測試要點

單介面測試: 1. json格式測試: 通常我們的介面一般設計的都是傳遞json串,那麼就需要去測試 如果傳遞非json的情況,這時候程式會不會正確的處理,返回相應的 error code 2. 預設值測試: 很多情況一些非必填的引數

淺談HTTP介面效能測試指令碼的編寫

作為測試界的老司機,最近接到一項任務需要寫新的效能測試程式碼。由於之前的測試程式碼風格和自己習慣的編碼風格差別實在太大,因此放棄了模仿原來的測試程式碼繼續新增測試用例的想法,自己從頭開始寫了一些測

Python 基於python+Testlink+Jenkins實現介面自動化測試框架

目錄 8、 說明 win7 PyCharm 4.0.5 python 3.3.2 testlink-1.9.14 TestLink-API-Python-client-master 1、框架集成了Testlink,可

利用eolinker實現api介面mock測試(mock server)

前後端分離或者是進行單元測試的時候,必須要用mock api替換掉第三方呼叫或者是實際的API,eolinker提供了非常全面的mock api支援,其他那些需要安裝配置的mock server就不說了,有現成的幹嘛還要自己搭。 Api資訊如下,url裡面可以把根路徑去掉

MicroPython TPYBoard v702實現HTTP應用功能

[Micropython]TPYBoard v702 HTTP應用功能 轉載請註明文章來源,更多教程可自助參考docs.tpyboard.com,QQ技術交流群:157816561,公眾號:MicroPython玩家匯 什麼是TPYBoard v702 TPYBoard v702是山東蘿蔔電子科技有限公

Python介面自動化測試框架: pytest+allure+jsonpath+requests+excel實現介面自動化測試框架(學習成果)

[toc] # 廢話 最近在自己學習介面自動化測試,這裡也算是完成一個小的成果,歡迎大家交流指出不合適的地方,原始碼在文末 # 問題 整體程式碼結構優化未實現,導致最終測試時間變長,其他工具單介面測試只需要39ms,該框架中使用了101ms,考慮和頻繁讀寫用例資料導致 # 環境與依賴 | 名稱

測試http介面的類的實現

package com.goldgrid.utils; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import