今日目标
1.能够提取测试脚本中的测试数据,实现测试数据参数化
2.能够对员工管理接口实现接口对象封装,并编写测试脚本
参数化
参数化的核心:数据驱动(用数据驱动测试用例执行)
数据驱动:针对一个接口,只写一个测试方法。用一份测试数据文件,管理各个测试用例的测试数据。如:登录接口,共 15 条测试用例。但只需要一个 测试方法,对应 有 15 组数据的 json数据文件,进行测试。
练手案例(加法)
加法案例原始
参数化实现
从json文件读取
参数化步骤:
将 测试数据,按 [{},{},{}] 格式 组织到 json文件中。
读取 json文件,将数据转换为 [(),(),()]
在通用测试方法上一行,添加 @pytest.mark.parameterize()
给 parameterize() 传参。参1:字符串类型,内容为 json文件中一组数据的 key。参2:[(),(),()]格式数据。
给 通用测试方法添加形参,与 parameterize() 参1 字符串的内容一致。
修改 通用测试方法 内部实现,使用形参。
接口自动化测试框架
目录结构
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": "抱歉,系统繁忙,请稍后重试!" } ]读取数据文件
在 common/ 下创建 文件 read_json_file.py
在 文件内创建 函数,读取json文件中的数据,转换成 [(),(),()] 格式数据
测试此函数功能通过
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),删除 添加员工接口测试时,使用的手机号。
实现流程:
将 数据库操作 工具类,添加项目代码中,存入 common/ 下
在 测试脚本代码中,添加 setup方法,写入 SQL语句,执行 指定一个手机号删除。
在 测试脚本代码中,添加 teardown 方法,写入 SQL语句,执行 指定同一个手机号删除。
保证,我们测试方法中,使用的 手机号也是 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)