接口测试常见的测试数据准备方法

Posted sysu_lluozh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接口测试常见的测试数据准备方法相关的知识,希望对你有一定的参考价值。

生成测试数据的方法主要有以下几类:

  • 基于GUI操作生成测试数据
  • 基于API调用生成测试数据
  • 基于数据库操作生成数据
  • 基于第三方库自建数据
  • 结合多种方式生成数据

接下来详细分析一下各种方法的特点以及适用场景

一、GUI操作生成数据

基于 GUI 操作生成数据,是指使用自动化脚本或者人工执行业务流程生成数据

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

  • 创建的效率低
    每次的GUI操作只生成一条数据,并且操作非常耗时

  • 工作量大
    通过GUI操作生成数据的过程,其实就是在开发自动化case的过程,加大了工作量

  • 成功率不高
    GUI的变化直接会导致数据生成失败

  • 引入其他依赖
    数据生成成功的前提,依赖于业务流程的正确性

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

二、API调用生成数据

通过调用API生成测试数据,是目前测试数据生成的主要方法

那么,如何获取到这些API呢?通常推荐按照下面的顺序,来查找API相关的信息

  1. API接口文档
    通常成熟的开发团队,都会编写API的接口文档,接口文档中会详细描述接口的URI和调用参数,这是最直接有效的办法

  2. 通过抓包
    抓包在测试中是非常常用的辅助手段,可以在操作APP或者WEB页面时,对操作进行抓包,通过对抓取到的请求包,分析接口的各种参数。这也是相对高效的办法

  3. 查看日志文件
    对于已经上线的接口,可以通过服务的日志,来查看接口调用过程中的URI和参数等内容

  4. 阅读源码
    如果前面三种方法都不能用,那么可以在Gitlab上查看开发人员的项目代码,通过阅读代码的方法,找到接口请求的各种参数

由于后台接口一般比较稳定,大大提高了测试数据构造的准确性和成功率。另外,由于直接给API传递参数,通过参数的组合可以构造成某些GUI方法不能构造出来的测试数据

实际上使用 GUI 操作生成数据,本质上也是在调用 API,所以一般情况下,通常都把调用 API 生成数据的过程封装成数据准备函数。这种方式优势在于:

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

通过 API 构造测试数据的方法也不是完美的,主要有几个方面:

  1. 并不是所有数据创建都有对应的API
  2. 业务很复杂的情况下,需要调用多个API

有时候测试数据之间是有关联关系的,为了保证测试数据的完整性和一致性,需要依次调用多个API,无形中增加了测试数据准备的复杂性

  1. 需要海量数据时,即使使用了并发,效率也尽如人意

调用API创建测试数据适合与自动化测试相结合,在实际的测试实践中,往往把API封装成测试数据准备函数供自动化测试用例使用。当API内部逻辑有修改时,依旧可以通过封装函数来准备测试数据,对测试用例来说是完全透明的

三、数据库操作生成数据

通过往数据库中直接插入数据,是非常常用的构造测试数据的方法

具体做法是,将创建测试数据的SQL语句封装成一个个测试数据生成函数,当创建数据时,直接调用这些封装好的函数即可。这种方法有一个非常大的优点是生成测试数据的效率非常高,可以短时间内往数据库中插入大量的测试数据

这种方式的优势在于:

  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生成最基础的测试数据,比如车辆的vid,然后使用数据库和MQ的方法是生成符合测试需要的车辆状态数据

以上报车辆状态数据的测试为例子,分享一下具体的如何将API调用和MQTT协议的方法结合起来构造测试数据

比如要测试云端对车辆上报的报警数据的处理是否符合要求:

  1. 需要通过调用注册 Vechile ID 的接口来注册一台车并且获得车辆证书,通过调用这个接口我们可以得到一个车辆的 ID 以及证书数据
  2. 结合MQTT协议产生车辆的报警数据

为了构造测试数据的更加便捷,往往是对上面的操作进行封装,用封装后的方法产生测试数据

以上是关于接口测试常见的测试数据准备方法的主要内容,如果未能解决你的问题,请参考以下文章

BI之报表测试总结

三种常见类型的接口测试工具架构对比

java测试JunitMock+代码覆盖率

Java单元测试(Junit+Mock+代码覆盖率)

常见的接口测试工具都有哪些?

常见的接口测试工具都有哪些