Skip to content

17测试框架如何做好数据持久化?(二)

在上一课时,我们讲解了测试数据本身,以及测试请求数据存在的问题,并发现了它们的共性,那就是缺乏测试数据管理,而测试数据管理往往伴随着数据持久化。所以这一课时我将讲解如何借助工具完成数据持久化工作,这个脑图是本课时内容梗概,可供你参考。

从软件测试角度,通俗地说,数据持久化就是将测试数据有组织的永久存储的过程;狭义地说,一般是指把数据存储在数据库;广义地说,数据也可以是文件数据、报表等其他形式。

正如前面所讲,测试数据包括测试请求数据和测试结果数据,这两部分数据都应该进行持久化。

为什么要数据持久化

数据持久化的好处有很多,这里列出比较突出的几个。

1 . 可以使回归测试的范围更准确

通过对相邻版本测试结果数据的对比(通常是指跑所有测试用例的测试),我们可以清晰地掌握在本次测试及上次测试之间,有哪些测试用例受到影响,从而验证两个版本之间的更改, 所影响的范围是否与预期一致。

例如,本版本的改动我们认为只会影响 A 模块,结果却发现 B 模块的一个测试用例运行失败了。则我们在以后更改 A 模块时,应该主动把 B 模块的这个失败用例纳入回归测试中,从而在更早阶段发现潜在 bug。

2. 可以发现测试用例本身的问题

如果某个测试用例在多个版本中均运行失败了,或者有很大概率会失败。如果这个失败不是 bug 引起的,则说明这个测试用例是不稳定的测试用例,应该加以改进。

3. 可以发现潜在的性能问题

通过对各个版本的测试结果对比,我们可以发现潜在的性能问题。 比如在某一段时间内,相同的测试用例集,整个测试的整体运行时间越来越久,则说明某些业务的性能在下降。

4. 可以让整个团队都加入质量保障中

通过持久化的保存测试结果数据,并且以报表的形式发送给相关干系人。可以使得除开发、测试之外的团队角色对产品的质量有完整且不断更新的认识,可以促进关键干系人对产品质量的关注,从而获得更多的资源倾斜。

如何进行测试数据持久化

测试数据持久化不外乎就是把数据放到 DB 中,但是如果只是单纯的存储,并不能享用到数据持久化的好处。通常情况下,我们的测试请求数据,要跟测试用例进行一一对应。

而测试用例,应该要根据不同的测试目的,放到不同的测试套件里去,最后通过测试套件的执行,形成测试用例、测试脚本、测试数据、 测试结果的对应,从而方便后续我们对测试结果数据进行多维度分析。

那么怎么使得测试数据持久化能够实现上述目标呢?当前流行的解决方案有以下几种。

1. JIRA

其实是 JIRA+ Zephyr 或者 JIRA + synapseRT。其中 JIRA 在国外,是公认的市场占有率最高的项目管理和开发管理工具,而 Zephyr 和 synapseRT 均是收费的 JIRA 插件。

  • Zephyr 的用例管理虽然使用简单,但是无法记录和跟踪需求,管理人员无法直观了解测试进度,所以较难从项目整体角度来管理测试用例;

  • synapseRT 可以用来记录和跟踪需求,也可以用来创建、组织、计划和执行测试用例,还可以用来批量执行测试用例、链接 Bug,以及生成各种关于需求和测试的报告等等。

2. 禅道

禅道作为国内市场占有率第一的,并且是国产、开源的专业研发项目管理软件,可用作缺陷管理、需求管理和任务管理,在功能上与 JIRA 不相上下。

并且禅道有很多专有工具,例如 zendata 测试数据生成器、ztf 自动化测试框架等,可以一站式地完成项目管理,以及测试管理与执行,非常适合中小团队使用。

(1)禅道安装、配置

禅道支持多个平台,每个平台的安装和配置各有不同,你可以参考这个禅道安装指南进行安装和配置。

下面我将以禅道为例,向你讲解禅道各个组件、模块之间的协同运作,数据持久化的实现、测试数据的更新,以及测试数据的管理。

(2)使用禅道进行测试管理

测试管理指对测试需求、计划、用例和实施过程进行管理。为了简单起见,我这里仅介绍测试套件的使用

  • 在建立测试套件前,你需要事先创建产品。

如下图所示,打开禅道,在"产品"模块点击右上角的"添加产品"。

接着,在弹出的"添加产品"栏目中,填写各项名称,然后点击"保存"。

  • 产品创建好后,就可以创建测试套件了

测试套件是不可或缺的,在开发完成一个版本的测试后,我们通常以测试套件的方式进行一轮或多轮测试。

在"测试"这个模块,点击"套件" , 你将看到如下界面:

点击右上角的"+建套件",创建一个新的套件。

填写必要信息后保存,测试套件即创建成功。

  • 测试套件创建好后,要跟测试用例关联,此时要创建测试用例

测试用例的创建跟测试套件的创建步骤类似。如下图所示,在"测试"这个模块,点击"用例"------"功能测试", 然后点击右上角的"+建用例"或者"+批量建用例"来进行测试用例的创建。

接着在创建测试用例页面,创建你的测试用例。

点击"保存",创建好后点击"套件"模块, 在测试套件"软件测试开发入门与实战"中,点击"关联用例"。

选择创建的测试用例,然后点击"保存"即可完成关联。

关联好测试用例后,你的测试套件就完成了,你可以在"操作"栏点击执行, 来执行测试用例

执行成功后,你可以点击最右方的"结果"来查看运行结果, 如下图所示:

测试的历次结果都会显示在这里。

利用禅道创建测试套件,可以用作测试管理和测试活动的安排,让你对测试任务一目了然。

(3)ZTF 自动化测试框架

ZTF 是禅道开发的一款开源自动化测试管理框架,它聚焦于自动化测试的管理功能。ZTF 提供了自动化测试脚本的定义、管理、驱动、执行结果的回传、bug 的创建,以及和其他自动化测框架的集成。

ZTF 是独立安装的,其安装部署可以参考ZTF 安装部署,它的 ZTF 的语法如下:

java
set     -s        设置语言、禅道系统同步参数。用户对当前目录需要有写权限
co      checkout  导出禅道系统中的用例,已存在的将更新标题和步骤描述。可指定产品、套件、测试单编号
up      update    从禅道系统更新已存在的用例。可指定产品、模块、套件、测试单编号
run     -r        执行用例。可指定目录、套件、脚本、结果文件路径,以及套件和任务编号,多个文件间用空格隔开
junit|testng      执行JUnit、TestNG、PHPUnit、PyTest、JTest、CppUnit、GTest、QTest单元测试脚本
ci                将脚本中修改的用例信息,同步到禅道系统
cr                将用例执行结果提交到禅道系统中
cb                将执行结果中的失败用例,作为缺陷提交到禅道系统
list    ls -l     查看测试用例列表。可指定目录和文件的列表,之间用空格隔开
view    -v        查看测试用例详情。可指定目录和文件的列表,之间用空格隔开
sort    -sort     将脚本文件中的步骤重新排序
clean   -c        清除脚本执行日志
--verbose         增加此参数,用于显示详细日志,如Http请求、响应、错误等信息

ZTF 的常用命令如下:

java
$>ztf.exe run demo\lang\bat\1_string_match.bat       执行演示测试用例
$>ztf.exe set                                        根据系统提示,设置语言、禅道地址、账号等,Windows下会提示输入语言解释程序
$>ztf.exe co                                         交互式导出禅道测试用例,将提示用户输入导出类型和编号
$>ztf.exe co -product 1 -language python             导出编号为1的产品测试用例,使用python语言,缩写-p -l
$>ztf.exe run product01 -suite 1                     执行禅道系统中编号为1的套件,脚本在product01目录,缩写-s
$>ztf.exe ci product01\tc-1.py                       将脚本里修改的用例信息,同步到禅道系统
(4) ZTF 框架和禅道的结合使用

ZTF 可以和禅道结合使用,来提高测试的效率。

  • 设置 ZTF
python
# D:\ztf为你ztf的安装路径
D:\ztf>ztf.exe set

ZTF 会弹出提示,根据提示输入即可完成配置。

  • 导出禅道的测试用例为测试脚本

通过 ztf 可以将我们在禅道中定义的测试用例导出,具体用法如下:

根据系统提示,我们导出刚才创建的测试套件 1 的测试用例 1,并且导出格式为 python。导出成功后,在文件夹 D:\ztf\product1\ 下就会有自动生成的 1.py 文件,内容如下:

python
#!/usr/bin/env python
'''
[case]
title=测试用例-01
cid=1
pid=1

[esac]
'''
# 访问'demo\python'获取更多帮助

注意此时,导出的测试脚本仅仅是和禅道完成绑定,里面的具体的测试代码还需要我们编写。

更改脚本文件 1.py,更改后其代码如下:

java
#!/usr/bin/env python
'''
[case]
title=测试用例-01
cid=1
pid=1
[group]
1. 输入用户名            >> kevin.cai
2. 输入密码              >> 123456
[esac]
'''
# 访问'demo\python'获取更多帮助
print(">> kevin.cai")
print(">> 123456")
  • 运行测试脚本

脚本更新好后,我们来运行下:

我直接运行刚刚生成的 product1 文件夹下的所有测试用例,可以看到测试成功。

  • 通过 ztf 更新测试用例到禅道

正常情况下,我们的测试脚本是根据测试用例编写的,测试脚本和禅道里的测试用例是一致的。

假设现在需求有变化,我的测试脚本失败了,我发现后先更新了测试脚本。这个时候我的测试脚本和禅道里的测试用例就不一致了,就需要同步。ztf 提供了一个方法来同步我们的测试用例,方法如下:

通过 ztf.exe ci 的方式可以使我们的测试脚本和测试用例保持同步,避免了测试用例测试没有反映真实测试需求的情况。

  • ZenData 测试数据生成器的使用

在上一课时"测试请求数据的准备方式"中我讲过了测试数据生成,其中一个办法是测试数据平台。ZenData 即是禅道提供的一款测试数据通用平台,可以方便地生成测试数据。

ZenData 主要有以下两大功能:

数据生成 通过一个配置文件,使用 ZenData 生成你想要的各种数据;数据解析对某一个数据文件,指定其数据类型定义的配置文件,完成到结构化数据的解析。

ZenData 生成的测试数据可用于手工测试,也可以用于自动化测试,下面来看下 Zendata 的使用。

Zendata 安装部署请直接参考Zendata 安装部署

  • ZenData 的语法如下:
java
  -d  --default    默认的数据格式配置文件
  -c  --config     当前场景的数据格式配置文件,可以覆盖默认文件里面的设置
  -o  --output     生成的数据的文件名。可通过扩展名指定输出json|xml|sql格式的数据。默认输出原始格式的文本数据
  -n  --lines      要生成的记录条数,默认为10条
  -F  --field      可通过该参数指定要输出的字段列表,用逗号分隔。 默认是所有的字段
  -t  --table      输出格式为sql时,需通过该参数指定要插入数据的表名
  -T  --trim       输出的字段去除前后缀,通常用在生成SQL格式的输出
  -H  --human      输出可读格式,打印字段名,并使用tab键进行分割
  -r  --recursive  递归模式。如不指定,默认为平行模式。平行模式下各个字段独立循环
                   递归模式下每个字段的取值依赖于前一字段。可增强数据的随机性
  • ZenData 生成数据示例

ZenData 生成测试数据非常简单,首先你使用 yaml 文件来定义你的数据格式,然后使用上述命令即可。

下面的实例, 根据配置文件 demo\test\test-email.yaml 生成了一组 email:

python
# zd是ZenData的安装目录
# demo\test\test-email.yaml是默认的配置文件。存在ZenData根目录下的demo文件夹
C:\zd>zd.exe -d demo\test\test-email.yaml -n 1 -o iTesting.txt

在上面的代码里,-d 函数后面跟默认的 yaml 文件格式,ZenData 会根据指定的格式来生成数据,你也可以自己定义 yaml 文件。-n 代表生成的数据组数,-o 代表输出的文件名。

注意,每一组生成的数据有多少字段,取决于你 yaml 文件中的定义。如果你想控制输出的个数,可以采用如下方式:

java
# number_with_esp是yaml文件test-email.yaml的filed名称
# 本例指定输出filed是number_with_esp生成的数据
C:\zd>zd.exe -d demo\test\test-email.yaml -n 1 -F number_with_esp -o iTesting.txt

执行成功后打开生成的 iTesting.txt 文件,你将看到有 email 数据生成,此文件直接可用于你的自动化测试中。当前 ZenData 支持 TXT、JSON 、CSV 以及 sql 格式的文件生成。

了解了 ZenData 的用法后,我们来看一个真实用例,生成用于注册的账户,提供两个字段,用户名和密码。

首先,我们创建一个 yaml 文件。为简单起见,我在 ZenData 安装目录下的 demo\test 文件夹下创建一个名为 test-user.yaml 的文件,内容如下:

yaml
title: 用户账户
desc:
author: kevin Cai
version: 1.0
fields:
- field: number_with_esp
from: email.v1.yaml
use: number_with_esp
prefix: ""
postfix: "\t"
- field: field_format 
range: 1-10 
format: "passwd%02d" 
postfix: "\t"

然后,我在命令行执行如下命令:

java
# zd是ZenData的安装目录
# demo\test\test-user.yaml是刚创建的配置文件。用于生成用户名和密码
C:\zd>zd.exe -d demo\test\test-user.yaml -n 1 -o iTesting.txt

命令执行完后,查看生成的 iTesting 文件:

java
01234qq@.com   passwd01

可以看到数据文件被正确生成,关于更多数据文件的格式及用法,可以参考 ZenData 官网

小结

通过禅道一站式的解决方案,你可以完成产品、项目、 需求、测试管理、测试执行,以及测试报告的工作。更多关于禅道的用法和高级使用,请直接参考禅道官方网站

数据持久化是个非常简单的动作,但是数据持久化采用什么方式进行,与哪种企业管理工具结合,数据持久化后要实现什么目标,才是更需要关注的部分。通过禅道的一站式解决方案,我们可以轻松把测试数据管理起来,实现测试管理的跃升和测试效率的提高。

好的, 我是蔡超,关于测试数据,你是如何管理的呢?可以在下方留言区留言,一起讨论。


更多测试框架的内容,请关注我的公众号 iTesting 回复"测试框架"查看。