你要的介面資料都在這裡了

資深測試發表於2018-08-17

1. 介面測試的型別

主要包含三種測試:

  1. Web介面測試,
  2. 應用程式介面(API, application programming interface)測試,
  3. 資料庫測試。

實際上意義就是UI介面到資料庫之間,資料流經過的所有過程。

LAMP(Linux Apache MySQL PHP)/LNMP(Linux Nginx MySQL PHP):只有 Web 伺服器,沒有應用伺服器。

  • Web 瀏覽器 到 Web 伺服器: Web 介面測試,測試 請求和響應。
  • Web 伺服器 到 資料庫伺服器:應用介面測試,測試 PHP。

Linux / Windows + Java / Asp.net(C#) + Apache/Nginx + Tomcat/IIS + MySQL/Oracle/SQL server

  • Web 瀏覽器 到 Web 伺服器: Web 介面測試,測試 請求和響應。
  • Web 伺服器 到 應用伺服器:契約服務,WebService,JavaAPI,WebAPI,WCF,.net Remoting:測試 Java 或者 C# 處理業務邏輯(JavaEE/ ASP.NET MVC),通俗講測試 Service。
  • 應用伺服器 到 資料庫伺服器:資料處理服務,測試 Java 或者 C# 處理資料,把資料讀取到資料庫。

我們需要關注的是 Web 介面測試。

Web 介面測試的方法:

  • Python 或者 Java,C# 程式設計,觸發請求,讀取響應,分析得到的響應資料進行與源資料的對比。
  • 用工具:Postman 或者 SoapUI(不推薦)

Postman 原本是一個 Chrome 瀏覽器的外掛,現在已經提供了 Windows、MacOS 和Linux 的獨立安裝版本。接下來用Windows的版本來進行安裝和使用。

2. Postman 的安裝

  1. 下載 Postman 的安裝包,分為 32位 和 64位。www.getpostman.com

  2. 安裝 Postman

  3. 註冊使用者(Sign Up) 並登入 (Sign In)

    Snap23.png

  4. 可以在多臺電腦登入,做過的測試會自動同步。

    Snap24.png

  5. 安裝完並且登入以後可以開始測試。

    Snap25.png

3. Web 介面的測試點

Web 介面通過 HTTP(S)請求,是一個URL,URL請求結果,會得到資料,資料的格式主要有兩種,一種JSON,一種 XML。主要用JSON演示。

  • JSON,是JavaScript Object Notation,JavaScript 物件表示法。是用來表示JavaScript的物件,或者JavaScript資料等。因為JavaScript廣泛的應用在 Web的前端頁面,所以 JSON 主要應用在 Web 介面中。主要的應用場景:
    • APP移動端和伺服器的通訊。用應用層 HTTP 協議,通過 Web介面讀取資料和處理(提交)資料。
    • Web前端與伺服器的通訊,往往伺服器是第三方的,主要的場景就是 支付和第三方登入。
      • 京東 web端 呼叫 微信支付、財付通支付、支付寶支付、銀聯支付、網銀支付。。。
      • 京東 web端 支援 微信登入、QQ登入、微博登入
      • 京東 web端 顯示 第三方的的物流資訊(順豐、申通、圓通。。。)
      • 公共資料,在web端/APP端的天氣預報 是由第三方介面提供。
  • XML,Extensible Markup Language,可擴充套件的標記語言,HTML就是XML的一種形式,通過 標籤的成對出現,以及標籤的層次,來決定資料的內容。XML 主要用在後端的 應用程式介面的資料傳遞,比如 Java,C#等。XML 比較舊的格式。

接下來用一個例子,來分別JSON和XML表示以下的表格資料。

employee_idfirst_namelast_nameemailphone_numberhire_datejob_idsalary
100StevenKingSKING515.123.45676/17/1987AD_PRES24000
101NeenaKochharNKOCHHAR515.123.45689/21/1989AD_VP17000

首先用 JSON的形式,JSON是“鍵值對”(Key Value)的形式

{  "employees": [{    "employee_id": 100,    "first_name": "Steven",    "last_name": "King",    "email": "SKING",    "phone_number": "515.123.4567",    "hire_date": "6/17/1987",    "job_id": "AD_PRES",    "salary": 24000  },  {    "employee_id": 101,    "first_name": "Neena",    "last_name": "Kochhar",    "email": "NKOCHHAR",    "phone_number": "515.123.4568",    "hire_date": "9/21/1989",    "job_id": "AD_VP",    "salary": 17000  }]} 複製程式碼


對應的 XML 格式:

<?xml version="1.0" encoding="UTF-8" ?><employees>    <employee>        <employee_id>100</employee_id>        <first_name>Steven</first_name>        <last_name>King</last_name>        <email>SKING</email>        <phone_number>515.123.4567</phone_number>        <hire_date>6/17/1987</hire_date>        <job_id>AD_PRES</job_id>        <salary>24000</salary>    </employee>    <employee>        <employee_id>101</employee_id>        <first_name>Neena</first_name>        <last_name>Kochhar</last_name>        <email>NKOCHHAR</email>        <phone_number>515.123.4568</phone_number>        <hire_date>9/21/1989</hire_date>        <job_id>AD_VP</job_id>        <salary>17000</salary>    </employee></employees> 複製程式碼

Web 介面的定義來決定測試內容

  1. Method:GET POST PUT DELETE
  2. URL: 介面的地址
  3. 請求引數:每個引數名字,引數的型別,引數的範圍,引數是否可選,引數是否有預設值
  • 等價類:有效等價的引數,無效等價的引數
  • 邊界值:離點,上點,內點
  • 正交試驗法:×因子 ×狀態
  • 有的時候,引數之間關聯:省,市,縣(區),尤其注意非法(無效)的關聯
  1. 斷言:檢查響應的內容
  • 正文:正文是否包含某些字元
  • 正文:JSON 或者 XML 的鍵值對檢查,數量檢查 xx.length
  • 響應的狀態碼:200, 403
  • 響應的時間: 100ms, 200ms
    *5. 認證:你是否有許可權訪問介面
  1. 介面的實質物件:資料

    1. 資料的格式
    2. 資料的內容

4. Postman 的使用

  1. 測試 心知天氣 API:www.seniverse.com/

    1. 登入 心知天氣 (先註冊)

    2. 讀 介面的 API 文件

      • API的定義: API 的URL的組成 和請求方法
      • API的引數
        • 請求引數
        • 響應引數
    3. 以 獲取實時天氣作為示例:

      1. API的方法和URL:GET, api.seniverse.com/v3/weather/…

      2. API的引數:

        1. 請求引數:

          引數名引數型別引數意義是否必選
          keystring你的API金鑰true
          locationstring查詢的地理位置true
          languagestring結果表示的語言false,預設簡體中文
          unitstring結果表示的單位(華氏度,攝氏度)false,預設攝氏度
        2. 響應引數:

          引數名引數型別引數意義
          location物件:包括id, name, country, time_zone, time_zone_offset
          now物件:包括 text,code, temperature, feel_like...
          last_update日期
        3. 用Postman開始測試

          1. new tab 中輸入 方式,和URL

          2. 點選 Params 設定引數

          3. 點選 send 開始傳送請求

          4. 檢視請求結果是否有輸出,格式是否和上述的響應引數對應



{  "results": [    {      "location": {        "id": "WS10730EM8EV",        "name": "Shenzhen",        "country": "CN",        "path": "Shenzhen,Shenzhen,Guangdong,China",        "timezone": "Asia/Shanghai",        "timezone_offset": "+08:00"      },      "now": {        "text": "Cloudy",        "code": "4",        "temperature": "25"      },      "last_update": "2017-05-09T10:05:00+08:00"    }  ]} 複製程式碼

編輯 Tests 頁面,新增斷言。

var jsonData = JSON.parse(responseBody);tests["檢查城市名稱"] = jsonData.results[0].location.name === "Shenzhen";複製程式碼

使用Postman 登入然之系統,測試登入介面

  1. 使用然之 4.2 或者以上版本

  2. 修改然之系統 配置檔案 C:\xampp5\htdocs\ranzhi\config\my.php,在最後新增一行配置,如下圖:

$config->notEncryptedPwd = true;複製程式碼

  1. 重啟 Apache

  2. 開啟 Chrome,輸入然之的網址,開啟登入頁面

    Chrome 開啟登入頁面

  3. 開啟 Fiddler,並設定 Chrome 進行抓包

  4. 在 Chrome 中進行登入,提交使用者名稱和密碼

  5. 在 Fiddler 中捕獲剛剛的登入 POST 請求

    Fiddler 抓包登入 POST

  6. 開啟 Postman,新建 URL,POST方法。

    需要設定 Postman,點選 File | Settings,進行設定

    settings

    Setting 2

  7. 在 Postman 輸入剛剛 Fiddler 請求的 POST 的 URL

    Fiddler 抓包分析

    輸入上述 URL

    URL

  8. 在 Fiddler 中複製請求的第二行到空行之間的 訊息報頭(Head),Postman 輸入 Head

Head 1

Head2.png

  1. 在 Fiddler 中複製請求的正文,在 Postman 中 body 選擇 raw,並輸入

    輸入 Body

  2. 在 Postman 的test 中輸入以下測試內容:

var jsonData = JSON.parse(responseBody);tests["檢查locate"] = jsonData.locate === "\/sys\/index.html";tests["檢查result"] = jsonData.result === "success";tests["Status code is 200"] = responseCode.code === 200; 複製程式碼
    1. 在 Chrome 中退出登入,注意此步驟很重要,退出以後才能夠進行 Postman 登入

      退出 然之

    2. 在 Postman 中點選 Send,進行測試

      測試結果

    3. 檢視 Postman 的執行結果。

      result.png

5. Web 介面的認證

Web 介面測試的準備

  1. HTTP協議的請求和響應
    請求:GET/POST
    響應:html/JSON/XML/CSS/JavaScript/png..
  2. 測試的概念
    斷言:檢查返回的響應裡面的內容。
    測試設計:根據請求的引數來設計用例
  3. 讀懂介面的文件
    請求的方式和URL
    請求的引數和響應的引數
  4. 在請求介面時使用認證
    basic authorization 基礎認證,輸入使用者名稱和密碼

在上面四個的基礎上,注意Web 介面需要認證,尤其是支付業務,這裡用一個例子,並且是POST請求 + Basic Auth 認證,來闡述此部分。

示例的步驟:

  1. 開啟 www.pingxx.com/ Ping++ 線上支付網站,註冊一個賬號,並登入,會自動建立一個應用。

    Snap27.png

  2. 進入自動建立的應用,進入應用的控制皮膚介面。

  3. 獲取 APP[id],按如圖的方式獲取到,並等下使用

    Snap28.png

  4. 獲取 Test Secret Key,按照如圖的方式獲取到,並依舊等下使用

    Snap29.png

    Snap30.png

  5. 按照下操作,查閱 API 文件,並開始測試。

    Snap31.png

    Snap32.png

    Snap33.png

  6. 選擇 Charge,建立一個 支付訂單,查閱 API 文件的請求引數,響應引數,依舊 方法和URL

    Snap34.png

  7. 在Postman 中建立新的測試,輸入 POST 和 URL

    Snap35.png

  8. 設定引數,其中需要用到 APP[id],為之前步驟獲取到的。

    Snap36.png

  9. 在 請求中使用 認證,Basic Auth,輸入 之前步驟獲取到的 Test Secret Key,作為使用者名稱。

    Snap37.png

    Snap38.png

  10. 新增測試斷言。

用 JavaScript指令碼,查詢 JSON 物件的值,並做檢查。點選右側的現成選單,會自動生成檢查 JSON 的框架。

var jsonData = JSON.parse(responseBody);tests["檢查object值"] = jsonData.object === "charge";tests["檢查order_no值"] = jsonData.order_no === "99887766554433221100";tests["檢查amount值"] = jsonData.amount === 9900;複製程式碼

Snap39.png

  1. 點選 Send 開始測試。

    Snap40.png

  • 示例2:建立紅包的Web 介面測試
  1. 微信紅包支付介面測試的介面描述

    建立紅包的Web介面描述

  2. 在 Postman 中輸入 POST 方法和 URL

    Paste_Image.png

  3. 在 Postman 中 使用 Http Basic Auth 認證。輸入之前獲取的 Secret_test_key。根據 API文件進行的操作

    Paste_Image.png

    在 Postman 中操作

    Paste_Image.png

    Paste_Image.png

  4. 輸入 請求的引數,注意 POST 請求的請求引數,輸入到 Body 中

    輸入正文

  5. 在 Test 設定斷言,剛才說要設定 Object 的驗證。

    輸入以下內容:

    斷言

    var jsonData = JSON.parse(responseBody);tests["檢查 Object 屬性"] = jsonData.object === "red_envelope";tests["檢查 金額 屬性"] = jsonData.amount === 6000;複製程式碼

  6. 點選Send,檢查。

    結果

  7. 到管理平臺檢視訂單結果。

    Paste_Image.png

6. Postman 的其他功能

Postman 支援匯出用例以及賬戶的同步功能。

Snap41.png

7. Python requests 的使用

Postman 作為工具,有UI的工具可以完整的操作 Web API(Application Programming Interface),有些場景,還需要在自動化測試方案中操作 Web API。對於 Python 來說有兩種主流的工具操作 HTTP Web API。

  • urllib (python 自帶的,但是語法反人類)
  • requests (第三方的,但是 HTTP Request for human),我們推薦這個 requests 工具。

和 Selenium 一樣,requests 也是第三方的工具庫。類比 Selenium 操作瀏覽器,requests 操作 HTTP 請求。

部署 requests 的過程

pip install requests
複製程式碼

requests 有兩個常見的方法

  1. requests.get()
  2. requests.post()

上面兩個方法都會返回一個 Response 類的物件。注意 Response 類 屬於 requests。

作為自動化介面測試工具,類似於 Selenium,我們需要 用 Page-Object 方式進行設計

  • 每個 Page 寫一個 URL 的功能。
    • get_realtime_weather_by_ip
    • get_realtime_weather_by_city
    • get_realtime_weather_by_location
    • ... 單位
    • ... 語言
  • 每個 page 都不可以 直接用 requests
    • 封裝 requests 到 box_requests.py
    • 建立一個類,用來從封裝的 box_requests.py 中返回我們定製的 結果(響應)
  • 在每個用例中,繼承 unittest.TestCase,呼叫 Page,進行測試
    • 測試用的資料還是應該抽出來,放到 csv 或者 資料庫中

8. 簡單的GET請求例項

  • 天氣實況

GET /weather/now.json

獲取指定城市的天氣實況。付費使用者可獲取全部資料,免費使用者只返回天氣現象文字、程式碼和氣溫3項資料。注:中國城市暫不支援雲量和露點溫度。

請求地址示例

api.seniverse.com/v3/weather/…

引數

  • key

    你的API金鑰

  • location

    所查詢的位置引數值範圍:城市ID 例如:location=WX4FBXXFKE4F城市中文名 例如:location=北京省市名稱組合例如:location=遼寧朝陽、location=北京朝陽城市拼音/英文名 例如:location=beijing(如拼音相同城市,可在之前加省份和空格,例:shanxi yulin)經緯度 例如:location=39.93:116.40(緯度前經度在後,冒號分隔)IP地址 例如:location=220.181.111.86(某些IP地址可能無法定位到城市)“ip”兩個字母 自動識別請求IP地址,例如:location=ip

  • language

    語言 (可選)引數值範圍:點此檢視

  • unit

    單位 (可選)引數值範圍:c 當引數為c時,溫度c、風速km/h、能見度km、氣壓mbf 當引數為f時,溫度f、風速mph、能見度mile、氣壓inch預設值:c

返回結果 200

{  "results": [{  "location": {      "id": "C23NB62W20TF",      "name": "西雅圖",      "country": "US",      "timezone": "America/Los_Angeles",      "timezone_offset": "-07:00"  },  "now": {      "text": "多雲", //天氣現象文字      "code": "4", //天氣現象程式碼      "temperature": "14", //溫度,單位為c攝氏度或f華氏度      "feels_like": "14", //體感溫度,單位為c攝氏度或f華氏度      "pressure": "1018", //氣壓,單位為mb百帕或in英寸      "humidity": "76", //相對溼度,0~100,單位為百分比      "visibility": "16.09", //能見度,單位為km公里或mi英里      "wind_direction": "西北", //風向文字      "wind_direction_degree": "340", //風向角度,範圍0~360,0為正北,90為正東,180為正南,270為正西      "wind_speed": "8.05", //風速,單位為km/h公里每小時或mph英里每小時      "wind_scale": "2", //風力等級,請參考:http://baike.baidu.com/view/465076.htm      "clouds": "90", //雲量,範圍0~100,天空被雲覆蓋的百分比 #目前不支援中國城市#      "dew_point": "-12" //露點溫度,請參考:http://baike.baidu.com/view/118348.htm #目前不支援中國城市#  },  "last_update": "2015-09-25T22:45:00-07:00" //資料更新時間(該城市的本地時間)  }]}複製程式碼

具體的步驟:

  • 封裝 requests 到 box_requests.py

    import requestsfrom model.http_response import HttpResponse class BoxRequests:    def get(self, url, param):        """        用 Get 的方式請求 URL        :param url:         :param param: 引數        :return: model 中的 HttpResponse 類的物件        """        r = requests.get(url, param)        http_response = HttpResponse()        http_response.status_code = r.status_code        http_response.json_dict = r.json()        return http_response 複製程式碼

  • 建立一個資料夾 model,在裡面建立一個類 HttpResponse

    class HttpResponse:    status_code = None    json_dict = None複製程式碼

  • 建立一個 page :senivers_realtime_weather_page.py

    from base.box_requests import BoxRequests class SeniversRealtimeWeatherPage:     base_url = "/weather/now.json"     def get_weather_by_ip(self, host, api_key):        """        根據IP地址所在的地方查詢天氣        :param host:        :param api_key:        :return: 自定義的 HttpResponse 類的物件        """        br = BoxRequests()         # 建立一個字典,用來傳引數        param = {            "key": api_key,            "location": "ip"        }         # 用 host 和 全域性 base_url 拼成 URL        http_response = br.get(host + self.base_url, param)        return http_response 複製程式碼

  • 建立一個 case :seniverse_api_tests.py

    import unittest from pages.api.senivers_realtime_weather_page import SeniversRealtimeWeatherPage複製程式碼

class SeniverseApiTests(unittest.TestCase):
api_key = None
page = None
host = None

  def setUp(self):      self.api_key = "MJX11XSAPG"      self.host = "https://api.seniverse.com/v3"      self.page = SeniversRealtimeWeatherPage()   def test_query_realtime_weather_by_ip(self):      r = self.page.get_weather_by_ip(self.host, self.api_key)      self.assertEqual(200, r.status_code, "狀態碼返回不正確!")      expected_city = "深圳"      actual_city = r.json_dict["results"][0]["location"]["name"]      self.assertEqual(expected_city, actual_city, "城市名稱與ip不相符合")複製程式碼

if name == "main":
unittest.main()

## 9. 簡單的 POST 請求例項 1. 封裝 Requests.post()方法   1. 傳遞 url   2. 傳遞 data   3. 傳遞 headers2. 建立 PingChargeCreatePage 類   1. create()   2. ...3. 建立 用例 示例如下: ### 建立 Charge 物件 請求:POST `https://api.pingxx.com/v1/charges` 發起一次支付請求時需要建立一個新的 `charge` 物件,獲取一個可用的支付憑據用於客戶端向第三方渠道發起支付請求。如果使用測試模式的 API Key,則不會發生真實交易。當支付成功後,Ping++ 會傳送 Webhooks 通知。 | 請求引數                                 |                                          || ------------------------------------ | ---------------------------------------- || order_no**REQUIRED**                 | 商戶訂單號,適配每個渠道對此引數的要求,必須在商戶系統內唯一。( `alipay` : 1-64 位, `wx` : 2-32 位, `bfb` : 1-20 位, `upacp` : 8-40 位, `yeepay_wap` :1-50 位, `jdpay_wap` :1-30 位, `qpay` :1-30 位, `cmb_wallet` :10 位純數字字串。注:除 `cmb_wallet` 外的其他渠道推薦使用 8-20 位,要求數字或字母,不允許特殊字元)。 || app [ id ]**EXPANDABLE****REQUIRED** | 支付使用的 `app` 物件的 `id` , `expandable` 可展開,檢視 [如何獲取App ID](https://help.pingxx.com/article/198599) 。 || channel**REQUIRED**                  | 支付使用的第三方支付渠道。參考 [支付渠道屬性值](https://www.pingxx.com/api#%E6%94%AF%E4%BB%98%E6%B8%A0%E9%81%93%E5%B1%9E%E6%80%A7%E5%80%BC) 。 || amount**REQUIRED**                   | 訂單總金額(必須大於0),單位為對應幣種的最小貨幣單位,人民幣為分。如訂單總金額為 1 元, `amount` 為 100,麼麼貸商戶請檢視申請的借貸金額範圍。 || client_ip**REQUIRED**                | 發起支付請求客戶端的 IPv4 地址,如: 127.0.0.1。         || currency**REQUIRED**                 | 三位 ISO 貨幣程式碼,目前僅支援人民幣 `cny` 。             || subject**REQUIRED**                  | 商品的標題,該引數最長為 32 個 Unicode 字元,銀聯全渠道( `upacp` / `upacp_wap` )限制在 32 個位元組。 || body**REQUIRED**                     | 商品的描述資訊,該引數最長為 128 個 Unicode 字元,yeepay_wap 對於該引數長度限制為 100 個 Unicode 字元。 || extra*optional*                      | 特定渠道發起交易時需要的額外引數,以及部分渠道支付成功返回的額外引數,詳細參考 [支付渠道 extra 引數說明](https://www.pingxx.com/api#%E6%94%AF%E4%BB%98%E6%B8%A0%E9%81%93-extra-%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E) 。 || time_expire*optional*                | 訂單失效時間,用 Unix 時間戳表示。時間範圍在訂單建立後的 1 分鐘到 15 天,預設為 1 天,建立時間以 Ping++ 伺服器時間為準。 微信對該引數的有效值限制為 2 小時內;銀聯對該引數的有效值限制為 1 小時內。 || metadata*optional*                   | 參考 [後設資料](https://www.pingxx.com/api#%E5%85%83%E6%95%B0%E6%8D%AE) 。 || description*optional*                | 訂單附加說明,最多 255 個 Unicode 字元。              |**返回**返回一個支付憑據 `charge` 物件。鑑於支付渠道對 `order_no` 的合法性要求,為了保證支付請求的正確處理,請務必保證對於同一支付渠道下,不同支付產品間 `order_no` 的唯一性。例如:已在微信公眾號下使用的 `order_no` 則無法在微信支付以及微信公眾號掃碼下重複使用,該規則同樣適用於其他同類渠道。如果發生錯誤,則會返回錯誤碼和錯誤詳情,詳見 [錯誤](https://www.pingxx.com/api#%E9%94%99%E8%AF%AF)。根據 Postman 執行這個測試的情況。選擇以下的資料:- headers- data:params把上述的兩個資料,變成Python 的字典傳遞到 requests.post() 中,檢查得到的響應中的 Json 物件的值。1. 修改 box_requests,新增 post_json方法   ```python   def post_json(self, url, data=None, json=None, **kwargs):       """           用 POST 的方式請求 URL           :param url:           :param data: 提交的資料           :param json: 提交的 json (可選)           :param kwargs: 額外的引數           :return:           """       r = requests.post(url, data, json, **kwargs)       http_response = HttpResponse()       http_response.status_code = r.status_code       http_response.json_dict = r.json()       return http_response複製程式碼
  1. 建立 page,為測試用例服務

    class PingxxChargeCreatePage:    base_url = "/charges"     def create_charge(self, host, data, headers):        br = BoxRequests()         # 用 host 和 全域性 base_url 拼成 URL        http_response = br.post_json(host + self.base_url,                                     data=data,                                     headers=headers)        return http_response複製程式碼

  2. 建立 test_case

    import unittestfrom pages.api.pingxx_charge_create_page import PingxxChargeCreatePage class PingxxApiTests(unittest.TestCase):    test_secret_key = None    app_id = None    page = None    host = None     def setUp(self):        self.app_id = "app_rfv1SGmPKijLnPef"        self.test_secret_key = "c2tfdGVzdF80bXpqelRpenpQQ0NqVEt5VEN5VGVqYlA6"        self.host = "https://api.pingxx.com/v1"        self.page = PingxxChargeCreatePage()     def test_create_charge_by_wechat(self):        data = {            "order_no": "88888888666666664444444422222222",            "app[id]": self.app_id,            "channel": "wx",            "amount": 10000000,            "client_ip": "192.168.1.202",            "currency": "cny",            "subject": "iphone 999 正品行貨",            "body": "正規的水貨 iphone 8 1000臺",            "description": "iphone 8   一打。。。。訂單附加說明,最多 255 個 Unicode 字元。"        }         headers = {"Authorization": "Basic %s" % self.test_secret_key}         r = self.page.create_charge(self.host, data, headers)        self.assertEqual(200, r.status_code, "狀態碼返回不正確!")        expected_object = "charge"        actual_object = r.json_dict["object"]        self.assertEqual(expected_object, actual_object, "物件是否為支付檢查失敗!")複製程式碼
 if __name__ == "__main__":     unittest.main()  ```複製程式碼

在這裡向大家推薦一個測試學習交流群:672899761,群裡有小夥伴提供的自動化,介面和效能的資料哦!


相關文章