直播晚上 8:00 开始

接口自动化测试

霍格沃兹测试开发学社

ceshiren.com

讲师介绍

  • 飞儿
    • 霍格沃兹测试开发学社讲师
  1. 高级测试开发工程师,10 年+从业经验。
  2. 曾就职于知名网约车平台、地图平台等公司。
  3. 为多家企业客户提供测试技术支持。
  4. 《测试开发实战宝典》与《软件测试开发理论与项目实战教程》等书籍作者之一。

目录

  • 学习目标
  • 环境准备
  • 实战练习
  • 总结

学习目标

  • 掌握测试工程师核心技能 - 接口自动化测试
  • 体验 VIP 服务,短时聚焦,提升技能

接口测试的市场需求

成果展示

环境准备

  • Python 安装配置:
    • 推荐 Python 版本:3.8 以上
    • 官方下载地址
    • 操作步骤:
      • 下载系统对应的安装程序。
      • 运行安装包。
      • 检查是否安装成功。
  • PyCharm 安装:
  • Pytest 安装:
    • pip install pytest
  • Requests 安装
    • pip install requests

实战思路

相关知识点

形式 章节
知识点 接口自动化测试框架介绍
知识点 接口请求方法
知识点 接口请求参数
知识点 接口请求头
知识点 接口请求体-json
知识点 接口响应断言
知识点 json 响应体断言

接口自动化测试场景

接口测试工具类型

测试类型 工具 价值
接口抓包 Charles、Postman 接口抓包工具,可以抓取 App 的数据包
接口测试 Postman 接口调试工具,接口手工测试工具,学习成本低,直接安装即可使用
接口自动化测试 Requests、RestAssured 用于接口自动化测试的 Java、Python 第三方库,需要与对应编程语言结合使用
性能测试 JMeter 性能测试工具

为什么推荐 Requests

  • 是由 Python 实现的 API 测试框架。
  • 支持发起 POST, GET, PUT, DELETE 等请求。
  • 可以用来验证和校对响应信息。
  • Requests 优势:
    • 功能全面:HTTP/HTTPS 支持全面。
    • 使用简单:简单易用,不用关心底层细节。
    • 定制性高:结合测试框架完成二次封装,比如 HttpRunner。

官网地址: https://requests.readthedocs.io/en/latest/

演练环境

构造 GET 请求

  • requests.get(url, params=None, **kwargs)
    • url: 接口 url。
    • params:拼接在 url 中的请求参数。
    • **kwargs:更多底层支持的参数。
# 导入依赖
import requests

def test_get():
    # 定义接口的 url 和拼接在 url 中的请求参数
    url = "https://httpbin.ceshiren.com/get"
    # 发出 GET 请求,r 接收接口响应
    r = requests.get(url)
    # 打印接口响应
    logger.info(f"接口响应为 {r}")

构造 POST 请求

  • requests.post(url, data=None, json=None, **kwargs)
    • url: 接口 url。
    • data:表单格式请求体。
    • json:JSON 格式请求体。
    • **kwargs:更多底层支持的参数。
# 导入依赖
import requests

def test_post():
    # 定义接口的 url
    url = "https://httpbin.ceshiren.com/post"
    # 发出 POST 请求,r 接收接口响应
    r = requests.post(url)
    # 打印接口响应
    logger.info(f"接口响应为 {r}")

Requests 中的响应结果对象

属性 含义
r 响应 Response 对象(可以使用任意的变量名)
r.status_code HTTP 响应状态码
r.text 返回响应的内容,是一个字符串。
r.json() 如果响应的内容是 JSON 格式,可以使用该方法将其解析成 Python 对象。
import requests
from requests import Response

# Response就是一个响应对象
r: Response = requests.get('http://www.example.com')

接口断言使用场景

  • 问题:
    1. 如何确保请求可以发送成功。
    2. 如何保证符合业务需求。
  • 解决方案:
    • 通过获取响应信息,验证接口请求是否成功,是否符合业务需求。

响应状态码断言

  • 基础断言:
    • r.status_code
import requests

def test_req():
    r = requests.get("https://httpbin.ceshiren.com/get")
    assert r.status_code == 200

什么是 JSON 响应体

  • JSON 格式的响应体指的是 HTTP 响应中的消息体(message body),它是以 JSON 格式编码的数据。
{
  "name": "John",
  "age": 30,
  "city": "New York"
}

断言 JSON 格式响应体

  • 验证 API 接口的返回结果是否符合预期。
    • 业务场景上是否符合预期。
    • 格式是否符合文档规范。
  • r.json():返回 python 字典。
import requests

def test_res_json():
    r = requests.get("https://httpbin.ceshiren.com/get")
    assert r.status_code == 200
    assert r.json()["url"] == "https://httpbin.ceshiren.com/get"

学习路线

被测产品

  • 披萨外卖系统:
    • 主要提供了订单增删查等操作接口。
    • 结合 Swagger 实现了接口的管理。

编写接口自动化测试脚本思路

编写自动化测试脚本

  • 订单新增、查询单接口自动化测试脚本
import requests


class TestOrder:

    def setup_class(self):
        self.base_url = "http://xx.xx.xx.xx"

    def test_place_order(self):
        '''
        测试创建订单接口
        :return:
        '''
        order_info = {
            "pizza_type": "腊肠",
            "size": "大号",
            "toppings": "奶酪 橄榄",
            "customer_name": "Harry",
            "customer_phone": "1234567890",
            "customer_address": "北京海淀区"
        }
        r = requests.post(self.base_url, json=order_info)
        print(r.text)
        # 验证响应状态码
        assert r.status_code == 200
        # 验证订单是否创建成功
        assert r.json().get("code") == 0
        assert r.json().get("msg") == "add order success"
        # 验证是否返回订单id
        assert r.json().get("data").get("order_id")

    def test_order_query(self):
        '''
        测试查询订单接口
        :return:
        '''
        payload = {
            "id": 1
        }
        r = requests.get(self.base_url, params=payload)
        print(r.text)
        # 验证响应状态码
        assert r.status_code == 200
        # 验证订单是否创建成功
        assert r.json().get("code") == 0
        assert r.json().get("msg") == "get order success"
        # 验证是否返回对应id的订单
        assert r.json().get("data")[0].get("id") == 1

脚本优化 - 添加日志

  • 新建日志配置。
  • 在用例中使用配置好的日志实例。
# 配置日志
import logging
import os

from logging.handlers import RotatingFileHandler

# 绑定绑定句柄到logger对象
logger = logging.getLogger(__name__)
# 获取当前工具文件所在的路径
root_path = os.path.dirname(os.path.abspath(__file__))
# 拼接当前要输出日志的路径
log_dir_path = os.sep.join([root_path, '..', f'/logs'])
if not os.path.isdir(log_dir_path):
    os.mkdir(log_dir_path)
# 创建日志记录器,指明日志保存路径,每个日志的大小,保存日志的上限
file_log_handler = RotatingFileHandler(os.sep.join([log_dir_path, 'log.log']), maxBytes=1024 * 1024, backupCount=10)
# 设置日志的格式
date_string = '%Y-%m-%d %H:%M:%S'
formatter = logging.Formatter(
    '[%(asctime)s] [%(levelname)s] [%(filename)s]/[line: %(lineno)d]/[%(funcName)s] %(message)s ', date_string)
# 日志输出到控制台的句柄
stream_handler = logging.StreamHandler()
# 将日志记录器指定日志的格式
file_log_handler.setFormatter(formatter)
stream_handler.setFormatter(formatter)
# 为全局的日志工具对象添加日志记录器
# 绑定绑定句柄到logger对象
logger.addHandler(stream_handler)
logger.addHandler(file_log_handler)
# 设置日志输出级别
logger.setLevel(level=logging.INFO)

生成测试报告

  1. 安装 Java,需要配置环境变量。
  2. 安装 Allure ,需要配置环境变量。
  3. 安装插件:
    • Python:pip install allure-pytest

生成报告

  • 使用 --alluredir 参数生成测试报告。
# 在测试执行期间收集结果
# —alluredir这个选项 用于指定存储测试结果的路径
pytest [测试用例/模块/包] --alluredir=./results --clean-alluredir

# 生成在线的测试报告
allure serve ./results

# 生成报告,指定输出路径,清理报告。
allure generate --clean results/html results -o results/html

总结

  • Requests 基本使用
  • 编写接口自动化测试脚本
  • 生成测试报告