相信做过接口自动化测试的同学都有遇到过这样的问题,就是测试的接口依赖于某些数据的存在才能正常运行。而这些前置数据的维护是非常麻烦的,我想到的大概有三种处理方式:
这三种方式各有各的好,也有不好:
方法 1:
优点:
1. 简单,测试用例只关注测试用例本身,不用管前置数据的问题;
缺点:
1. 数据维护是个问题,比较难维护。数据的增删改都有可能造成用例不通过。
2. 用例维护问题,因为用例依赖的数据是固定现成的,在数据变化后用例代码都需要变方法 2:
优点: 数据真实,业务完整
缺点: 场景复杂时前置用例可能非常多,一个场景出问题可能导致后续用例都失败(比如登录失败了,那几乎全部都会失败)方法 3:
优点:简单,直接,要什么就插什么
缺点:业务复杂时可能一个业务场景要在 N 张表中插入数据,得一个个处理。工作量大。比如:插入一个用户数据,一般用户数据会包括用户账号表,用户角色表、用户属性表...
还是基于在数据库中直接生成数据的这种方式,好在是可以通过配置文件来描述数据库表之间的关联关系;支持批量插入多条有业务关联的数据;用户只需要在配置文件中描述表字段的生成规则以及表之间的关联关系即可。
配置文件模板可通过内置工具一键生成,生成后只需要完善字段生成规则;
配置文件示例如下:
package:
- datetime # 导入额外的包,在jinja2模板中使用(下面有用到datetime包,所以要先导入)
env:
id:
engine: faker.uuid
rule: null
time_format:
engine: faker.eq
rule:
value: "%Y-%m-%d %H:%M:%S"
tables:
- columns:
- column: id
comment: 数据主键id
engine: faker.eq
rule:
value: '{{ env.id }}' # 通过引用环境变量中的值
- column: name
comment: 姓名
engine: faker.name
rule: null
- column: idcard
comment: 身份证号
engine: faker.ssn
rule: null
- column: age
comment: 年龄
engine: faker.eq
rule:
value: '{{ datetime.datetime.now().year - int(stu.idcard[6:10]) }}' # 通过jinja2模板直接计算
- column: sex
comment: 性别
engine: faker.eq
rule:
value: '{{ "man" if int(stu.idcard[-2]) % 2==1 else "female" }}' # 通过jinja2模板直接计算
comment: ''
table: stu
- columns:
- column: id
comment: 数据主键id
engine: faker.uuid
rule: null
- column: stu_id
comment: 数据主键id
engine: faker.eq
rule:
value: '{{ stu.id }}' # 通过其他表中的值
- column: course_name
comment: 课程名称
engine: faker.choice # 通过内置方法从列表中随机取一个值
rule:
value: [数学,语文,英语,化学,地理]
- column: course_time
comment: 上课时间
engine: faker.now # 通过内置方法获取当前时间,并按照指定格式返回
rule:
format: "{{ env.time_format }}"
comment: '课程信息 '
table: course
具体安装使用方法参考:dbfaker