接口测试day8之参数化和接口自动化测试框架
2026/7/23 7:40:28 网站建设 项目流程

今日目标

1.能够提取测试脚本中的测试数据,实现测试数据参数化

2.能够对员工管理接口实现接口对象封装,并编写测试脚本

参数化

参数化的核心:数据驱动(用数据驱动测试用例执行)

  • 数据驱动:针对一个接口,只写一个测试方法。用一份测试数据文件,管理各个测试用例的测试数据。如:登录接口,共 15 条测试用例。但只需要一个 测试方法,对应 有 15 组数据的 json数据文件,进行测试。

练手案例(加法)

加法案例原始

参数化实现

从json文件读取

参数化步骤:

  1. 将 测试数据,按 [{},{},{}] 格式 组织到 json文件中。

  2. 读取 json文件,将数据转换为 [(),(),()]

  3. 在通用测试方法上一行,添加 @pytest.mark.parameterize()

  4. 给 parameterize() 传参。参1:字符串类型,内容为 json文件中一组数据的 key。参2:[(),(),()]格式数据。

  5. 给 通用测试方法添加形参,与 parameterize() 参1 字符串的内容一致。

  6. 修改 通用测试方法 内部实现,使用形参。

接口自动化测试框架

目录结构

  • api/:接口对象层(代码:python package)

  • scripts/:测试脚本层(代码:python package)

  • common/:通用工具方法、函数(代码:python package)

  • data/:测试数据文件(文件:dir)

  • report/:测试报告(文件:dir)

  • config.py: 项目中的 配置信息。(全局变量)

  • pytest.ini: pytest 配置

登录接口参数化

组织数据文件

[ { "desc": "登录成功", "req_data": { "mobile": "13800000002", "password": "123456" }, "status_code": 200, "success": true, "code": 10000, "message": "操作成功" }, { "desc": "手机号不存在", "req_data": { "mobile": "13874893701", "password": "123456" }, "status_code": 200, "success": false, "code": 20001, "message": "用户名或密码错误" }, { "desc": "密码错误", "req_data": { "mobile": "13800000002", "password": "123456890" }, "status_code": 200, "success": false, "code": 20001, "message": "用户名或密码错误" }, { "desc": "手机号为空", "req_data": { "mobile": null, "password": "123456" }, "status_code": 200, "success": false, "code": 20001, "message": "用户名或密码错误" }, { "desc": "多参", "req_data": { "mobile": "13800000002", "password": "123456", "abc": "123" }, "status_code": 200, "success": true, "code": 10000, "message": "操作成功" }, { "desc": "少参", "req_data": { "mobile": "13800000002" }, "status_code": 200, "success": false, "code": 20001, "message": "用户名或密码错误" }, { "desc": "无参", "req_data": null, "status_code": 200, "success": false, "code": 99999, "message": "抱歉,系统繁忙,请稍后重试!" } ]

读取数据文件

  1. 在 common/ 下创建 文件 read_json_file.py

  2. 在 文件内创建 函数,读取json文件中的数据,转换成 [(),(),()] 格式数据

  3. 测试此函数功能通过

4.建议读取 json文件时,使用 绝对路径法传入文件名

1)在 config.py 中,添加 全局变量,获取 项目目录BASE_DIR = os.path.dirname(__file__)

2)拼接 json文件的绝对路径filename = BASE_DIR+"/data/login_data.json"

3)使用 绝对路径,传入 json文件读取函数。read_json_data(filename)

parameterize参数化

员工管理接口

普通方法实现

接口对象层

接口测试用例层

解决反复修改手机号

解决思路:

  • 在 测试 添加员工接口前(setup),保证 数据库中,无此手机号!执行 delete SQL语句,将欲使用的手机号删除。

  • 使用 这个手机号,展开 添加员工接口的 测试。

  • 在 测试 添加员工接口结束后(teardown),删除 添加员工接口测试时,使用的手机号。

实现流程:

  1. 将 数据库操作 工具类,添加项目代码中,存入 common/ 下

  2. 在 测试脚本代码中,添加 setup方法,写入 SQL语句,执行 指定一个手机号删除。

  3. 在 测试脚本代码中,添加 teardown 方法,写入 SQL语句,执行 指定同一个手机号删除。

  4. 保证,我们测试方法中,使用的 手机号也是 1350001111

完成后的代码

from common.assert_tools import common_assert from api.ihrm_emp_api import IhrmEmpApi from common.db_tools import DBTools from config import TEL # 定义测试类 class TestAddEmp(object): def setup(self): del_sql = "delete from bs_user where mobile='13500001111';" DBTools.db_uid(del_sql) def teardown(self): del_sql = "delete from bs_user where mobile='13500001111';" DBTools.db_uid(del_sql) # 定义测试方法 - 添加成功 def test01_add_ok(self): # 调用自己封装的 api,发送 添加员工请求 req_header = {"Authorization": "58ad27cc-cb05-48f4-9812-becaa72308e5"} req_data = { "username": "user87655430", "mobile": "13500001111", "workNumber": "9527890aa" } resp = IhrmEmpApi.add_emp(req_header, req_data) print("必选-添加成功:", resp.json()) # 断言 common_assert(resp, 200, True, 10000, "操作成功") def test02_add_ok_all(self): # 调用自己封装的 api,发送 添加员工请求 req_header = {"Authorization": "58ad27cc-cb05-48f4-9812-becaa72308e5"} req_data = { "username": "齐天小圣朱小姐001", "mobile": "13500001111", "timeOfEntry": "2022-02-01", "formOfEmployment": 1, "workNumber": "9009", "departmentName": "研发部", "departmentId": "1480198742740082688", "correctionTime": "2022-02-27T16:00:00.000Z" } resp = IhrmEmpApi.add_emp(req_header, req_data) print("全部-添加成功:", resp.json()) # 断言 common_assert(resp, 200, True, 10000, "操作成功") def test03_username_None(self): # 调用自己封装的 api,发送 添加员工请求 req_header = {"Authorization": "58ad27cc-cb05-48f4-9812-becaa72308e5"} req_data = { "username": None, "mobile": "13500001111", "timeOfEntry": "2022-02-01", "formOfEmployment": 1, "workNumber": "9009", "departmentName": "研发部", "departmentId": "1480198742740082688", "correctionTime": "2022-02-27T16:00:00.000Z" } resp = IhrmEmpApi.add_emp(req_header, req_data) print("用户名为空:", resp.json()) # 断言 common_assert(resp, 200, False, 20002, "新增员工失败")

拓展

1.在 config.py 中,定义一个 全局变量 统一管理 测试使用的 手机号。

# config.py 文件中 # 定义全局变量,测试用的手机号 TEL = "13500001111"

2.在 测试脚本中使用手机号的位置,使用 TEL 代替。

def setup(self): del_sql = f"delete from bs_user where mobile='{TEL}';" DBTools.db_uid(del_sql) def teardown(self): del_sql = f"delete from bs_user where mobile='{TEL}';" DBTools.db_uid(del_sql)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询