ZenData通用測試數(shù)據(jù)生成器
ZenData是由禪道項(xiàng)目管理軟件團(tuán)隊(duì)推出的一款通用的測試數(shù)據(jù)生成工具。主要為了解決開發(fā)和測試過程中測試數(shù)據(jù)的生成、維護(hù)、解析問題。
一、業(yè)內(nèi)趨勢
最近幾年DevOps概念越來越火,各種DevOps平臺(tái)也如雨后春筍一樣涌現(xiàn)。但大家往往把重點(diǎn)放在在工具鏈的搭建上,而忽略軟件研發(fā)最重要的本質(zhì)。工具鏈搭建是容易的,有各種的開源軟件可以滿足需求。但工具鏈搭建起來之后應(yīng)該怎么應(yīng)用呢?DevOps是希望可以通過持續(xù)集成和持續(xù)交付來實(shí)現(xiàn)快速的響應(yīng),但這里面有一個(gè)前提,就是質(zhì)量必須要保障。如果沒有質(zhì)量,持續(xù)集成和交付都是空談。如何保證質(zhì)量呢?就必須要上自動(dòng)化測試。
二、存在問題
自動(dòng)化測試無論單元測試、接口測試、功能測試都會(huì)面臨一個(gè)挑戰(zhàn),即如何能夠做到大規(guī)模、工程化的自動(dòng)化測試。這里面會(huì)牽扯到很多方面的技術(shù):測試環(huán)境、測試手段、測試資源、測試管理等等,但這里面最最重要的一環(huán)是測試數(shù)據(jù)的管理。
如果測試數(shù)據(jù)無法做到靈活、大規(guī)模的管理,那么自動(dòng)化測試就始終無法做到規(guī)模化,無法起到快速驗(yàn)證、快速集成、快速交付的目的。
三、目前解決方案
目前測試數(shù)據(jù)是如何來維護(hù)的呢?絕大部分的團(tuán)隊(duì)還是停留在手工維護(hù)階段。手工造數(shù)據(jù),手工維護(hù),成本之高,可想而知。個(gè)別有能力的測試人員,會(huì)自己寫點(diǎn)腳本來生成數(shù)據(jù)。個(gè)別有開發(fā)資源的大廠,則自己組建團(tuán)隊(duì)來做專門的數(shù)據(jù)工廠。這些方案都不具備通用性,成本也極其高昂。
四、ZenData解決方案
ZenData則通過YAML文件,定義了一種簡單的數(shù)據(jù)類型描述語法。使用者不需要對技術(shù)有過多了解,通過定義簡單的字段取值列表、前綴后綴等配置,即可實(shí)現(xiàn)測試數(shù)據(jù)維護(hù)的目的。簡潔、高效、靈活,是做單元測試、接口測試、功能自動(dòng)化測試、性能測試、壓力測試、打樁mock的有力幫手。
ZenData通過簡單的range定義實(shí)現(xiàn)了區(qū)間、步長、隨機(jī)、引用、重復(fù)、SQL查詢等方式,通過簡單的規(guī)則可應(yīng)對各種變化。ZenData只有一個(gè)可執(zhí)行文件,支持HTTP模式,還可以對數(shù)據(jù)進(jìn)行反向解析,可以輸出txt、json、xml、sql等多種格式。
官方網(wǎng)站:https://zd.im
五、快速體驗(yàn)
wget https://dl.cnezsoft.com/zendata/1.2/linux/zd.zip
unzip zd.zip
cd zd
zd -d demo/default.yaml
六、語法格式
title: zendata數(shù)據(jù)配置語法說明
desc:
# 文件組成
# zendata以yaml格式的文件來定義各個(gè)字段的格式。
# yaml文件整體由文件說明和字段定義兩部分組成。
# 文件說明
# title: 標(biāo)題,可以用簡短的文字概要描述該文件定義的數(shù)據(jù)類型。
# desc: 描述,可以用多行文本來詳細(xì)描述該文件定義的數(shù)據(jù)類型,非必選項(xiàng)。
# author: 作者,非必選項(xiàng)。
# version:版本號(hào),非必選項(xiàng)。
# 字段列表
# 字段定義部分都放在fields這個(gè)定義里面。
# 一個(gè)yaml文件可以包含一個(gè)或者多個(gè)字段。
# 字段列表以-field定義開始。
# 一個(gè)字段可以通過fields屬性定義它的子字段。
# 字段定義
# field: 字段名,僅支持英文、數(shù)字、下?lián)Q線和.
# range: 列表范圍,最重要的定義。
# loop: 循環(huán)次數(shù),可以定義某一字段循環(huán)多少次。
# loopfix: 每一次循環(huán)時(shí)的連接符。
# format: 支持格式化輸出。
# prefix: 該字段的前綴。
# postfix: 該字段的后綴。
# length: 該字段的長度。如果不通過分隔符區(qū)分,則需要指定字段長度,單位是字節(jié)。
# leftpad: 左填充的字符。如果長度不夠,可指定左填充的字符。默認(rèn)是以空格左填充。
# rightpad: 右填充的字符。如果長度不夠,可指定右填充的字符。
# config: 可以引用另外一個(gè)文件里面的定義。
# from: 引用某一個(gè)定義文件。
# use: 使用被引用文件中定義的若干實(shí)例。all代表使用所有。
# select: 如果引用的文件是excel表,可以查詢里面的某一個(gè)字段。
# where: 如果引用的文件是excel表,可以使用查詢條件。
# loop定義
# 可以使用一個(gè)數(shù)字來指定字段循環(huán)的次數(shù),比如loop:2。
# 可以使用區(qū)間來定義字段循環(huán)的次數(shù)。比如loop:2-10。
# range定義
# 使用逗號(hào)連接不同的元素。比如 range: 1,2,3。
# 元素也可以是一個(gè)區(qū)間。比如 range:1-10, A-Z。
# 區(qū)間可以通過冒號(hào):來指定步長。比如 range:1-10:2。
# 步長可以是小數(shù)。比如 range: 1-10:0.1。
# 步長可以是負(fù)數(shù)。比如 range:100-1:-1。
# 區(qū)間可以通過R來指定隨機(jī)。比如 range: 1-10:R,隨機(jī)和步長只能二選一。
# 可以通過一個(gè)文件來指定列表。比如range: list.txt。文件名是相對路徑時(shí),以配置文件為基準(zhǔn)計(jì)算。
# 可以通過{n}的方式來重復(fù)某一個(gè)元素。比如 range: user1{100},user2{100}
# 如果區(qū)間或者幾個(gè)元素需要重復(fù),需要用[]括起來。比如 range: [user1,user2,user3]{100}
author: zentao
version: 1.0
fields:
- field: field_common # 默認(rèn)的列表類型,通過逗號(hào)隔成若干區(qū)段。
range: 1-10, 20-25, 27, 29, 30 # 1,2,3...,10,20,21,22...,25,27,29.30
prefix: int_ # 前綴
postfix: "\t" # 后綴,特殊字符加引號(hào),否則無法解析。
- field: field_step # 區(qū)間可以指定步長。
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屬性指定隨機(jī)。R屬性和步長不能同時(shí)出現(xiàn)。
range: 1-10:R # 1,5,8...
postfix: "\t"
- field: field_file # 從一個(gè)文件中讀取列表,并指定隨機(jī)。
range: users.txt:R # 該文件中一行作為一個(gè)元素,并隨機(jī)。
postfix: "\t"
- field: field_loop # 自循環(huán)的字段。
range: a-z # a_b_c | d_e_f | g_h_i
loop: 3 # 循環(huán)三次
loopfix: _ # 每次循環(huán)的連接符。
postfix: "\t"
- field: field_repeat # 通過{}定義重復(fù)的元素。
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" # 用%2d補(bǔ)零,使密碼整體保持8位,%2d默認(rèn)補(bǔ)空格。
postfix: "\t"
- field: field_use_another_file # 可以引用其他的定義文件。
config: number.yaml # 引用當(dāng)前目錄下面的number.yaml文件里面的定義。
postfix: "\t"
- field: field_use_ranges # 引用內(nèi)置的定義文件,該文件定義了多個(gè)range,他們共享了一些field層面的屬性。
from: custom.test.number.v1.yaml # 引用data/custom/number/v1.yaml文件里面的ranges定義。
use: medium # 使用該文件中定義的medium分組。
postfix: "\t"
- field: field_use_instance # 引用其他的定義文件,該文件定義了多個(gè)實(shí)例。
from: system.ip.v1.yaml # 引用data/system/ip/v1.yaml
use: privateC,privateB # 使用該文件中定義的privateC和privateB兩個(gè)實(shí)例。
postfix: "\t"
- field: field_nested_instant # 引用其他的定義文件,且該文件引用了其他實(shí)例。
from: custom.ip.private.yaml # 引用data/custom/ip/private.yaml
use: all # 使用該文件中的所有實(shí)例。
prefix: "{"
postfix: "}"
- field: field_use_excel # 從excel數(shù)據(jù)源里面取數(shù)據(jù)。
from: system.address.v1.china # 從data/system/address/v1.xlsx文件中讀取名為china的工作簿。
select: city # 查詢city字段。
where: state like '%山東%' # 條件是省份包含山東。
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:
