参考文章

一.前言

1.什么是datafaker?

datafaker是一个大批量测试数据和流测试数据生成工具,兼容python2.7和python3.4+,欢迎下载使用。github地址为:

https://github.com/gangly/datafaker

就是一个批量添加数据库数据的开源框架

2.为什么要用它?

因为在软件测试过程中,经常需要测试数据.

比如,查看一些数据,经常需要手动添加数据,手动添加有以下几个弊端

  1. 数据量大的时候,比较耗时
  2. 不够准确,比如号码格式,ip地址这些,不够准确
  3. 多表关联,需要手动添加

3.简介

3.1 能干什么?

datafaker是一个多数据源测试数据构造工具,可以模拟产生大部分常用数据类型,具有以下功能:

  1. 多种数据类型 包括常见数据库字段类型(整型、浮点型、字符型)、自定义类型(IP地址,邮箱,身份证号码等)
  2. 模拟多表关联数据 通过制定某些字段为枚举类型(从指定的数据列表里面随机选择),这样在数据量多的情况下能保证多表Join能关联上,查询到数据
  3. 支持批数据和流数据生成,可指定数据产生间隔时间
  4. 支持多种数据输出方式,包括屏幕打印、文件和远程数据源
  5. 支持多种数据源。目前支持关系型数据库、Hive、Kafka、Hbase、ES、File或屏幕打印。后面将扩展到Mongo,Kudu等数据源
  6. 可指定输出格式,目前支持text,json
  7. 生成自增主键

二. 环境准备

这里我是使用window版本的,如果是使用其他版本的,下载对应的安装包就可以了

1.python3.8(版本是3.X就可以了)

1.1 下载
链接: https://pan.baidu.com/s/1U746swKbzQ6g4vjTOs-7-w
提取码: y3n5

1.2 安装
python3.7安装教程

1.3 问题
(1)有时候window输入python会自动跳转到商城
在Windows 10 中配置了python的环境变量,但是在命令行中输入python会跳转到商店

这是由于在环境变量中path配置了 %USERPROFILE%\AppData\Local\Microsoft\WindowsApps 导致,只需要将该环境变量的配置去除即可解决
(2) pip 下载慢的问题(这个必须要配,不然等下下载会很慢)
配置pip国内镜像

2.pip(由于3.8版本自带,所以不需要安装,如果没有自带需要安装)

在这里插入图片描述

3. 安装datafaker

直接Ctrl + r ,然后cmd,打开命令行,输入命令就可以了

安装dadafaker

命令:

pip install datafaker
 卸载命令:

pip uninstall datafaker

更新到最新版本: 
pip install datafaker --upgrade

4.安装对应数据库包(这里我是使用的mysql)

安装mysqlclient

注意
(1) 不要下载错版本
python3.8,就要去下载python3.8的版本的mysqlclient
38就是3.8版本的
在这里插入图片描述

三.基本使用

1.查看版本号以及参数说明

$ datafaker --version
0.0.8

$ datafaker --help
usage: datafaker [-h] [--meta [META]] [--interval INTERVAL] [--version]
                 [--outprint] [--outspliter OUTSPLITER] [--locale LOCALE]
                 [--outfile OUTFILE] [--format FORMAT]
                 [--withheader]
                 [dbtype] [connect] table [num]

Generates SQLAlchemy model code from an existing database.

positional arguments:
  dbtype                data source type
  connect               connect info to the database
  table                 table to process
  num                   number of records to generate

optional arguments:
  -h, --help            show this help message and exit
  --meta [META]         meta file path
  --interval INTERVAL   meta file path
  --version             print the version number and exit
  --outprint            print fake date to screen
  --outspliter OUTSPLITER
                        print data, to split columns
  --locale LOCALE       which country language
  --format FORMAT       outprint and outfile format: json, text (default:
                        text)

2 在mysql中创建学生表

create table stu (
	id int unsigned auto_increment primary key COMMENT '自增id',
	name varchar(20) not null comment '学生名字',
	school varchar(20) not null comment '学校名字',
	nickname varchar(20) not null comment '学生小名',
	age int not null comment '学生年龄',
	class_num int not null comment '班级人数',
	score decimal(4,2) not null comment '成绩',
	phone bigint not null comment '电话号码',
	email varchar(64) comment '家庭网络邮箱',
	ip varchar(32) comment 'IP地址',
	address text comment '家庭地址'
) engine=InnoDB default charset=utf8;

编写元数据meta.txt,这是个学生表描述。 其中meta.txt文件内容为:

id||int||自增id[:inc(id,1)]
name||varchar(20)||学生名字
school||varchar(20)||学校名字[:enum(file://names.txt)]
nickname||varchar(20)||学生小名[:enum(鬼泣, 高小王子, 歌神, 逗比)]
age||int||学生年龄[:age]
class_num||int||班级人数[:int(10, 100)]
score||decimal(4,2)||成绩[:decimal(4,2,1)]
phone||bigint||电话号码[:phone_number]
email||varchar(64)||家庭网络邮箱[:email]
ip||varchar(32)||IP地址[:ipv4]
address||text||家庭地址[:address]

meta.txt文件中每行数据为元数据的一个字段描述,以||分割为三列,若以#开头,则忽略该行。

  • 第一列:字段名
  • 第二列:表字段类型
  • 第三列:字段注释,其中包含构造规则标识

name不加标记则会随机产生20字符内的字符串,可以加上改为:学生名字[:name]

其中学校名字[:enum(file://names.txt)]表示从本地文件names.txt中读取枚举数据,表示学校名称只能从下面这5所学校中随机产生。names.txt内容如下:

清华中学
人和中心
广东中学
猪场
旧大院
12345

后面将详细介绍构造规则说明

注意:meta.txt和names.txt需要放在同一个目录下,再运行datafaker命令 如果没有enum类型从文件读取数据,则不需要names.txt文件

3.从本地文件meta.txt中读取元数据,以,分隔符构造10条数据,打印在屏幕上

# 打印并不写进数据库
$ datafaker mysql mysql+mysqldb://root:admin@localhost:3306/job?charset=utf8 resume 10 --outprint --meta D:\File\Meta\meta.txt --outspliter ,,

1,,鲍红,,人和中心,,高小王子,,3,,81,,55.6,,13197453222,,mwei@gmail.com,,192.100.224.255,,江苏省西宁市梁平朱路I座 944204
2,,刘东,,清华中学,,高小王子,,3,,31,,52.4,,15206198472,,lili@kong.cn,,203.0.190.6,,内蒙古自治区嘉禾市兴山呼和浩特街E座 706421
3,,匡静,,人和中心,,歌神,,9,,84,,72.51,,18944398099,,zouchao@gmail.com,,203.1.53.166,,安徽省永安市沈河惠州街x座 345415
4,,王宇,,猪场,,逗比,,6,,89,,19.3,,18628114285,,na58@cai.net,,169.4.126.215,,山西省梧州县朝阳何路y座 846430
5,,陆桂芝,,猪场,,逗比,,8,,99,,92.22,,13304570255,,na55@ti.cn,,168.136.127.200,,江苏省英县徐汇尹街C座 908240
6,,顾阳,,猪场,,歌神,,9,,32,,43.14,,18025578420,,linping@pr.net,,174.50.222.39,,黑龍江省惠州县梁平大冶街Z座 611736
7,,杨洁,,人和中心,,鬼泣,,6,,35,,81.25,,13654306263,,minzhong@xiaxia.cn,,100.57.79.2,,湖北省琳市沙湾汪街V座 544660
8,,申璐,,人和中心,,鬼泣,,6,,14,,73.61,,13866020503,,changxiulan@chaoxia.cn,,198.248.254.56,,陕西省合山县东丽宁德街Q座 810017
9,,申强,,广东中学,,逗比,,7,,48,,90.65,,13915915013,,ysun@chao.cn,,169.210.122.39,,甘肃省冬梅县城北六安街Z座 619755
10,,李丹丹,,旧大院,,鬼泣,,3,,67,,87.63,,18899812516,,xiulanmo@qin.cn,,192.52.218.133,,湖南省宜都县萧山澳门街E座 791911
generated records : 10
printed records : 10
time used: 0.458 s
# 写入数据库
$ datafaker mysql mysql+mysqldb://root:admin@localhost:3306/jpa?charset=utf8 tb_resume 10 --meta D:\File\Meta\meta.txt
则将直接写入mysql中
解释:
mysql:数据库类型
mysql+mysqldb://root:admin@localhost:3306/test?charset=utf8:链接数据库的格式
	root:账号
	admin:密码
	localhost:ip
	3306:端口号
	test:数据库名称
	charset=utf8:编码格式
	tb_resume:表的名称
	10:生成几条数据
	--meta: 从本地读取生成规则
		D:\File\Meta\meta.txt: 规则文件的路径

若要再次运行,需要修改meta.txt文件中为id[:inc(id,11)]起始值为11或更大值,不然数据库会报主键重复错误。

构造规则优先级:


解析器将优先选择第三列的带规则标记的字段注释进行解析,如果不带标记,则选择第二列的字段类型进行解析。

这种好处是:

1)对应已经创建的数据表,用户可以用desc tablename 或者show full columns from tablename,将表shema查询复制下来,对用字段类型构造数据不满足的情况下,在注释里面进行打标机进行特殊处理

2)对于新表,在create table创建表时直接在注释里面打上标记。这种情况不用指定元数据文件。

四.命令行参数


datafaker参数包含4个必选参数和一些可选参数,如下表所示

参数名 含义 参数类型 是否必选 默认值 备注
dbtype 数据源类型 string 可选值为 rdb,mysql,hive, kafka, hbase, es, file
connect 数据源连接信息 string 关系型数据库和hive为 sqlachemy的连接串 kafka为broker连接串 file为文件路径 hbase为thrift host和端口
table 表名 string 将各种数据源操作单位都抽象为表,数据库中为表,kafka中为topic,file为文件名,hbase为表,es为索引和type,mongo为集合
num 数据条数 int 其中kafka必须为1
auth 账号密码 string 数据源的账号密码,以:分隔,例如 admin:12334
meta 元数据文件 string 若设定该参数,则忽略从数据源连接信息中读取远数据
interval 流数据产生间隔 float 1 单位秒
version 显示版本号 bool
outprint 是否在屏幕打印 bool false 若设置屏幕打印,则数据不会写文件或数据源
outspliter 数据字段分割符 string , 屏幕打印,保存文件有效
locale 语言类型 string zh_CN 支持多国语言,en_US, zh_CN
format 数据格式 string text kafka 默认为json
withheader 打印和存储到文件是否带表头 bool False
batch 每次批量写入数据源大小 int 1000
workers 生成测试数据的线程数 int 4

五.数据构造规则


1.数据库常用类型


这部分数据类型可以不用指定元数据文件

  • 数值类型 支持大部分标准SQL数值数据类型。 这些类型包括严格数值数据类型( int、integer、smallint、decimal和numeric),以及近似数值数据类型(float、real和double, precision)
  • 日期和时间类型 表示时间值的日期和时间类型为datetime、date、timestamp、time和year。
  • 字符串类型 字符串类型指char、varchar、binary、varbinary、blob、text、enum和set。

2.可变数据库类型


类型名 含义 默认值 备注
decimal(M,D, negative) M指定总的数据位数,D指定小数位数, negative指定正1负0 decimal(4, 2, 1)指定4位数,2位小数的正浮点数,如78.23
string(min, max) min, max 指定字符串位数范围
date(start, end) start, end 指定日期范围 如date(1990-01-01, 2019-12-12)
自增类型

inc(mark, start, step)

mark: 自增的变量名

start: 起始值, 默认值为1

step: 自增步长,默认值为1

inc(id)表示将当前列名为id的列,从1开始每次增长1, 可用于mysql的自增主键

inc(score, 100, 2)表示将当前列名为score的列,从100开始每次增长2

enum类型

enum类型表示随机从列表里随机选取一个对象,例如:

enum(2, 4, 5, 18) 表示每次从2,4,5,8这四个整数中随机选择一个

如果enum数组中只有一个对象,则表示从文件读取数据列表,每行一个对象:

enum(file://data.txt) 表示从当前目录的data.txt文件中读取列表。

enum类型可用来构造多表关联,比如两个表的某些字段都用同一个enum数据列表产生数据。

order_enum类型

与enum类型使用方法相同

不同在于,用于循环顺序产生枚举值。常用于相关联的多列产生值,例如一列为城市编码,一列为城市名,城市编码需要与城市名一一对应。关联的多列应该保持枚举值数量一致。

注意:由于多线程,不保证顺序严格按照枚举值列表顺序依次产生。但是能保证多相关列一一对应

详细请搜索查看issues

op类型

op类型表示从其他列中计算出值,例如:

op(c0+c3) 表示第一列值加上第四列值

op(c1*c4+c13) 表示第一列值乘上第五列值加上第十四列值

3.自定义扩展类型


address 地址
构造规则 含义 举例 备注
country 国家名 中国
province 省份 河南
city 城市名 郑州市
city_suffix 城市的后缀 市或县
address 地址 河北省巢湖县怀柔南宁路f座 169812
country_code 国家编码 AO
district 普陀
latitude 地理坐标(纬度) 68.0228435
longitude 地理坐标(经度) 155.964341
postcode 邮编 803511
street_address 街道地址 邯郸路W座
street_name 街道名 合肥路
street_suffix 街、路
数值类型

构造规则 含义 举例 备注
random_digit 0~9随机数 1
random_digit_not_null 1~9的随机数 9
random_element 随机字母 a
random_int 随机数字 44 可设置范围,可以通过设置min,max来设置,默认0~9999,例如random_int(1,100)
random_letter 随机字母 e
random_number 随机数字 参数digits设置生成的数字位数 例如random_number(2)生成2为数数字
boolean True/False False
numerify 三位随机数字 934
number 一定数位的数字 44322 number(digits=None, fix_len=0, positive=0)有三个参数,digits表示多少位数字,fix_len表示是否固定长度(1表示固定长度,否则为1到digits长度)positive表示是否为正数(1为正数,-1为负数,0正负都可能)。number(18, 1, 1) 产生18位数固定长度的正整数
公司

构造规则 含义 举例 备注
bs 公司服务名 transition open-source content
company 公司名(长) 天开信息有限公司
company_prefix 公司名(短) 浦华众城
company_suffix 公司性质 传媒有限公司
job 职位 项目执行/协调人员
信用卡、货币

构造规则 含义 举例 备注
credit_card_expire 信用卡到期日 05/19
credit_card_full 完整信用卡信息 JCB 16 digit 霞 张 3514193766205948 08/21CVC: 436
credit_card_number 信用卡号 3500011993590161
credit_card_provider 信用卡类型 American Express
credit_card_security_code 信用卡安全码 190
currency_code 货币编码 HNL
日期、时间

构造规则 含义 举例 备注
am_pm AM/PM AM
century 世纪 VII
date 随机日期 2014-05-18 date(start_date,end_date,format) start_date表示从当前日期往前推的天数,默认值为-30y,前30年, end_date表示从当前日期往后推的日期数,默认值为今天 format为日期格式,默认值为%Y-%m-%d 例如date(-30d, +20d, %Y.%m.%d)
date_between 指定范围内日期 1997-08-29 date_between(start_date,end_date,format) start_date表示开始日期,必填 end_date表示结束日期,必填 format为日期格式,默认值为%Y-%m-%d date_between(2017-01-01, 2019-12-02, %Y%m%d)
date_this_month 当前月份的日期 2019-03-13
date_this_year 今年内的日期 2019-03-09
date_time/datetime (1970年1月1日至今)时间 可不带参数datetime, 或者带参数datetime(0)随机时间, datetime(1,%Y-%m-%d %H:%M) 数据产生时间 2010-06-15 04:07 datetime(now,format)两个参数:now(0,1是否用当前时间, 默认为0表示随机事件,1为当前时间), format(时间格式 默认为%Y-%m-%d %H:%M:%S)
date_time_between 指定范围时间 2009-10-03 03:15:07 用法同dates
month 随机月份 05
month_name 随机月份(英文) December
time() 随机24小时时间 18:52:55
timezone 随机时区 Europe/Andorra
unix_time 随机Unix时间 203461583
timestamp 随机Unix时间 timestamp/timestamp(0) 随机时间戳, timestamp(1)当前数据产生时间戳 带一个参数 默认为0
year 随机年份 2017
internet

构造规则 含义 举例 备注
file_extension 文件扩展名 wav
file_name 文件名(包含扩展名,不包含路径) werwe.jpg
file_path 文件路径(包含文件名,扩展名) /home/
mime_type mime Type video/x-flv
company_email 公司邮箱 jieyan@14.cn
domain_name 域名 jq.cn
email 邮箱 kren@wei.cn
image_url 随机URL地址 https://www.lorempixel.com/470/178
ipv4 IP4地址 192.0.25.141
ipv6 IP6地址 206f:1ff0:374:2d5f:a6f8:69ef:4ba9:2d14
mac_address MAC地址 65:02:ed:82:c6:98
tld 网址域名后缀(.com,.net.cn,等等,不包括.) cn
uri URI地址 http://24.cn/
url URL地址 http://www.guiyinglei.cn/
user_name 用户名 ping51
user_agent 随机user_agent信息
chrome Chrome浏览器user_agent信息 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/5342 (KHTML, like Gecko) Chrome/27.0.819.0 Safari/5342
firefox FireFox浏览器user_agent信息
internet_explorer IE浏览器user_agent信息
opera Opera浏览器user_agent
safari Safari浏览器user_agent信息
linux_platform_token 随机Linux信息 X11; Linux i686
isbn10 随机ISBN(10位) 1-02-136461-4
isbn13 随机ISBN(13位) 978-0-15-215169-0
文本类型

构造规则 含义 举例 备注
paragraph 随机生成一个段落
sentence 随机生成一句话
text 随机生成一篇文章 不要幻想着人工智能了,至今没完全看懂一句话是什么意思
word 随机生成词语 hello
locale 随机生成语言/国际信息 niu_NZ 各国本地化编码
md5 随机生成MD5 fd80f4681258a9ecb329ab12782dfbba
password 随机生成密码 )we3JViVB1 可选参数:length:密码长度;special_chars:是否能使用特殊字符;digits:是否包含数字;upper_case:是否包含大写字母;lower_case:是否包含小写字母
sha1 随机SHA1 e9bb2fcd4b4089cc89c36636850ceafe779dbe58
sha256 随机SHA256 dd119cb2aec9b3d5557e56bb497757d42f82b32486ea92126942821d3b657957
uuid4 随机UUID 04aff886-8482-4069-9260-7917fd83982d
人物信息相关

构造规则 含义 举例 备注
name 全名 单玉珍
name_female 男性全名 官平
name_male 女性全名 许颖
first_name
last_name
first_name_female 女名
last_name_female 女姓
first_name_male 男名
last_name_male 男姓
age 人年龄 23 默认值 0-100
ssn 身份证号 350526193807198690
phone_number 手机号 13926798387
phonenumber_prefix 手机号段 157
profile 档案信息
simple_profile 简单档案信息 {‘username’: u’kcui’, ‘name’: u’\u5415\u67f3’, ‘birthdate’: datetime.date(1993, 3, 28), ‘sex’: ‘F’, ‘address’: u’\u9752\u6d77\u7701\u4e0a\u6d77\u53bf\u6881\u5e73\u5174\u5b89\u76df\u8defQ\u5ea7 532381’, ‘mail’: u’juanpan@hotmail.com’}
其他杂项

构造规则 含义 举例 备注
color_name 随机颜色名 Moccasin
hex_color 随机HEX颜色 #7f7cb6
rgb_color 随机RGB颜色 210,85,105
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐