数据准备一直是软件测试过程中必须面临的环节。对于自动化测试来说尤其如此,无论是 GUI 自动化测试还是接口自动化测试,数据准备都是开展工作的前提。在这里,用几篇帖子分享下做自动化测试的数据准备方法,也希望大佬提供更好的思路和建议。
从数据创建的角度来说,数据创建的方法大致有这几种来源:
- 1.基于GUI操作生成测试数据
- 2.基于API调用生成测试数据
- 3.基于数据库操作生成数据
- 4.基于第三方库自建数据
- 5.结合多种方式生成数据
基于 GUI 操作生成数据,是指使用自动化脚本或者人工执行业务流程生成数据。例如,现在需要测试登录功能,这就需要准备一个已经注册的用户,此时,可以通过 GUI 操作来创建一个用户 (无论是手工还是自动化脚本),然后再用新建的用户测试登录。这种方式简单直接,并且数据来源于真实的业务流程,一定程度保证了数据的准确性。然而,缺点也很明显:
- 1.创建的效率低;每次的GUI操作只生成一条数据,并且操作非常耗时。
- 2.易封装;通过GUI操作生成数据的过程,其实就是在开发自动化case的过程,加大了工作量。
- 3.成功率不高;GUI的变化直接会导致数据生成失败。
- 4.引入了其他依赖;数据生成成功的前提,依赖于业务流程的正确性。
一般情况下,基本不会使用这种方式生成数据,除非没有其他更好的方式来创建可靠的数据。不过,“操作 GUI 生成数据” 确是其他两种方式 “API 调用” 和 “操作数据库” 的基础。
实际上使用 GUI 操作生成数据,本质上也是在调用 API。例如,使用 GUI 界面注册用户时,实际上调用了createUser
的 API。要注意的是,一次 GUI 操作可能调用了多个 API,所以一般情况下,通常都把调用 API 生成数据的过程封装成数据准备函数。这种方式优势在于:
- 1.保证数据准确性;
- 2.执行效率高;
- 3.封装成函数更灵活可控
这种方式也不是十全十美,缺点在于:
- 1.并不是所有数据创建都有对应的API;
- 2.业务很复杂的情况下,需要调用多个API;
- 3.需要海量数据时,即使使用了并发,效率也尽如人意;
和调用 API 生成数据类似,数据库生成数据一般做法是,将创建数据需要的 SQL 封装成函数,然后再进行调用。这样就能直接通过数据库操作,将测试数据插入系统数据库。例如,还是用户登录,直接往userTable
和userRoleTable
两张表插入数据,即可完成注册。
这种方式的优势在于:
- 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. 如有需要,通过数据库操作更新其他信息。
以上就是一个常用的创建测试数据的过程。