自动化工具 接口测试时依赖前置数据的问题解决了...

guolong123 · 2020年09月22日 · 最后由 guolong123 回复于 2024年04月11日 · 2002 次阅读

相信做过接口自动化测试的同学都有遇到过这样的问题,就是测试的接口依赖于某些数据的存在才能正常运行。而这些前置数据的维护是非常麻烦的,我想到的大概有三种处理方式:

  1. 维护好测试环境中的数据,在执行测试前,保证接口依赖的数据在数据库中都存在即可。
  2. 调用前置用例(方法)来实时造数据,比如登录时,先调用注册接口来生成一个账号。
  3. 直接往数据库里面插,登录时往用户表插一条数据就好了。

这三种方式各有各的好,也有不好:

方法 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

共收到 2 条回复 时间 点赞

表之间的关联关系的数据不好造吧?

树叶 回复

好造的,在最上面 env 中定义某个关联字段的值,多个表之间的关联可以引用同一个变量就好了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册