直播晚上 8:00 开始
讲师介绍
- 高级测试开发工程师,10 年+从业经验。
- 曾就职于知名网约车平台、地图平台等公司。
- 为多家企业客户提供测试技术支持。
- 《测试开发实战宝典》与《软件测试开发理论与项目实战教程》等书籍作者之一。
学习目标
- 掌握测试工程师核心技能 - 接口自动化测试
- 体验 VIP 服务,短时聚焦,提升技能
成果展示
环境准备
- Python 安装配置:
- 推荐 Python 版本:3.8 以上
- 官方下载地址
- 操作步骤:
- 下载系统对应的安装程序。
- 运行安装包。
- 检查是否安装成功。
- PyCharm 安装:
- Pytest 安装:
- 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')
接口断言使用场景
- 问题:
- 如何确保请求可以发送成功。
- 如何保证符合业务需求。
- 解决方案:
- 通过获取响应信息,验证接口请求是否成功,是否符合业务需求。
响应状态码断言
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)
生成测试报告
- 安装 Java,需要配置环境变量。
- 安装 Allure ,需要配置环境变量。
- 安装插件:
- Python:
pip install allure-pytest
生成报告
# 在测试执行期间收集结果
# —alluredir这个选项 用于指定存储测试结果的路径
pytest [测试用例/模块/包] --alluredir=./results --clean-alluredir
# 生成在线的测试报告
allure serve ./results
# 生成报告,指定输出路径,清理报告。
allure generate --clean results/html results -o results/html
总结
- Requests 基本使用
- 编写接口自动化测试脚本
- 生成测试报告