接口測試系列① | 接口測試入門

接口測試講義

1. 接口測試的類型

主要包含三種測試:

  1. Web接口測試侦另,
  2. 應用程序接口(API, application programming interface)測試炼邀,
  3. 數(shù)據(jù)庫測試垂蜗。

實際上意義就是UI界面到數(shù)據(jù)庫之間,數(shù)據(jù)流經(jīng)過的所有過程钓辆。

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

  • Web 瀏覽器 到 Web 服務器: Web 接口測試招拙,測試 請求和響應唧瘾。
  • Web 服務器 到 數(shù)據(jù)庫服務器:應用接口測試,測試 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# 處理業(yè)務邏輯(JavaEE/ ASP.NET MVC),通俗講測試 Service杯巨。
  • 應用服務器 到 數(shù)據(jù)庫服務器:數(shù)據(jù)處理服務蚤告,測試 Java 或者 C# 處理數(shù)據(jù),把數(shù)據(jù)讀取到數(shù)據(jù)庫服爷。

我們需要關注的是 Web 接口測試杜恰。

Web 接口測試的方法:

  • Python 或者 Java,C# 編程层扶,觸發(fā)請求箫章,讀取響應,分析得到的響應數(shù)據(jù)進行與源數(shù)據(jù)的對比镜会。
  • 用工具:Postman 或者 SoapUI(不推薦)

Postman 原本是一個 Chrome 瀏覽器的插件檬寂,現(xiàn)在已經(jīng)提供了 Windows、MacOS 和Linux 的獨立安裝版本戳表。接下來用Windows的版本來進行安裝和使用桶至。

2. Postman 的安裝

  1. 下載 Postman 的安裝包,分為 32位 和 64位匾旭。https://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請求結(jié)果,會得到數(shù)據(jù)伪窖,數(shù)據(jù)的格式主要有兩種逸寓,一種JSON,一種 XML覆山。主要用JSON演示竹伸。

  • JSON,是JavaScript Object Notation簇宽,JavaScript 對象表示法勋篓。是用來表示JavaScript的對象,或者JavaScript數(shù)據(jù)等魏割。因為JavaScript廣泛的應用在 Web的前端頁面譬嚣,所以 JSON 主要應用在 Web 接口中。主要的應用場景:
    • APP移動端和服務器的通信见妒。用應用層 HTTP 協(xié)議孤荣,通過 Web接口讀取數(shù)據(jù)和處理(提交)數(shù)據(jù)。
    • Web前端與服務器的通信须揣,往往服務器是第三方的盐股,主要的場景就是 支付和第三方登錄。
      • 京東 web端 調(diào)用 微信支付耻卡、財付通支付疯汁、支付寶支付、銀聯(lián)支付卵酪、網(wǎng)銀支付幌蚊。。溃卡。
      • 京東 web端 支持 微信登錄溢豆、QQ登錄、微博登錄
      • 京東 web端 顯示 第三方的的物流信息(順豐瘸羡、申通漩仙、圓通。犹赖。队他。)
      • 公共數(shù)據(jù),在web端/APP端的天氣預報 是由第三方接口提供峻村。
  • XML麸折,Extensible Markup Language,可擴展的標記語言粘昨,HTML就是XML的一種形式垢啼,通過 標簽的成對出現(xiàn)窜锯,以及標簽的層次,來決定數(shù)據(jù)的內(nèi)容膊夹。XML 主要用在后端的 應用程序接口的數(shù)據(jù)傳遞衬浑,比如 Java捌浩,C#等放刨。XML 比較舊的格式。

接下來用一個例子尸饺,來分別JSON和XML表示以下的表格數(shù)據(jù)进统。

employee_id first_name last_name email phone_number hire_date job_id salary
100 Steven King SKING 515.123.4567 6/17/1987 AD_PRES 24000
101 Neena Kochhar NKOCHHAR 515.123.4568 9/21/1989 AD_VP 17000

首先用 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 接口的定義來決定測試內(nèi)容

  1. Method:GET POST PUT DELETE
  2. URL: 接口的地址
  3. 請求參數(shù):每個參數(shù)名字浪听,參數(shù)的類型螟碎,參數(shù)的范圍,參數(shù)是否可選迹栓,參數(shù)是否有默認值
  • 等價類:有效等價的參數(shù)掉分,無效等價的參數(shù)
  • 邊界值:離點,上點克伊,內(nèi)點
  • 正交試驗法:×因子 ×狀態(tài)
  • 有的時候酥郭,參數(shù)之間關聯(lián):省,市愿吹,縣(區(qū))不从,尤其注意非法(無效)的關聯(lián)
  1. 斷言:檢查響應的內(nèi)容
  • 正文:正文是否包含某些字符
  • 正文:JSON 或者 XML 的鍵值對檢查,數(shù)量檢查 xx.length
  • 響應的狀態(tài)碼:200, 403
  • 響應的時間: 100ms, 200ms
    *5. 認證:你是否有權限訪問接口
  1. 接口的實質(zhì)對象:數(shù)據(jù)

    1. 數(shù)據(jù)的格式
    2. 數(shù)據(jù)的內(nèi)容

    ?

4. Postman 的使用

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

    1. 登錄 心知天氣 (先注冊)

    2. 讀 接口的 API 文檔

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

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

      2. API的參數(shù):

        1. 請求參數(shù):

          參數(shù)名 參數(shù)類型 參數(shù)意義 是否必選
          key string 你的API密鑰 true
          location string 查詢的地理位置 true
          language string 結(jié)果表示的語言 false犁跪,默認簡體中文
          unit string 結(jié)果表示的單位(華氏度椿息,攝氏度) false,默認攝氏度
        2. 響應參數(shù):

          參數(shù)名 參數(shù)類型 參數(shù)意義
          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 設置參數(shù)

          3. 點擊 send 開始發(fā)送請求

          4. 查看請求結(jié)果是否有輸出寝优,格式是否和上述的響應參數(shù)對應

            {
              "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"
                }
              ]
            }
            

            ?

          5. 編輯 Tests 頁面,添加斷言枫耳。

            var jsonData = JSON.parse(responseBody);
            tests["檢查城市名稱"] = jsonData.results[0].location.name === "Shenzhen";
            
  2. 使用Postman 登錄然之系統(tǒng)乏矾,測試登錄接口

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

    2. 修改然之系統(tǒng) 配置文件 C:\xampp5\htdocs\ranzhi\config\my.php,在最后添加一行配置嘉涌,如下圖:

      修改 然之 配置文件
      $config->notEncryptedPwd = true;
      
    3. 重啟 Apache

    4. 打開 Chrome妻熊,輸入然之的網(wǎng)址,打開登錄頁面

      Chrome 打開登錄頁面
    5. 打開 Fiddler仑最,并設置 Chrome 進行抓包

    6. 在 Chrome 中進行登錄扔役,提交用戶名和密碼

    7. 在 Fiddler 中捕獲剛剛的登錄 POST 請求

      Fiddler 抓包登錄 POST
    8. 打開 Postman,新建 URL警医,POST方法亿胸。

      需要設置 Postman坯钦,點擊 File | Settings,進行設置

      settings
      Setting 2
    9. 在 Postman 輸入剛剛 Fiddler 請求的 POST 的 URL

      Fiddler 抓包分析

      輸入上述 URL

      URL
    10. 在 Fiddler 中復制請求的第二行到空行之間的 消息報頭(Head)侈玄,Postman 輸入 Head

    Head 1
    Head2.png
    1. 在 Fiddler 中復制請求的正文婉刀,在 Postman 中 body 選擇 raw,并輸入

      輸入 Body
    2. 在 Postman 的test 中輸入以下測試內(nèi)容:

      輸入斷言
      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;
      
    3. 在 Chrome 中退出登錄序仙,注意此步驟很重要突颊,退出以后才能夠進行 Postman 登錄

      退出 然之
    4. 在 Postman 中點擊 Send,進行測試

      測試結(jié)果
    5. 查看 Postman 的運行結(jié)果潘悼。

      ?

      result.png

5. Web 接口的認證

Web 接口測試的準備

  1. HTTP協(xié)議的請求和響應
    請求:GET/POST
    響應:html/JSON/XML/CSS/JavaScript/png..
  2. 測試的概念
    斷言:檢查返回的響應里面的內(nèi)容律秃。
    測試設計:根據(jù)請求的參數(shù)來設計用例
  3. 讀懂接口的文檔
    請求的方式和URL
    請求的參數(shù)和響應的參數(shù)
  4. 在請求接口時使用認證
    basic authorization 基礎認證,輸入用戶名和密碼

在上面四個的基礎上治唤,注意Web 接口需要認證棒动,尤其是支付業(yè)務,這里用一個例子宾添,并且是POST請求 + Basic Auth 認證船惨,來闡述此部分。

示例的步驟:

  1. 打開 https://www.pingxx.com/ Ping++ 在線支付網(wǎng)站缕陕,注冊一個賬號粱锐,并登錄,會自動創(chuàng)建一個應用榄檬。

    Snap27.png
  2. 進入自動創(chuàng)建的應用卜范,進入應用的控制面板界面。

  3. 獲取 APP[id]鹿榜,按如圖的方式獲取到海雪,并等下使用

    Snap28.png
  4. 獲取 Test Secret Key,按照如圖的方式獲取到舱殿,并依舊等下使用

    Snap29.png
    Snap30.png
  5. 按照下操作奥裸,查閱 API 文檔,并開始測試沪袭。

    Snap31.png

    Snap32.png

    Snap33.png
  6. 選擇 Charge湾宙,創(chuàng)建一個 支付訂單,查閱 API 文檔的請求參數(shù)冈绊,響應參數(shù)侠鳄,依舊 方法和URL

    Snap34.png
  7. 在Postman 中創(chuàng)建新的測試,輸入 POST 和 URL

    Snap35.png
  8. 設置參數(shù)死宣,其中需要用到 APP[id]伟恶,為之前步驟獲取到的。

    Snap36.png
  9. 在 請求中使用 認證毅该,Basic Auth博秫,輸入 之前步驟獲取到的 Test Secret Key潦牛,作為用戶名。

    Snap37.png

    Snap38.png
  10. 添加測試斷言挡育。

用 JavaScript腳本巴碗,查詢 JSON 對象的值,并做檢查即寒。點擊右側(cè)的現(xiàn)成菜單橡淆,會自動生成檢查 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:創(chuàng)建紅包的Web 接口測試
  1. 微信紅包支付接口測試的接口描述

    創(chuàng)建紅包的Web接口描述
  2. 在 Postman 中輸入 POST 方法和 URL

    Paste_Image.png
  3. 在 Postman 中 使用 Http Basic Auth 認證明垢。輸入之前獲取的 Secret_test_key。根據(jù) API文檔進行的操作

    Paste_Image.png

    在 Postman 中操作

    Paste_Image.png
    Paste_Image.png
  4. 輸入 請求的參數(shù)市咽,注意 POST 請求的請求參數(shù),輸入到 Body 中

    ?

    輸入正文
  5. 在 Test 設置斷言抵蚊,剛才說要設置 Object 的驗證施绎。

    輸入以下內(nèi)容:

    斷言
    var jsonData = JSON.parse(responseBody);
    tests["檢查 Object 屬性"] = jsonData.object === "red_envelope";
    tests["檢查 金額 屬性"] = jsonData.amount === 6000;
    

    ?

  6. 點擊Send,檢查贞绳。

    結(jié)果
  7. 到管理平臺查看訂單結(jié)果谷醉。

    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
    • 創(chuàng)建一個類赖捌,用來從封裝的 box_requests.py 中返回我們定制的 結(jié)果(響應)
  • 在每個用例中祝沸,繼承 unittest.TestCase,調(diào)用 Page越庇,進行測試
    • 測試用的數(shù)據(jù)還是應該抽出來罩锐,放到 csv 或者 數(shù)據(jù)庫中

8. 簡單的GET請求實例

  • 天氣實況

GET /weather/now.json

獲取指定城市的天氣實況。付費用戶可獲取全部數(shù)據(jù)卤唉,免費用戶只返回天氣現(xiàn)象文字涩惑、代碼和氣溫3項數(shù)據(jù)。注:中國城市暫不支持云量和露點溫度桑驱。

請求地址示例

https://api.seniverse.com/v3/weather/now.json?key=MJX11XSAPG&location=beijing&language=zh-Hans&unit=c

參數(shù)

  • key

    你的API密鑰

  • location

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

  • language

    語言 (可選)參數(shù)值范圍:點此查看

  • unit

    單位 (可選)參數(shù)值范圍:c 當參數(shù)為c時押框,溫度c岔绸、風速km/h、能見度km橡伞、氣壓mbf 當參數(shù)為f時盒揉,溫度f、風速mph骑歹、能見度mile预烙、氣壓inch默認值:c

返回結(jié)果 200

{
  "results": [{
  "location": {
      "id": "C23NB62W20TF",
      "name": "西雅圖",
      "country": "US",
      "timezone": "America/Los_Angeles",
      "timezone_offset": "-07:00"
  },
  "now": {
      "text": "多云", //天氣現(xiàn)象文字
      "code": "4", //天氣現(xiàn)象代碼
      "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" //數(shù)據(jù)更新時間(該城市的本地時間)
  }]
}

具體的步驟:

  • 封裝 requests 到 box_requests.py

    import requests
    from model.http_response import HttpResponse
    
    class BoxRequests:
        def get(self, url, param):
            """
            用 Get 的方式請求 URL
            :param url: 
            :param param: 參數(shù)
            :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
    
    

    ?

  • 創(chuàng)建一個文件夾 model,在里面創(chuàng)建一個類 HttpResponse

    class HttpResponse:
        status_code = None
        json_dict = None
    

    ?

  • 創(chuàng)建一個 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):
            """
            根據(jù)IP地址所在的地方查詢天氣
            :param host:
            :param api_key:
            :return: 自定義的 HttpResponse 類的對象
            """
            br = BoxRequests()
    
            # 創(chuàng)建一個字典斋射,用來傳參數(shù)
            param = {
                "key": api_key,
                "location": "ip"
            }
    
            # 用 host 和 全局 base_url 拼成 URL
            http_response = br.get(host + self.base_url, param)
            return http_response
    
    

    ?

  • 創(chuàng)建一個 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, "狀態(tài)碼返回不正確育勺!")
      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. 傳遞 headers
2. 創(chuàng)建 PingChargeCreatePage 類
   1. create()
   2. ...
3. 創(chuàng)建 用例

示例如下:

### 創(chuàng)建 Charge 對象

請求:POST `https://api.pingxx.com/v1/charges`

發(fā)起一次支付請求時需要創(chuàng)建一個新的 `charge` 對象,獲取一個可用的支付憑據(jù)用于客戶端向第三方渠道發(fā)起支付請求罗岖。如果使用測試模式的 API Key涧至,則不會發(fā)生真實交易。當支付成功后桑包,Ping++ 會發(fā)送 Webhooks 通知南蓬。

| 請求參數(shù)                                 |                                          |
| ------------------------------------ | ---------------------------------------- |
| order_no**REQUIRED**                 | 商戶訂單號,適配每個渠道對此參數(shù)的要求捡多,必須在商戶系統(tǒng)內(nèi)唯一蓖康。( `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 位純數(shù)字字符串榜掌。注:除 `cmb_wallet` 外的其他渠道推薦使用 8-20 位,要求數(shù)字或字母乘综,不允許特殊字符)憎账。 |
| 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**                | 發(fā)起支付請求客戶端的 IPv4 地址酒贬,如: 127.0.0.1又憨。         |
| currency**REQUIRED**                 | 三位 ISO 貨幣代碼,目前僅支持人民幣 `cny` 锭吨。             |
| subject**REQUIRED**                  | 商品的標題蠢莺,該參數(shù)最長為 32 個 Unicode 字符,銀聯(lián)全渠道( `upacp` / `upacp_wap` )限制在 32 個字節(jié)耐齐。 |
| body**REQUIRED**                     | 商品的描述信息浪秘,該參數(shù)最長為 128 個 Unicode 字符,yeepay_wap 對于該參數(shù)長度限制為 100 個 Unicode 字符埠况。 |
| extra*optional*                      | 特定渠道發(fā)起交易時需要的額外參數(shù)耸携,以及部分渠道支付成功返回的額外參數(shù),詳細參考 [支付渠道 extra 參數(shù)說明](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 時間戳表示。時間范圍在訂單創(chuàng)建后的 1 分鐘到 15 天喜命,默認為 1 天沟沙,創(chuàng)建時間以 Ping++ 服務器時間為準。 微信對該參數(shù)的有效值限制為 2 小時內(nèi)壁榕;銀聯(lián)對該參數(shù)的有效值限制為 1 小時內(nèi)矛紫。 |
| metadata*optional*                   | 參考 [元數(shù)據(jù)](https://www.pingxx.com/api#%E5%85%83%E6%95%B0%E6%8D%AE) 。 |
| description*optional*                | 訂單附加說明牌里,最多 255 個 Unicode 字符颊咬。              |

**返回**

返回一個支付憑據(jù) `charge` 對象。鑒于支付渠道對 `order_no` 的合法性要求牡辽,為了保證支付請求的正確處理喳篇,請務必保證對于同一支付渠道下陪每,不同支付產(chǎn)品間 `order_no` 的唯一性臭挽。例如:已在微信公眾號下使用的 `order_no` 則無法在微信支付以及微信公眾號掃碼下重復使用,該規(guī)則同樣適用于其他同類渠道翼雀。如果發(fā)生錯誤奏黑,則會返回錯誤碼和錯誤詳情炊邦,詳見 [錯誤](https://www.pingxx.com/api#%E9%94%99%E8%AF%AF)。

根據(jù) Postman 執(zhí)行這個測試的情況攀涵。選擇以下的數(shù)據(jù):

- headers
- data:params

把上述的兩個數(shù)據(jù)铣耘,變成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: 提交的數(shù)據(jù)
           :param json: 提交的 json (可選)
           :param kwargs: 額外的參數(shù)
           :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. 創(chuàng)建 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. 創(chuàng)建 test_case

    import unittest
    from 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": "正規(guī)的水貨 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, "狀態(tài)碼返回不正確!")
            expected_object = "charge"
            actual_object = r.json_dict["object"]
            self.assertEqual(expected_object, actual_object, "對象是否為支付檢查失敯追邸传泊!")
    
 if __name__ == "__main__":
     unittest.main()

 ```

 ?
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鸭巴,隨后出現(xiàn)的幾起案子眷细,更是在濱河造成了極大的恐慌,老刑警劉巖鹃祖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溪椎,死亡現(xiàn)場離奇詭異,居然都是意外死亡恬口,警方通過查閱死者的電腦和手機校读,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祖能,“玉大人歉秫,你說我怎么就攤上這事⊙” “怎么了端考?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長揭厚。 經(jīng)常有香客問我,道長扶供,這世上最難降的妖魔是什么筛圆? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮椿浓,結(jié)果婚禮上太援,老公的妹妹穿的比我還像新娘。我一直安慰自己扳碍,他們只是感情好提岔,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著笋敞,像睡著了一般碱蒙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天赛惩,我揣著相機與錄音哀墓,去河邊找鬼。 笑死喷兼,一個胖子當著我的面吹牛篮绰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播季惯,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吠各,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了勉抓?” 一聲冷哼從身側(cè)響起贾漏,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎琳状,沒想到半個月后磕瓷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡念逞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年困食,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翎承。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡硕盹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出叨咖,到底是詐尸還是另有隱情瘩例,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布甸各,位于F島的核電站垛贤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏趣倾。R本人自食惡果不足惜聘惦,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望儒恋。 院中可真熱鬧善绎,春花似錦、人聲如沸诫尽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牧嫉。三九已至剂跟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浩聋。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工观蜗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衣洁。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓墓捻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親坊夫。 傳聞我的和親對象是個殘疾皇子砖第,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容