接口测试 | 接口测试入门

接口测试(十一)接口测试的时间和投资回报 单元测试--接口测试--UI测试- 由此可以看到接口测试的时间是在于单元测试之后,UI测试之前 接口测试可以用比单元测试更少的成本去做测试,且效率上比单元测试更高 对于UI测试,UI测试能发现问题的覆盖度更低些,所以在投资回报率上有 ---------------------------------------------------------- 接口测试回报率>单元测试 接口... 阅读详情

接口测试讲义

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位。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请求结果,会得到数据,数据的格式主要有两种,一种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:https://www.seniverse.com/

    1. 登录 心知天气 (先注册)

    2. 读 接口的 API 文档

      • API的定义: API 的URL的组成 和请求方法
      • API的参数
        • 请求参数
        • 响应参数
    3. 以 获取实时天气作为示例:

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

      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. 打开 https://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项数据。注:中国城市暂不支持云量和露点温度。

请求地址示例

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

参数

  • 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 requests
    from 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. 传递 headers
2. 创建 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 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": "正规的水货 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()

 ```


 

接口测试如何测?最全的接口测试总结,资深测试老鸟整理... 1、接口测试的流程1)找后端拿接口文档2)写测试计划3)分析接口(确认接口之间的业务关系)4)写用例,评审用例5)执行用例去测试(自动化:根据用例编写脚本)6)结果分析7)bug提交8)修复后,回归测试2、一般的接口文档请求参数、返回参数、URL、请求方式3、接口用例包含用例标题,优先级,所属模块,资源路径,请求参数,请求方式,测试数据,预期结果(应该有结果),实际结果4、接口测试的关注、测试点接口测试汇总:参数测试、返回值验证、业务数据、接口之间、DB验证1)参数测试。 阅读详情

相关推荐

【寄存器模型】二、前门访问与后门访问

1.后门访问可以更好的完成前门访问能够完成的事情:后门访问不消耗仿真时间,且消耗的运行时间也远小于前门访问的运行时间。 2.后门访问可以完成前门访问不能完成的事:对于某些特定的场景,如网络通信系统中的一些只读计数器,当要验证计数器进位归零的场景时,前门访问无法完成写寄存器操作,只能通过消耗仿真时间来使计数器到达特定的计数值。而后门访问可以直接对只读寄存器赋一个初值......

carrotbanana的博客 9658

接口测试详解(全)

顾名思义,接口测试是对系统或组件之间的接口进行测试,主要是校验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。其中接口协议分为HTTP,WebService,Dubbo,Thrift,Socket等类型,测试类型又主要分为功能测试,性能测试,稳定性测试,安全性测试等。在分层测试的“金字塔”模型中,接口测试属于第二层服务集成测试范畴。相比UI层(主要是WEB或APP)自动化测试而言,接口自动化测试收益更大,且容易实现,维护成本低,有着更高的投入产出比,是每个公司开展自动化测试的首选。

cs888zsy的博客 3870

拯救者R7000用户实测:用华为电脑管家11.0版搞定MatePad Pro多屏协同(附驱动与显卡避坑指南)

本文详细介绍了如何在非华为笔记本联想拯救者R7000上安装华为电脑管家11.0版,实现与MatePad Pro的多屏协同功能。从驱动优化到显卡配置,提供了全面的避坑指南和实用技巧,帮助用户解决连接失败等常见问题,提升跨设备生产力体验。

weixin_30788619的博客 398

接口测试简介

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。 测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。                                                                                     ——百度百科!         ...

weixin_33800593的博客 1128

YOLOv5+Astra Pro Plus深度相机:手把手教你实现实时目标检测(附ROS配置技巧)

本文详细介绍了如何将YOLOv5目标检测算法与Astra Pro Plus深度相机结合,构建实时目标检测系统。内容涵盖从硬件选型、环境搭建、ROS配置到YOLOv5部署与深度信息融合的完整流程,并分享了性能优化、避障算法等实战技巧,帮助开发者在机器人视觉等场景中快速实现智能感知应用。

weixin_28292761的博客 390

Windows下CMake的下载与安装详解

目录一、CMake介绍二、CMake的下载与安装 一、CMake介绍 CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。它能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。 二、CMake的下载与安装 CMake下载链接:https://cmake.org/download/。 下载最新稳定版即可(Latest Release): 下载完成后,单击“Next”按钮,在下图中勾选“I acce

Wendy的博客 8万+

接口测试怎么测?接口测试的流程和步骤(超详细)

我们要想知道接口测试怎么做,首先要明白接口测试是什么?一般像系统内的组件接口数据交互测试、不同系统与系统之间的接口数据交互测试等,我们都可以称之为接口测试!那么接口测试是怎么来测试接口的呢?接口测试就是通过接口的不同情况下的输入和与之对用的输出之间的关系,看看是否满足接口规范所规定的功能性、安全性以及性能方面的要求.简单的说:“接口测试是就是在没有前端页面或者前端还没完成的情况下,代替前端页面或者第三方使用者,来验证后端的接口实现是否符合接口规范。

cs888zsy的博客 2万+

STM32 W5500 Freemodbus Modbus TCP协议功能实现

STM32F103VCT6 W5500(SPI1),实现Modbus-TCP协议的功能

坚韧与专注 2万+

【测试】——接口测试入门

本文简要介绍了接口测试的基础知识,适合初学者入门。内容涵盖了接口的基本概念、接口文档的组成、接口测试的原理和特点,以及如何使用工具进行接口测试。

HinsCoder的博客 1196

Open3D 合并两个点云【2025最新版】

两个点云中的数据连接,博客长期更新,本文最新更新时间为:2025年4月26日。

点云侠的博客 7435

Windows Docker + RK3588 部署 YOLO26-Pose 人体姿态检测

YOLO26-Pose 在 RK3588 上的部署流程是 Windows Docker 容器内 ONNX 导出 → RKNN 转换(INT8 量化)→ ADB 推送 → 板端 C++ 推理。YOLO26n-Pose 在 640 输入下全链路约 55 FPS,可以覆盖实时姿态检测需求。先在板端用单张图片验证关键点输出正确性,确认 C++ 后处理的解析逻辑无误后,再切换到摄像头实时推理。

m0_64661770的博客 99

接口测试入门-认识接口测试

接口测试是验证系统组件间交互的关键测试方法,主要聚焦业务逻辑层的数据传输和功能验证。文章通过模块接口和Web接口两类示例,详解测试要点:包括请求验证(状态码/数据格式)、异常处理、边界值测试、性能及安全性检查。同时介绍了Postman、JMeter等工具和Python/Java测试代码示例,并强调持续集成实践。内容涵盖从基础概念到自动化框架的应用,为测试人员提供实践性指导。(149字)

jj2772367224的博客 1090

ESP8266-Arduino网络编程实例-异步TCP客户端

本次实例将使用ESPAsyncTCP库实现一个简单的客户端。

视觉与物联智能 1741

接口测试入门教程

顾名思义,接口测试是对系统或组件之间的接口进行测试,主要是校验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。其中接口协议分为HTTP,WebService,Dubbo,Thrift,Socket等类型,测试类型又主要分为功能测试,性能测试,稳定性测试,安全性测试等。在分层测试的“金字塔”模型中,接口测试属于第二层服务集成测试范畴。相比UI层(主要是WEB或APP)自动化测试而言,接口自动化测试收益更大,且容易实现,维护成本低,有着更高的投入产出比,是每个公司开展自动化测试的首选。

m0_68405758的博客 882

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

接口测试入门第2讲——小白都能看懂的接口测试实战

前言 在实际开发中,我们一般都会使用当今主流的两款集成在浏览器中的接口测试工具来进行接口测试。 虽说有以上两款主流的接口测试工具,但在这里笔者使用的只是postman这款接口测试工具,毕竟谷歌浏览器在开发中太经常用到了。说到这里,那么如何在谷歌浏览器中集成这款接口测试工具呢? 安装postman接口测试工具 如果要想在谷歌浏览器中集成postman这款接口测试工具,那么可以参考我的这篇文章——《接口测试入门番外篇——如何在谷歌浏览器中集成postman这款接口测试工具呢?》。 接口测试实战 。。。 ..

李阿昀的博客 1393

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

接口测试入门

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。由于如今的系统复杂度不断上升,传统的测试方法成本急剧增加且测试效率大幅下降,所以就要做接口测试。同时,接口测试相对容易实现自动化持续集成,且相对UI自动化也比较稳定,可以减少人工回归测试人力成本与时间,缩短测试周期,支持后端快速发版需求。接口持续集成是为什么能低成本高收益的根源。

m0_68405758的博客 849

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

接口测试入门知识点及JMeter工具入门级使用

接口测试入门知识点及JMeter工具入门级使用 思维导图 原文可练习我领取

weixin_44232390的博客 140

Postman接口测试入门

Postman官网上这样介绍它:"Manage all of your organization's APIs in Postman, with the industry's most complete API development environment."看的出来Postman是功能强大的API测试的工具。

jj2772367224的博客 894

测试入门——postman接口测试

1.测试申请四要素——2.请求方式——post、get(1)如果请求方式为post,使用Params传参图1.1 请求方式为GET(2)如果请求方式为get,使用Body传参图1.2 请求方式为POST。

weixin_60217050的博客 2134

让新手秒变接口测试达人:一篇文章带你入门

接口测试(API Testing)是指对应用程序编程接口(API)进行的测试。API是软件系统中不同模块之间通信的桥梁,通过接口,客户端可以请求服务器提供的数据或服务,服务器则根据请求返回相应的响应。接口测试的主要目的是验证接口的功能、性能、安全性以及是否符合预期设计。接口测试是软件开发过程中不可或缺的一环,对于保障系统的稳定性、提升用户体验、降低维护成本等方面具有重要意义。通过本文的介绍,相信你已经对接口测试有了初步的了解。接下来,你可以尝试使用上述工具和技巧进行实战练习,不断提升自己的接口测试能力。

2503_90359656的博客 369

Httprunner接口测试框架入门

HttpRunner接口测试

Flora's Zone 1344

接口测试从入门到精通

以上就是我编写的关于为什么要做接口测试以及如何开展接口测试的流程和方法,希望对大家日常工作有所帮助。

hlsxjh的博客 654

JMeter入门①——接口测试

目录   前言 操作: (一)准备:接口文档 (二)添加线程组 (三)添加HTTP请求(接口请求) (四)添加HTTP信息头管理器 (五)察看结果树 (六)保存、运行、察看结果树 (七)添加断言 (八)添加断言结果 (九)【断言失败】的例子   前言 如还未安装Jmeter的话,可以参考另一篇博客《JMeter下载、安装,并设置默认语言及外观》:https://blo...

liangyoufei的专栏 396
上一篇: 3个月月薪上万,我用的是这套学习体系
下一篇: 看完这篇文章,你还不知道了解软件测试,你找我!
TestingGDR
博客等级 码龄8年 496粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值