ZenData通用数据生成器

软件测评 Oct 18, 2021

自动化测试无论单元测试、接口测试、功能测试都会面临一个挑战,即如何能够做到大规模、工程化的自动化测试。这里面会牵扯到很多方面的技术:测试环境、测试手段、测试资源、测试管理等等,但这里面最最重要的一环是测试数据的管理。

如果测试数据无法做到灵活、大规模的管理,那么自动化测试就始终无法做到规模化,无法起到快速验证、快速集成、快速交付的目的。绝大部分的团队还是停留在手工维护阶段。手工造数据,手工维护,成本之高,可想而知。个别有能力的测试人员,会自己写点脚本来生成数据。个别有开发资源的大厂,则自己组建团队来做专门的数据工厂。这些方案都不具备通用性,成本也极其高昂。

ZenData功能

ZenData则通过YAML文件,定义了一种简单的数据类型描述语法。使用者不需要对技术有过多了解,通过定义简单的字段取值列表、前缀后缀等配置,即可实现测试数据维护的目的。简洁、高效、灵活,是做单元测试、接口测试、功能自动化测试、性能测试、压力测试、打桩mock的有力帮手。

ZenData通过简单的range定义实现了区间、步长、随机、引用、重复、SQL查询等方式,通过简单的规则可应对各种变化。ZenData只有一个可执行文件,支持HTTP模式,还可以对数据进行反向解析,可以输出txt、json、xml、sql等多种格式。

下载地址

ZD下载 - ZenData测试数据生成器
测试数据生成器

ZenData是使用Go语言开发的跨平台程序,Windows、Linux、MacOS都可以用。

以Windows安装为例,根据文档说明:

  1. https://zd.im/download.html下载ZenData最新版文件;
  2. 解压后进入相应目录,如c:\zd;
  3. 执行zd.exe -h获取使用帮助;
  4. 执行 zd.exe -e获取命令示例;
  5. 首次执行时,请根据提示选择工具的语言;
  6. 根据提示执行setx Path命令,将zd.exe加入$PATH环境变量,以便于在任意目录中执行。例如:setx “Path” “%path_%;c:\zd” /m

除了通过setx Path命令加入环境变量,你还可以通过Windows的图形界面配置环境变量:

1. 在命令行或通过 Win+R 组合键输入 sysdm.cpl ,打开系统属性窗口;

2. 依次点击"高级"标签、"环境变量"按钮,打开环境变量编辑窗口;

3. 在上部"用户变量"列表中,点击"编辑"按钮修改 Path 变量;若无 Path 变量,则点击"新建"按钮;

4. 填入或追加 zd.exe文件所在的目录绝对路径,Win7 中为单行编辑模式,路径间用英文分号隔开;

ZenData文件结构

执行ZenData命令时,软件会从用户当前目录和ZenData部署目录寻找数据定义和资源。

  • data目录:  存放Excel格式的基础数据,如国家、地区、人名和中文词语等。
  • yaml目录:  系统内置的一些数据定义,如账号、域名、邮箱、日期和文章等。
  • users目录: 用于存放用户自己定义的一些数据。
  • demo目录:   一些演示的例子。

命令行参数

数据生成相关
-d  --default    默认的数据格式配置文件。
-c  --config     当前场景的数据格式配置文件,可以覆盖默认文件里面的设置。
-o  --output     生成的数据的文件名。可通过扩展名指定输出json|xml|sql|csv|xlsx格式的数据。默认输出原始格式的文本数据。
-n  --lines      要生成的记录条数,默认为10条。
-F  --field      可通过该参数指定要输出的字段列表,用逗号分隔。 默认是所有的字段。
-t  --table      输出格式为sql时,需通过该参数指定要插入数据的表名。
--dns        指定数据源连接字符串,结合表名使用,可直接插入数据到MySQL数据库表。
--clear      插入数据前,删除已有数据。
-T  --trim       输出的字段去除前后缀,通常用在生成SQL格式输出和数据反向解析命令中。
-H  --human      输出可读格式,打印字段名,并使用tab键进行分割。
-r  --recursive  递归模式。如不指定,默认为平行模式。平行模式下各个字段独立循环。
递归模式下每个字段的取值依赖于前一字段。可增强数据的随机性。
-R  --root       指定数据生成命令的执行目录,默认为当前目录。


內置数据查看
-l  --list       列出当前目录下所有的用户数据定义。
-L               列出ZenData安装目录下所有数据定义。
-v  --view       查看当前目录下某个用户数据定义的详细信息。
-V               查看ZenData安装目录下某个数据定义的详细信息。


从SQL生成数据
-i  --input      指定一个数据库Schema或文章文本文件,解析生成yaml配置文件。需通过-o参数指定一个输出的目录。
-D  --decode     根据指定的配置文件,将通过-i参数指定的数据文件解析成json格式。

HTTP服务相关
-p  --port       在指定端口上启动Web服务。可通过页面管理测试数据、通过接口请求JSON格式的数据。服务模式下接口只支持数据生成。
-b  --bind       监听的ip地址,默认监听所有的ip地址。
-R  --root       运行HTTP服务时根目录。客户端可调用该根目录下面的配置文件。如果不指定,取zd可执行文件所在目录。


帮助相关
-h  --help       打印帮助。
-e  --example    打印数据定义文件示例。

配置文件Yaml语法定义

以下为一个标准的YAML定义文件,各元素含义请见注释。

title: zendata数据配置语法说明
desc:

# 文件组成

# zendata以yaml格式的文件来定义各个字段的格式。
# yaml文件整体由文件说明和字段定义两部分组成。

# 文件说明

# title:   标题,可以用简短的文字概要描述该文件定义的数据类型。
# desc:    描述,可以用多行文本来详细描述该文件定义的数据类型,非必选项。
# author:  作者,非必选项。
# version:版本号,非必选项。

# 字段列表

# 字段定义部分都放在fields这个定义里面。
# 一个yaml文件可以包含一个或者多个字段。
# 字段列表以-field定义开始。
# 一个字段可以通过fields属性定义它的子字段。

# 字段定义

# field:    字段名,仅支持英文、数字、下换线和.
# range:    列表范围,最重要的定义。
# loop:     循环次数,可以定义某一字段循环多少次。
# loopfix:  每一次循环时的连接符。

# format:    支持格式化输出。

# prefix:   该字段的前缀。
# postfix:  该字段的后缀。

# length:   该字段的长度。如果不通过分隔符区分,则需要指定字段长度,单位是字节。
# leftpad:  左填充的字符。如果长度不够,可指定左填充的字符。默认是以空格左填充。
# rightpad: 右填充的字符。如果长度不够,可指定右填充的字符。

# config:    可以引用另外一个文件里面的定义。

# from:     引用某一个定义文件。
# use:      使用被引用文件中定义的若干实例。all代表使用所有。
# select:   如果引用的文件是excel表,可以查询里面的某一个字段。
# where:     如果引用的文件是excel表,可以使用查询条件。

# loop定义

# 可以使用一个数字来指定字段循环的次数,比如loop:2。
# 可以使用区间来定义字段循环的次数。比如loop:2-10。

# range定义

# 使用逗号连接不同的元素。比如 range: 1,2,3。
# 元素也可以是一个区间。比如 range:1-10, A-Z。
# 区间可以通过冒号:来指定步长。比如 range:1-10:2。
# 步长可以是小数。比如 range: 1-10:0.1。
# 步长可以是负数。比如 range:100-1:-1。
# 区间可以通过R来指定随机。比如 range: 1-10:R,随机和步长只能二选一。
# 可以通过一个文件来指定列表。比如range: list.txt。文件名是相对路径时,以配置文件为基准计算。
# 可以通过{n}的方式来重复某一个元素。比如 range: user1{100},user2{100}
# 如果区间或者几个元素需要重复,需要用[]括起来。比如 range: [user1,user2,user3]{100}

author: zentao
version: 1.0

fields:

  - field: field_common                 # 默认的列表类型,通过逗号隔成若干区间。
    range: 1-10, 20-25, 27, 29, 30      # 1,2,3...,10,20,21,22...,25,27,29.30
    prefix: ""                          # 前缀
    postfix: "\t"                       # 后缀,特殊字符加引号,否则无法解析。

  - field: field_step                   # 区间指定步长。
    range: 1-10:2, 1-2:0.1              # 1,3,5,7,9,1, 1.1,1.2...,2
    postfix: "\t"

  - field: field_random                 # 区间指定随机。随机属性R同步长不能同时出现。
    range: 1-10:R                       # 1,5,8...
    postfix: "\t"

  - field: field_loop                   # 自循环的字段。
    range: a-z                          # a|b|c ...
    loop: 3                             # 循环三次
    loopfix: _                          # 每次循环的连接符。
    postfix: "\t"

  - field: field_repeat                 # 通过{}定义重复的元素。
    range: user-1{3},[user2,user3]{2}   # user-1,user-1,user-1,user2,user2,user3,user3
    postfix: "\t"

  - field: field_format                 # 通过格式化字符串输出。
    range: 1-10                         # passwd 1,passwd 2,passwd 3 ... passwd10。
    format: "passwd%02d"                # 用%02d补零,使密码整体保持8位。
    postfix: "\t"

  - field: field_length                 # 指定宽度。
    range: 1-99                         # 01\t,02\t,03\t..., 99\t
    length: 3                           # 包含前后缀的宽度。
    leftpad: 0                          # 宽度不够时,补充的字符。
    postfix: "\t"

  - field: field_text                   # 从一个文件中随机读取。
    range: users.txt:R                  # 相对当前文件路径。
    postfix: "\t"

  - field: field_yaml                   # 引用其他的定义文件整体内容。
    range: test/test-nested2.yaml{3}    # 相对当前文件路径。
    postfix: "\t"

  - field: field_use_config             # 引用其他的config定义文件。
    config: number.yaml                 # 相对当前文件路径,config内包含单个字段。
    postfix: "\t"

  - field: field_use_ranges             # 引用內置的定义文件,该文件定义了多个range,他们共享了一些field层面的属性。
    from: zentao.number.v1.yaml         # 引用yaml/zentao/number/v1.yaml文件里面的ranges定义。
    use: medium                         # 使用该文件中定义的medium分组。
    postfix: "\t"

  - field: field_use_instance           # 引用其他的定义文件,该文件定义了多个实例。
    from: ip.v1.yaml                    # yaml/ip/v1.yaml
    use: privateC,privateB              # 使用该文件中定义的privateC和privateB两个实例。
    postfix: "\t"

  - field: field_use_excel              # 从excel数据源里面取数据。
    from: address.cn.v1.china           # 从data/address/v1.xlsx文件中读取名为china的工作簿。
    select: city                        # 查询city字段。
    where: state like '%山东%'           # 条件是省份包含山东。
    rand: true                          # 随机取数据
    postfix: "\t"

  - field: field_with_children          # 字段多层嵌套
    fields:
      - field: child1
        range: a-z
        prefix: part1_
        postfix: '|'

      - field:  child2
        range: A-Z
        prefix: part2_
        postfix: '|'

      - field: child_with_child
        prefix: part3_
        postfix:
        fields:
          - field: field_grandson
            prefix: int_
            range: 10-20
            postfix:

数据输出

目前ZenData一共支持7种数据格式的输出,分别是:

  • Txt
  • Json
  • Xml
  • Sql
  • Csv
  • Excel
  • ProtoBuf
支持直接插入数据到Mysql

以输出txt文件为例,其他格式只需将-o test.txt后缀修改为对应的文件格式即可。


zd.exe -d demo/default.yaml -c demo/test.yaml -n 10 -o test.txt

生成的文本内容如下:

1 ,1 2 a_b_c user-1 passwd01 01 Vincent 11-2 '100,101' 101 192.168.0.1 日照市 part1_a|part2_A|part3_int_10
2 ,3 1 d_e_f user-1 passwd02 02 John 2a-z '102,103' 102 192.168.1.2 德州市 part1_b|part2_B|part3_int_11
3 ,5 4 g_h_i user-1 passwd03 03 Jack 31-2 '104,105' 103 192.168.2.3 日照市 part1_c|part2_C|part3_int_12
4 ,7 5 j_k_l user2 passwd04 04 Jack 11-2 '106,107' 104 192.168.3.4 临沂市 part1_d|part2_D|part3_int_13
5 ,9 6 m_n_o user2 passwd05 05 Tom 2a-z '108,109' 105 192.168.4.5 临沂市 part1_e|part2_E|part3_int_14
6 ,1.0 4 p_q_r user3 passwd06 06 Rose 31-2 '110,111' 106 192.168.5.6 泰安市 part1_f|part2_F|part3_int_15
7 ,1.1 5 s_t_u user3 passwd07 07 Rose 11-2 '112,113' 107 192.168.6.7 菏泽市 part1_g|part2_G|part3_int_16
8 ,1.2 4 v_w_x user-1 passwd08 08 John 2a-z '114,115' 108 192.168.7.8 日照市 part1_h|part2_H|part3_int_17
9 ,1.3 5 y_z_a user-1 passwd09 09 John 31-2 '116,117' 109 192.168.8.9 泰安市 part1_i|part2_I|part3_int_18
10 ,1.4 7 b_c_d user-1 passwd10 10 Mark 11-2 '118,119' 110 192.168.9.10 潍坊市 part1_j|part2_J|part3_int_19

web服务

除了命令行调用外,ZenData还提供了web服务。

使用以下命令,启动ZenData服务于80端口,以d:\zd\def为根目录。

zd.exe -p 8848 -R d:\zd\def

-R参数缺省时,使用当前目录。

服务启动后,会输出类似以下的内容:

正在启动ZenData HTTP服务,按CTRL+C键退出。 数据设计请访问http://10.8.0.134。 数据生成请调用http://10.8.0.134/data接口,如curl http://10.8.0.134/data?config=demo/default.yaml&lines=10。

数据设计工具可协助大家,对磁盘上的数据定义文件进行管理,并简化YAML文件的编辑过程。

点击服务启动时输出消息中的“数据设计”链接,如http://10.8.0.134,打开Web版的数据设计工具。

在浏览器中输入以下地址,用GET方法访问生成的JSON结构化数据。

此时,ZenData会在HTTP服务启动时指定的工作目录下,寻找default和config参数指向的配置文件。

n=3参数指定生成的数据行数;T=true参数去除字段的前后缀。

http://localhost/data?default=demo/default.yaml&config=demo/test.yaml&n=3&T=true

请求地址可替换成用户数据对应的yaml,例如:http://localhost/data?default=usesr/test/hello.yaml

目前web只能生成JSON格式的数据,其他格式的数据并不能通过Web直接生成,如需要其他格式的数据,只能通过命令行生成。

参考

通用测试数据生成器,自动化测试数据利器! - ZenData测试数据生成器
ZenData是一款国产开源的测试数据生成工具,它使用YAML文件作为描述文件,可以通过简单的定义生成任意的测试数据,满足单元测试数据、接口测试数据、功能测试数据的需求,可以作为您自动化测试的得力工具,也可以作为公司数据工厂的基础。ZenData使用Go开发,可以在所有平台上运行。

标签

猫君

记录想法、故事和灵感。

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.