1. 程式人生 > >介面測試 Http 介面測試框架 (開源 + 已投入實際專案中)

介面測試 Http 介面測試框架 (開源 + 已投入實際專案中)

轉載地址:https://testerhome.com/topics/5631

說明

由於部分內容涉及公司機密,已用字母替換,不影響閱讀

實際效果

  • 驗證1000個介面平均耗時6s(看機器配置及網速)
  • 第一次投入使用,馬上發現5個介面異常並且該驗證過程不到30s的時間

框架的下一步

  • 目前已相容我們公司所有app

  • response body全欄位驗證(含欄位型別)

    • 已有思路
  • 欄位變化導致2個大問題

    • 由原本int(0/1)變成了布林型
    • 時間戳長度由10位突然變成13位
  • 儘量避免日常監控中跑介面對外網資料/使用者的影響

    • 目前做法是遮蔽相關介面
    • 目前狀態
    • 跑介面時建立的資料id有變化,然而刪除介面還是呼叫老的id去刪除,導致資料刪除不到
    • 改進
    • 攔截建立資料的response body取出對於id
    • 攔截刪除介面request body,傳入上一步攔截的id

最新框架圖(紅色部分未完成)

Http介面測試框架

部分程式碼

配置檔案

http介面測試框架配置資訊

tester = tester
project = A
versionName = 2.2.2
versionCode = 237
host = a-webapi.test.b.com
getTokenHost = http://a-webapi.test.b.com/api/System/GetToken
loginHost = http://a-webapi.test.b.com/api/User/LoginV2
loginInfo = Phone=13750199962&Password=FGgIwe5oCdk%3D SessionsPath = D:\Fiddler Sessions ApiURL = http://apihelper.b.com/Home/API/c # SpecialSessions >> 遮蔽的介面 SpecialSessions = ['GetToken', 'LoginV2', 'LogOut', 'BookingV2']

啟動測試入口

"""
執行api測試總入口
"""

import sessions.Request


def launcher_api_test
(): """ 1.獲取介面列表 2.與本地sessions對比 3.差異化檔案,是否繼續 3.1否 繼續錄製介面 3.2是 開始跑介面 :return: """ r = sessions.Request.Request(0) # 0 >> A 1 >> B r.start() if __name__ == "__main__": launcher_api_test()

頭部、登入介面

def __get_token_header(self):
    """
    生成token頭部
    :return:
    """
    des = self.__get_token_des()
    arr = (des, self.conf['systemType'], self.conf['Model'], self.conf['Release'], self.conf['DeviceId'],
           self.conf['versionCode'], self.conf['versionName'], self.conf['AppBuild'], self.conf['DeviceOS'], "0")
    authorization = self.AUTHORIZATION_TOKEN % arr
    headers = {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'Authorization': authorization}
    response = self.session.post(self.conf['getTokenHost'], headers=headers)
    if json.loads(response.text)['StatsCode'] == 200:
        data1 = json.loads(response.text)['Data']
        self.time = data1['Time']
        self.TOKEN_NAME = data1['TokenName']
        self.TOKEN_VALUE = data1['TokenValue']
    else:
        print("GetToken失敗,請手動檢查")
        utils.HandleJson.HandleJson.print_json(response.text)

def __login_session(self):
    """
    呼叫登入介面,這樣後面的介面都能正常訪問了
    :return:
    """
    url_login = self.conf['loginHost']
    headers = self.__get_session_header(url_login.split('api/')[-1])
    data_login = r'%s' % self.conf['loginInfo']
    response = self.session.post(url_login, headers=headers, data=data_login)
    if json.loads(response.text)['StatsCode'] == 200:
        data1 = json.loads(response.text)['Data']
        self.uId = data1[self.head_uid]
        self.uName = data1['NickName']
        self.uPhone = data1['Phone']
        self.SessionId = data1['Sid']
        self.uType = data1['UserType']
        self.uuid = data1['UID']
    else:
        print("登入失敗,請手動檢查")
        utils.HandleJson.HandleJson.print_json(response.text)

介面片段

Request url: a-webapi.test.b.com/api/Circle/AddCancelCollectCircle
Request header: POST /api/Circle/AddCancelCollectCircle HTTP/1.1
Host: a-webapi.test.b.com
Accept: text/json
Authorization: Digest t="2016-08-04 16:41:19",SystemType="2",u="Circle/AddCancelCollectCircle",r="59e93eb1a6625adc6bff5ede5945a2f7",DeviceId="ffffffff-8416-49fe-3fdc-6ee400000000",Model="SM-N9100",DeviceOS="22",Release="5.1.1",VersionName="2.2.2",VersionCode="239",PushToken="",uId="3353",uName="123456ejz",uPhone="13750199962",SessionId="%2FZhckUf9%2Fd2soQZhYofjN021SdWUpLv0aW%2F3CJBr71vtOl1YHJda6J8p6P1hsQS0P3kqirm%2BtPs%3D",uType="1",bDChannelId="",bDUserId="",AppBuild="239",uUID="2255"
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Length: 21
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.0.1

Request body: CircleId=6418&IsAdd=1
Response code: 200
Response body: {"StatsCode":200,"Message":"收藏成功","Data":null,"Other":null}
Session end



Request url: a-webapi.test.b.com/api/Circle/AddCancelCollectCircle
Request header: POST /api/Circle/AddCancelCollectCircle HTTP/1.1
Host: a-webapi.test.b.com
Accept: text/json
Authorization: Digest t="2016-08-04 16:41:22",SystemType="2",u="Circle/AddCancelCollectCircle",r="26dcb55ee9ac79995c21656517c455e8",DeviceId="ffffffff-8416-49fe-3fdc-6ee400000000",Model="SM-N9100",DeviceOS="22",Release="5.1.1",VersionName="2.2.2",VersionCode="239",PushToken="",uId="3353",uName="123456ejz",uPhone="13750199962",SessionId="%2FZhckUf9%2Fd2soQZhYofjN021SdWUpLv0aW%2F3CJBr71vtOl1YHJda6J8p6P1hsQS0P3kqirm%2BtPs%3D",uType="1",bDChannelId="",bDUserId="",AppBuild="239",uUID="2255"
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Length: 21
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.0.1

Request body: CircleId=6418&IsAdd=0
Response code: 200
Response body: {"StatsCode":200,"Message":"取消收藏成功","Data":null,"Other":null}
Session end

介面列表

介面列表

你需要做的

  • 環境配置

    • Python 3.x
    • fiddler一枚(配置抓取手機請求)
    • PyCharm
  • token/session替換

    • 替換成你們專案對應的token等
    • 修改配置檔案
    • 修改response body json 判斷邏輯
  • 替換fiddler js

    • 專案根目錄的fiddler js整個檔案內容替換fiddler的js
    • 開啟fiddler的Customize Rules功能
    • 刪除所有內容,並把fiddler js內容全部拷貝進去
    • 修改攔截的host等資訊

fiddler js 自定義資訊


//自定義引數設定
public static var filterUrl = "a-webapi.test.b.com";
public static var filePath = "D:\\Fiddler Sessions\\Api\\";
public static var filePathForRequested = "D:\\Fiddler Sessions\\Requested.txt";
public static var filePathForErrorResponse = "D:\\Fiddler Sessions\\ErrorResponse.txt";
public static var filePathForVerifyRequset = "D:\\Fiddler Sessions\\VerifyRequset.txt";
public static var filePathForRemoveSession = "D:\\Fiddler Sessions\\RemoveSession.txt";
public static var filePathForAddSession = "D:\\Fiddler Sessions\\AddSession.txt";
  • github拉取程式碼
  • 歡迎一起交流

GitHub

https://github.com/qNone/ApiTests

相關推薦

介面測試 Http 介面測試框架 (開源 + 投入實際專案)

轉載地址:https://testerhome.com/topics/5631 說明 由於部分內容涉及公司機密,已用字母替換,不影響閱讀 實際效果 驗證1000個介面平均耗時6s(看機器配置及網速)第一次投入使用,馬上發現5個介面異常並且該驗證過程不到30s的時間

介面測試 Http 介面測試框架 (思路 + 實現 + 開源 + 可能難產)

寫在前面   有時間我會把我初步的想法整理好分享出來,大家一起來探討它的可行性,它不一定適用你們的業務,但是非常適合我專案的業務。雖然它也可能難產,但是我想盡力去做、去完成,也算鞏固一下自己的知識,應用到專案中去。 這個框架需要大家不斷的鞭策、一起努力、共同搭建,可以隨時發表看法,歡迎拍磚,求不打

Maven搭建SSM框架測試HTTP 介面

spring-mvc.xml檔案<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.

測試http介面的類的實現

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

測試-http介面測試點

前言 2015年開始接觸QA這個行業,從實習到正式入職,一直都在Qunar的QA崗位上。回顧這兩年多的工作經歷(中間回學校一段時間),雖然做了許多自認為很高大上的東西,但是晉升答辯中被問到的許多基礎問題,卻成了自己最薄弱的一項。所以現在更想把更多的經歷去放到基

jmeter測試http介面

早前測試介面都是用chrome的外掛postman,一般用著還不錯,只不過涉及引數化和指令碼複用方面就不太方便了。 有朋友推薦使用jmeter測試效能,可能因為jmeter在對介面支援上比較好,所以在對介面做效能測試的時候,jemter成了一個比較好的選擇。重點是它是開

如何測試http介面 日記一

今天組長讓測試一個http介面,當時有點懵,不知道怎麼測試,,想了一下,有了點思路,但是剛開始想到的是通過request請求來寫個方法呼叫,那先不管對錯,咱們今天先分享一下,通過request/response請求來呼叫http的方式: (在網上收了一段程式碼:) 程式碼如

實際專案手動測試和自動測試的合理運用

一、手動測試         手動測試,就是指完全依賴人工測試軟體,主要根據測試用例來執行測試,但是測試用例也不可能100%覆蓋軟體功能還要通過其他方式來發現軟體缺陷,這樣就要求測試人員的經驗要豐富並且具有發散思維的能力,通過錯誤猜測等方法來彌補測試用例沒有覆蓋的部分。 手

有ssh專案加入webservice(CXF)

一、服務端實現。 1.CXF必須包; 2.applicationcontext.xml裡面加入 (1)標頭檔案: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.spri

HTTP介面自動化經驗總結(三)Okhttp3 介面測試框架搭建之資料處理

上篇文章寫了怎麼新建POST,GET方法。這篇文章介紹下該如何校驗。 因為我們在方法裡面都返回了String型別結果,String型別校驗起來比較麻煩。多數http介面返回的都是json形式。我們可以寫一個通用方法將String型別轉換為Map物件這樣校驗就比較方便準確了。廢話不多說直接上方法。

HTTP介面自動化經驗總結(二)Okhttp3 介面測試框架搭建

搭建這套環境前,需要Eclipse安裝testNG,Maven 1.Eclipse安裝testNG https://mp.csdn.net/postedit/81868683 2.Eclipse安裝Maven http://www.cnblogs.com/pengyan-9826/p

從零開始 製作屬於自己的HTTP介面測試框架(一)

第一次嘗試做長部落格,決定以HTTP介面測試框架為主題,名字暫定為Fairy Client,開發語言使用Java 初步決定這個框架應該具備這樣幾個功能 1.使用註解進行介面請求 2.請

jmeter之介面測試http介面測試

基礎知識儲備 一、瞭解jmeter介面測試請求介面的原理 客戶端--傳送一個請求動作--伺服器響應--返回客戶端 客戶端--傳送一個請求動作--jmeter代理伺服器---伺服器--jmeter代理伺服器--伺服器 二、瞭解基礎介面知識: 1、什麼是介面:前端與後臺之間的橋樑、資料傳輸的通道,就是一

django http介面測試

curl #get curl http://address:port/url?args #post curl http://address:port/url -d "param1=value1&param2=value2" #上傳檔案 curl http://address:po

對非同步處理的http介面進行效能測試

對非同步處理的http介面進行效能測試 以前對介面做效能測試,介面都是同步處理的,請求之後等待響應結果就知道處理結果了,這樣只要看這個介面是否異常,如果無異常無報錯記錄這個介面的響應時間、TPS等效能指標進行分析就可以了,最近在工作中遇到了非同步處理的介面,邏輯是隻要你請求引數全部合法,即返回成

介面測試http協議

1、瞭解http基本請求流程   http的請求方式 在介面測試中,一般來說,post建立資料,get獲取建立成功後的所有資料和指定的資料,put可以對建立成功後的資料 進行修改,delete是指定的資源。 2、瞭解常用的狀態碼 常用的狀態碼 1、200&nbs

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

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

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

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

HTTP介面自動化經驗總結(四)Okhttp3 介面測試用例編寫

經過前面幾次的分享,我們已經有了方法和結果,那麼這篇文章我們就來寫測試用例。 首先我們新建一個TestNG class,名字為APITest,繼承我們的依賴方法DependeicesMethod 1.get介面測試 //測試Get方法,其餘校驗請自行新增 @Test

使用web_submit_data()和web_custom_request()函式編寫HTTP介面測試指令碼實戰

最近在做HTTP協議介面壓測時,遇到一些編寫指令碼方面的問題,在這裡總結記錄下,以便以後溫習,也希望能幫助到和我有同樣困惑的朋友吧。 //實戰程式碼如下所示:Action() { lr_start_transaction("事物"); // 斷言內容:processcode":"0000","pro