本篇文章探讨软件测试过程中关于测试数据准备的话题,测试数据的准备是软件测试过程中非常重要的一个环节,无论是手工测试,还是自动化测试,无论是GUI测试,还是API测试,无论是功能测试,还是性能测试,都避不开测试数据准备的工作。
所以,如果你想要成长为一名优秀的测试工程师,那就非常有必要深入理解测试数据准备的方法,以及它们各自的优缺点、适用场景了。
今天,我们就先从测试数据准备的基本方法开始吧。
从创建测试数据的维度来看,测试数据准备方法主要可以分为四类:
基于GUI操作生成测试数据,是最原始的创建测试数据的方法。简单地说,它就是采用E2E的方式来执行业务场景,然后生成数据的方法。
比如,你想要测试用户登录功能,那么首先就要准备一个已经注册的用户,为此你可以直接通过GUI界面来注册一个新用户,然后用这个新创建的用户完成用户登录功能的测试。
这个方法的优点是简单直接,在技术上没有任何复杂性,而且所创建的数据完全来自于真实的业务流程,可以最大程度保证数据的正确性。但是,该方法的缺点也十分明显,主要体现在以下这四个方面:
鉴于以上四方面的原因,在实际的测试过程中,我们很少直接使用基于GUI的操作生成测试数据。只有在万不得已的情况下,比如没有其他更好的方式可以创建正确可靠的测试数据时,我们才会使用这个方法。
而且,这里我需要说明的是,基于GUI操作生成测试数据的方法一般只用于手工测试,因为自动化测试中使用这种数据准备方法,基本相当于要开发一个完整的GUI自动化测试用例,代价太大。
那我为什么还要介绍这个方法呢?其实,这个方法更重要的应用场景是,帮助我们找到创建一个测试数据的过程中,后端调用了哪些API,以及修改了哪些数据库的业务表,是“通过API调用生成测试数据”,以及“通过数据库操作生成测试数据”这两种方法的基础。
通过API调用生成测试数据,是目前主流的测试数据生成方法。其实,当我们通过操作GUI界面生成测试数据时,实际的业务操作往往是由后端的API调用完成的。所以,我们完全可以通过直接调用后端API生成测试数据。
还是以用户登录功能的测试为例,我们通过GUI界面注册新用户时,实际上就是调用了createUser这个API。既然知道了具体要调用哪个API,那么我们就可以跳过在GUI界面的操作,直接调用createUser生成“已经注册的用户”这个测试数据了。
为了规避在创建测试数据时过于在乎实现细节的问题,在实际工程实践中,我们往往会把调用API生成测试数据的过程封装成测试数据准备函数。那问题是,我怎么才能知道前端新用户注册这个操作到底调用了哪些后端API呢?这里,我推荐三种方式:
通过API调用生成测试数据的方法,优点主要体现在以下几个方面:
但是,该方法也不是完美无瑕的,其缺点主要表现在:
因此,业界往往还会通过数据库的CRUD操作生成测试数据。
通过数据库操作生成测试数据,也是目前主流的测试数据生成方法。这个方法的实现原理很简单,就是直接通过数据库操作,将测试数据插入到被测系统的后台数据库中。
常见的做法是,将创建数据需要用到的SQL语句封装成一个个的测试数据准备函数,当我们需要创建数据时,直接调用这些封装好的函数即可。
还是以用户登录功能测试为例,当我们通过GUI界面注册新用户时,实际上是在后端调用了createUser这个API,而这个API的内部实现逻辑是,将用户的详细信息插入到了userTable和userRoleTable这两张业务表中。
那么此时,我们就可以直接在userTable和userRoleTable这两张业务表中插入数据,然后完成这个新用户的注册工作。
这样做的前提是,你需要知道前端用户通过GUI操作注册新用户时,到底修改了哪些数据库的业务表。这里,我也推荐三种方式:
通过数据库操作生成测试数据的方法,主要优点是测试数据的生成效率非常高,可以在较短的时间内创建大批量的测试数据。
当然,这个方法的缺点也非常明显,主要体现在以下几个方面:
目前,在实际的工程实践中,很少使用单一的方法生成测试数据,基本都是采用API和数据库相结合的方式。最典型的应用场景是,先通过API调用生成基础的测试数据,然后使用数据库的CRUD操作生成符合特殊测试需求的数据。所以,你经常会看到很多的数据准备函数中,既有API操作,又有数据库操作。
我以创建用户为例,和你分享一下如何综合运用API和数据库两种方式创建测试数据吧。
假设,我们需要封装一个创建用户的函数,这个函数需要对外暴露“用户国家”和“支付方式”这两个参数。由于实际创建用户是通过后台createUser API完成的,但是这个API并不支持指定“用户国家”和“支付方式”,所以我们就需要自己封装一个创建用户的函数。
自己封装用户创建函数的方法,你可以通过下面这个思路实现:
在这个例子中,createUser API和paymentMethod API只是为了说明如何综合运用API的顺序调用,而其具体参数并不是我要阐述的关键内容,所以我并没有和你详细说明这两个API的参数、实现方式等问题。另外,我在最后一步综合运用了数据库的CRUD操作,完成了创建测试数据的全部工作。这,就是一个封装测试数据准备函数的典型例子了。
本篇文章从测试数据创建的角度,探讨了准备测试数据的四种方法。
其中,基于GUI操作生成测试数据是最原始的方法,但是效率很低,而且会引入不必要的依赖;通过API调用以及数据库操作的方式生成测试数据是目前主流的做法,通过API调用的方式具有数据准确度高但是创建效率较低的特点,而通过数据库的方式具有创建效率高但是维护复杂度也高的特点。
所以,在实际项目中,业界往往会综合采用API和数据库的方式生成测试数据,即通过API调用生成基础数据,然后使用数据库的CRUD操作进一步生成符合特殊测试需求的数据。