文章目录
废话
和几个朋友聊天然后出来的产物希望能帮到大家学习接口自动化测试,欢迎大家交流指出不合适的地方,源码在文末
功能
- 实现:get/post请求(上传文件)::理论上其他delete/put等请求也实现了,支持restful接口规范
- 发送邮件
- 生成allure测试报告
- 压缩测试报告文件
- 数据依赖
运行机制
- 通过读取配置文件,获取到host地址、提取token的jsonpath表达式,提取实际响应结果用来与预期结果比对的jsonpath表达式。
- 读取excel用例文件数据,组成一个符合pytest参数化的用例数据,根据每列进行数据处理(token操作、数据依赖)
- token,写,需要使用一个正常登录的接口,并且接口中要返回token数据,才可以提取,token,读为该请求将携带有token的header,token 无数据的将不携带token
- 数据依赖处理,从excel中读取出来的格式{“用例编号”:[“jsonpath表达式1”, “jsonpath表达式2”]},通过用例编号来获取对应case的实际响应结果(实际响应结果在发送请求后,回写到excel中),通过jsonpath表达式提取对应的依赖参数字段,以及对应的值,最终会返回一个存储该接口需要依赖数据的字典如{“userid”:500, “username”: “zy7y”},在发送请求时与请求数据进行合并,组成一个新的data放到请求中
- 每次请求完成之后将回写实际的响应结果到excel中
- 根据配置文件中配置的jsonpath表达式提取实际响应内容与excel中预期结果的数据对比
- 生成测试报告
- 压缩测试报告文件夹
- 发送邮件
已知问题
执行接口消耗时间变长,代码乱(语言学的不扎实),频繁读写excel(可考虑用字典存每个接口的实际响应,取值直接从响应字典中取出)
整体代码结构优化未实现,导致最终测试时间变长,其他工具单接口测试只需要39ms,该框架中使用了101ms,考虑和频繁读写用例数据导致
环境与依赖
名称 | 版本 | 作用 |
---|---|---|
python | 3.7.8 | |
pytest | 6.0.1 | 底层单元测试框架,用来实现参数化,自动执行用例 |
allure-pytest | 2.8.17 | allure与pytest的插件可以生成allure的测试报告 |
jsonpath | 0.82 | 用来进行响应断言操作 |
loguru | 0.54 | 记录日志 |
PyYAML | 5.3.1 | 读取yml/yaml格式的配置文件 |
Allure | 2.13.5 | 要生成allure测试报告必须要在本机安装allure并配置环境变量 |
xlrd | 1.2.0 | 用来读取excel中用例数据 |
yagmail | 0.11.224 | 测试完成后发送邮件 |
requests | 2.24.0 | 发送请求 |
目录结构
执行顺序
运行test_api.py -> 读取config.yaml(tools.read_config.py) -> 读取excel用例文件(tools.read_data.py) -> test_api.py实现参数化 -> 处理是否依赖数据 ->base_requests.py发送请求 -> test_api.py断言 -> read_data.py回写实际响应到用例文件中(方便根据依赖提取对应的数据)
config.ymal展示
server:
test: http://127.0.0.1:8888/api/private/v1/
# 实例代码使用的接口服务,已改为作者是自己的云服务器部署。(后端源码来自b站:https://www.bilibili.com/video/BV1EE411B7SU?p=10)
dev: http://49.232.203.244:8888/api/private/v1/
# 实际响应jsonpath提取规则设置
response_reg:
# 提取token的jsonpath表达式
token: $.data.token
# 提取实际响应的断言数据jsonpath表达式,与excel中预期结果的数据进行比对用
response: $.meta
file_path:
case_data: ../data/case_data.xlsx
report_data: ../report/data/
report_generate: ../report/html/
report_zip: ../report/html/apiAutoTestReport.zip
log_path: ../log/运行日志{
time}.log
email:
# 发件人邮箱
user: 123456.com
# 发件人邮箱授权码
password: ASGCSFSGS
# 邮箱host
host: smtp.163.com
contents: 解压apiAutoReport.zip(接口测试报告)后,请使用已安装Live Server 插件的VsCode,打开解压目录下的index.html查看报告
# 收件人邮箱
addressees: ["收件人邮箱1","收件人邮箱2","收件人邮箱3"]
title: 接口自动化测试报告(见附件)
# 附件地址
enclosures: ["../report/html/apiAutoTestReport.zip",]
EXcel用例展示
脚本一览
请求方法封装
#!/usr/bin/env/python3
# -*- coding:utf-8 -*-
"""
@project: apiAutoTest
@author: zy7y
@file: base_requests.py
@ide: PyCharm
@time: 2020/7/31
"""
from test import logger
import requests
class BaseRequest(object):
def __init__(self):
pass
# 请求
def base_requests(self, method, url, parametric_key=None, data=None, file_var=None, file_path=None, header=None):
"""
:param method: 请求方法
:param url: 请求url
:param parametric_key: 入参关键字, get/delete/head/options/请求使用params,
post/put/patch请求可使用json(application/json)/data
:param data: 参数数据,默认等于None
:param file_var: 接口中接受文件的参数关键字
:param file_path: 文件对象的地址, 单个文件直接放地址:/Users/zy7y/Desktop/vue.js
多个文件格式:["/Users/zy7y/Desktop/vue.js","/Users/zy7y/Desktop/jenkins.war"]
:param header: 请求头
:return: 返回json格式的响应
"""
session = requests.Session()
if (file_var in [None, '']) and (file_path in [None, '']):
files = None
else:
# 文件不为空的操作
if file_path.startswith('[') and file_path.endswith(']'):
file_path_list = eval(file_path)
files = []