自动化工具 自动化测试之数据准备

sheepwood · 2018年11月30日 · 最后由 sheepwood 回复于 2018年12月24日 · 2959 次阅读

概述

​ 数据准备一直是软件测试过程中必须面临的环节。对于自动化测试来说尤其如此,无论是 GUI 自动化测试还是接口自动化测试,数据准备都是开展工作的前提。在这里,用几篇帖子分享下做自动化测试的数据准备方法,也希望大佬提供更好的思路和建议。

分类

从数据创建的角度来说,数据创建的方法大致有这几种来源:

- 1.基于GUI操作生成测试数据
- 2.基于API调用生成测试数据
- 3.基于数据库操作生成数据
- 4.基于第三方库自建数据
- 5.结合多种方式生成数据

GUI 操作生成数据

基于 GUI 操作生成数据,是指使用自动化脚本或者人工执行业务流程生成数据。例如,现在需要测试登录功能,这就需要准备一个已经注册的用户,此时,可以通过 GUI 操作来创建一个用户 (无论是手工还是自动化脚本),然后再用新建的用户测试登录。这种方式简单直接,并且数据来源于真实的业务流程,一定程度保证了数据的准确性。然而,缺点也很明显:

- 1.创建的效率低每次的GUI操作只生成一条数据并且操作非常耗时
- 2.易封装通过GUI操作生成数据的过程其实就是在开发自动化case的过程加大了工作量
- 3.成功率不高GUI的变化直接会导致数据生成失败
- 4.引入了其他依赖数据生成成功的前提依赖于业务流程的正确性

一般情况下,基本不会使用这种方式生成数据,除非没有其他更好的方式来创建可靠的数据。不过,“操作 GUI 生成数据” 确是其他两种方式 “API 调用” 和 “操作数据库” 的基础。

API 调用生成数据

实际上使用 GUI 操作生成数据,本质上也是在调用 API。例如,使用 GUI 界面注册用户时,实际上调用了createUser的 API。要注意的是,一次 GUI 操作可能调用了多个 API,所以一般情况下,通常都把调用 API 生成数据的过程封装成数据准备函数。这种方式优势在于:

- 1.保证数据准确性;
- 2.执行效率高;
- 3.封装成函数更灵活可控

这种方式也不是十全十美,缺点在于:

- 1.并不是所有数据创建都有对应的API
- 2.业务很复杂的情况下需要调用多个API
- 3.需要海量数据时即使使用了并发效率也尽如人意

数据库操作生成数据

和调用 API 生成数据类似,数据库生成数据一般做法是,将创建数据需要的 SQL 封装成函数,然后再进行调用。这样就能直接通过数据库操作,将测试数据插入系统数据库。例如,还是用户登录,直接往userTableuserRoleTable两张表插入数据,即可完成注册。

这种方式的优势在于:

- 1. 效率高能在短时间内生成批量数据

缺陷也很明显:

- 1. 数据容易缺失一个业务操作设计到的表往往不止一张容易遗漏
- 2. 健壮性差SQL语句变化时封装的函数必须实时同步更新维护成本很高

第三方库生成数据

这种方式就比较直接,直接使用代码封装成函数生成数据。拿python为例,可以自己结合random()之类的函数随机生成数据,还可以使用faker项目地址)这样的第三方库:

from faker import Factory

fake = Factory().create('zh_CN')

def random_phone_number():
    '''随机手机号'''
    return fake.phone_number()

def random_name():
    """随机姓名"""
    return fake.name()

def random_address():
    """随机地址"""
    return fake.address()

def random_email():
    """随机email"""
    return fake.email()

结合多种方式生成数据

​ 实际上,实际应用中都采用多种方式相结合的方式生成测试数据。最典型的应用场景是,先通过 API 调用或者第三方库生成基础的测试数据,然后使用数据库的 CRUD 操作生成符合特殊需求的数据。比如:

# 注册新用户并进行绑卡
1. 使用封装的faker库随机生成姓名,手机号,邮箱等信息,并调用createUser API进行注册;
2. 查询userTableb表获得用户名,然后调用bindCard API实现绑卡。其中,bindCard API中使用的userID即为上一步createUser API中产生的用户ID;
3. 如有需要,通过数据库操作更新其他信息。

以上就是一个常用的创建测试数据的过程。

共收到 5 条回复 时间 点赞
sheepwood 自动化测试之数据准备 中提及了此贴 11月30日 15:50
sheepwood 自动化测试之数据准备 中提及了此贴 11月30日 15:50

如果是环境固定,就用可以用固定数据吧,或者 sql 导入的方式,太复杂的话,就只能通过接口去构造了,这个成本相对还好,一般来说一个项目,接口用到的参数很多都是可以复用的

有些相互依赖的数据用接口构造还是觉得很麻烦,最终感觉还是需要一个统一的测试数据平台。

不知道是不是我错觉,感觉和极客时间测试 52 讲课程里的一些思路很相似。

sheepwood 回复

造数据真的很麻烦,个人观点是直接造环境,但是设备成本会高很多。

陈恒捷 回复

嗯对,最初时只是封装函数和接口调用,后来使用的测试数据平台的思路就是根据茹炳晟老师的那个课程来的。

sheepwood 关闭了讨论 01月09日 11:27
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册