数据驱动自动化框架
将测试数据与测试脚本分离,基于模块化的测试库,一个驱动脚本可以执行多个相似测试。
数据驱动测试框架使用外部数据(例如excel、xml、yaml、数据库等)作为输入来控制和验证自动化测试的操作
在一个自动化工程中,可能包含哪些东西。
与项目无关的操作(CAW Common Action Word util):读写文件的操作(读取环境数据、读取用例数据);数据库操作(预置数据、检查结果)、日志打印
与项目有关的操作(BAW Business Action Word):
金融项目:用户模块、项目模块(按模块组织,每个模块的接口放到一个文件中。)
租车系统:客户管理、车辆管理、租车单管理……
可扩展性
可维护性高
易用性好
实现过程
创建目录结构
将环境信息写到文件中,env.ini ,封装一个方法读环境信息
url
数据库 ip、端口号、数据库名字、用户名、密码
将用例的数据写到文件中,读取用例数据,yaml来描述
注册的用例共有几个测试逻辑(测试步骤)?
原则
初始化环境:该用例需要的环境,在脚本中构造对应的环境
清理环境:脚本执行前是什么样子,脚本执行后仍恢复成什么样子。
这个脚本下次还能执行
这个脚本执行完不能影响下个脚本执行
脚本之间不能有依赖。A脚本注册,B脚本登录,不允许
注册成功
下发请求
检查响应的结果
检查系统中是否有这个用户
删除注册用户
注册失败
下发请求
检查响应的结果
重复注册
下发请求
下发请求
检查响应的结果
import pytest
from day02.zonghe.baw import Member
from day02.zonghe.caw import FileRead, Db
# 注册失败的数据
@pytest.fixture(params = FileRead.read_yaml(r"datacase\register_fail.yaml")) # yaml文件读取过来的
def fail_data(request):
return request.param
# 注册失败的测试逻辑/测试步骤
def test_register_fail(fail_data,baserequests,url):
# 准备测试数据
print("测试数据为:" ,fail_data['data'])
print("预期结果为:" , fail_data['expect'])
# 下发请求
r = Member.register(baserequests,url,fail_data['data'])
# 检查结果
assert r.json()['msg'] == fail_data['expect']['msg']
assert r.json()['code'] == fail_data['expect']['code']
assert r.json()['status'] == fail_data['expect']['status']
# 注册成功的数据
@pytest.fixture(params = FileRead.read_yaml(r"datacase\register_pass.yaml")) # yaml文件读取过来的
def pass_data(request):
return request.param
# 注册成功
def test_register_pass(pass_data,baserequests,url,db):
# 初始化环境(可能环境中有上次遗留的数据,或者其他人添加的数据,与本次执行的数据冲突了)
Db.delete_user(db, pass_data['data']['mobilephone'])
# 准备测试数据
print("测试数据为:", pass_data['data'])
print("预期结果为:", pass_data['expect'])
# 下发请求
r = Member.register(baserequests, url, pass_data['data'])
# 检查响应结果
assert r.json()['msg'] == pass_data['expect']['msg']
assert r.json()['code'] == pass_data['expect']['code']
assert r.json()['status'] == pass_data['expect']['status']
###################################################
# 检查注册的用户在系统中存在
# 方法1.使用注册的用户登录 方法2.检查数据库 方法3.查询所有用户,结果在包含已注册用户
r = Member.list(baserequests,url) # 使用的是方法三
assert pass_data['data']['mobilephone'] in r.text
# 清理环境 :删除用户(这个脚本执行完,不影响其他脚本执行,不影响这个脚本第二次执行)
# 方法1.调用删除用户的接口删除 方法2.数据库中删除
Db.delete_user(db,pass_data['data']['mobilephone'])
# 重复注册的数据
@pytest.fixture(params = FileRead.read_yaml(r"datacase\register_repeat.yaml")) # yaml文件读取过来的
def repeat_data(request):
return request.param
# 重复注册
def test_register_repeat(repeat_data,baserequests,url,db):
Db.delete_user(db, repeat_data['data']['mobilephone'])
# 准备测试数据
print("测试数据为:", repeat_data['data'])
print("预期结果为:", repeat_data['expect'])
# 下发请求
r = Member.register(baserequests, url, repeat_data['data'])
assert r.json()['msg'] == repeat_data['expect0']['msg']
assert r.json()['code'] == repeat_data['expect0']['code']
assert r.json()['status'] == repeat_data['expect0']['status']
r = Member.register(baserequests, url, repeat_data['data'])
print(r.text)
# 检查结果
assert r.json()['msg'] == repeat_data['expect']['msg']
assert r.json()['code'] == repeat_data['expect']['code']
assert r.json()['status'] == repeat_data['expect']['status']
Db.delete_user(db,repeat_data['data']['mobilephone'])
|