再谈测试数据
测试数据是测试用例执行的前提条件之一,也是测试分析与设计的基础之一,比如等价类,边界值都是靠不同的测试数据来体现不同的测试用例和测试场景。如果把测试步骤比喻成测试用例的骨架,那么测试数据就是测试用例的血液,只有当测试用例和测试数据一起才能形成一个好的测试用例。
测试数据的现状
测试数据是一个经常被测试人员忽视的地方,绝大部分商用软件系统的功能测试中的测试数据都是靠测试人员通过分析和设计,手动生成的测试数据。但是有些特殊的软件系统,比如一些复杂的网络系统,一些复杂操作系统,一些复杂的硬件系统等,由于测试数据的数量巨大,并且类型众多,所以一般需要靠特定的数据系统来自动生成测试数据。并且对于一些特定的测试类型,比如模糊测试,Monkey测试,错误注入测试(FIT)等也是需要通过自动生成测试数据。
测试数据的分类
测试数据的类型是非常多的,根据不同的维度,可以分为不同类型的测试数据,比如通过存储和获取的地方不同分为以下几种类型:
数据在测试用例文件中
这个是最为常见的一种存储测试数据的方式,在传统的测试中,会直接讲测试数据写入测试步骤的语句中,比如:
用例1: 申请一个新账号成功
<理查德>准备申请一个新的账号
打开“注册”页面并点击“下一步”
“用户信息”页面成功打开
完成填写“用户信息”页面并点击“下一步”
“审核”页面成功打开
用户信息审核完成并点击“下一步”
“申请<成功>”页面成功打开
但是随着现代大型商用软件系统的业务系统业务越来越复杂,在测试步骤中嵌入测试数据的方法会导致后期巨大的维护成本。所以为了改善巨大维护成本的问题,则需要靠业务行为(Behavior)和需求实例化(SBE)的方式来编写测试用例和管理测试数据,比如:
用例集1: 申请一个新账号
Given <用户> 准备申请一个新的账号
When 完成新账号申请流程
Then 新账号创建<结果>
数据集:
| 用户 | 结果 | 描述 |
| 理查德 | 成功 | 他是一名管理员 |
| 尼奥 | 失败 | 他是一名黑客 |
在测试用例中,这是最为常用的两种测试数据管理方式。它们最大的区别就是维护成本多少,以及编程模块化思维的复用性所减少的开发成本。
数据在专用的数据文件中
这个也是传统软件开发最为常用的方式之一,可以和上一种方式配合使用。它最主要的特点是解决同一个测试用例需要大量的不同的测试数据,或者同一个测试用例需要在不同的环境上使用不同的测试数据来进行测试的问题。通过专用的测试数据文件,可以有效的解决这两个问题。这个其实是一种抽象化思维的体现,将行为和数据分离,可以有效的分别进行开发和维护,有效降低开发和维护测试数据的成本。
数据在数据库中
将数据放在数据库中,不仅包含数据文件方式所有的优点,还有一个优点就是可以让很多人同时使用,并且可以快速的进行修改和让修改后的数据生效。但是在拥有更多优点的同时也存在一定的缺点,就是增加了搭建和维护数据库本身的成本,而且数据更容易被被人修改和更难以还原。但是对于某些特定的复杂系统的测试,比如状态机复杂的测试系统等,这些缺点又变成了优点,比如它可以更容易起记录数据的变化以及中间状态。所以针对不同类型软件系统,没有银弹,所谓的优点和缺点只是相对的。
数据在数据系统中
对于需要大量测试数据的复杂软件系统,测试数据需要靠特定的数据系统来生成和管理。由于数量巨大,很难有人工通过分析和设计完成。测试数据系统可以通过人工输入测试数据,也可以根据特定的规则和模型,或者随机自动生成测试数据。并且测试数据系统提供多种访问方式,比如RESTful API,SOAP API等多种方式来访问数据。虽然测试数据系统功能强大,但是使用它也需要一定的学习和前期成本。但是一旦前期准备和学习好之后,后期的使用和维护成本就相对较低。对于测试数据在数量巨大,类型众多的情况下,使用测试数据系统是一个明智的选择。
除了上面这几种测试数据类型外,还可以根据数据生成的规则不同,分为以下几种不同类型的测试数据:
根据验收条件而生成特定测试数据
通过分析业务功能以及业务验收条件来生成测试数据是
根据业务模型而生成特定测试数据
根据特定的模型而生成随机测试数据
测试数据的未来
首先是基于模型的测试数据生成,现在虽然只是一些特殊软件系统的数据生成方式,但是未来一定会慢慢成为大项软件系统的主要的测试数据生成的方式,从而保证测试数据的全面性。随着测试数据的数量和多样性的大量增加,测试数据的管理系统也需要越来越强大,从而大量节约测试数据的管理和维护成本。
其次随着AI的发展,使用AI技术来生产测试数据一定会大力发展。但是使用AI生成测试数据也存在一些问题,只有解决了这些问题,使用AI技术生产测试数据才能更为广泛的被使用:
1,如何更为简单和准确的生成输出数据,即用来验证测试是否通过的验证数据。因为每一个输入数据都需要一个输出数据来作为验证条件,并且是根据一个特定的模型或者业务流程才能知道正确的输出数据。但是由于业务流程的千差万别,在没有准确的数据模型的情况下,通过当前的AI深度学习技术,很难根据输入数据生成正确的输出数据。所以只有当AI深度学习技术能正确理解业务功能的情况下才有可能正确生成输出数据,这个也是AI能在自动生成测试领域大规模应用的前提条件之一。
2,由于AI学习会产生大量的测试输入数据,而如何归类测试数据,让测试数据更表意,还要减少相同等价类测试数据,以及保证生产的测试数据100%准确,都是非常困难的。特别是数据的准确性和表意性,是特别难以做到100%准确的。如果不能保证测试数据的准确性和表意性,则在数据量巨大的情况下,会导致测试人员对于测试结果的信任程度,以及会带来巨大的分析审查和维护的工作量。