Python | 如何通过faker批量生成“逼真”的测试数据

我们在项目中,常常需要使用一些假数据来做测试,比如客户名、电话号码、街道地址等等,平时我们基本是键盘一顿乱敲,或者随便造个什么字符串出来。

现在你不用这样做了,用Faker就能满足你的一切需求。

本文将结合实例,讲述Python 如何通过faker第三方库,批量伪造数据。包含两种保存方式:1,存入Excel;2,存入mysql数据库。

 

本文框架结构为:

1、faker简介

2、faker使用

3、常用方法一览

4、实例:批量生成测试数据

 

1、faker简介

faker是python的一个第三方库,是一个github上的开源项目。

主要用于测试时伪造数据。

官方文档:https://faker.readthedocs.io/en/master/index.html

 

2、 faker如何使用

1)安装

Faker库已经被提交到 pip,可以通过 pip 工具直接安装。

1 pip install Faker

 

2)导入模块

1 from faker import Faker

*主要使用的是Factory类,而导入Faker,会同时导入Factory

 

 

3)使用步骤:

·初始化:

1 fake = Faker()

Faker()调用的是Factory的create方法,常用参数选项:

 

 

参数 locale:

为生成数据的文化选项(语种),默认为 en_US,只有使用了相关文化,才能生成相对应的随机信息,zh-CN代表使用中国版。

更多国家版本,可以参考:

https://faker.readthedocs.io/en/master/index.html#localization

 

参数providers:

是一个包含了多种生成随机数据的生成器的“提供者”,比如包含了生成随机姓名的生成器,包含了随机地址的生成器。如果我们想要自己定义随机生成的数据的规则,那么我们需要自定义providers。

如何生成一个providers,可以参考:

https://faker.readthedocs.io/en/master/index.html#how-to-create-a-provider

 

 

·调用方法:

利用Faker对象调用方法,调用方法的返回值就是随机的数据。

 

接下来,我们使用最简单的例子来生成几个假数据试试:

1 from faker import Faker
2 
3 fake = Faker(locale='zh_CN')
4 
5 print('姓名:', fake.name())
6 print('地址:', fake.address())
7 print('电话号码:', fake.phone_number())

 

解析:

# 1、从faker模块导入Faker这个类。

# 2、实例化,保存到变量fake中。

# 3、调用name()方法随机生成一个名字。

# 4、调用address()方法随机生成地址信息。

# 5、调用phone_number()方法随机生成电话号码。

 

运行结果如下:

姓名: 杨佳

地址: 陕西省西安市涪城沈路l座 317980

电话号码: 15025821562

 

3、 常用方法一览

由于主要使用中文数据,所以本文提供常见的方法示例是中文的。

详见官方文档:https://faker.readthedocs.io/en/master/locales/zh_CN.html

 

地址信息类:

fake.address():完整地址,比如北京市东城区东华门街道p座 100006

fake.street_address():街道+地址,比如兴城路A座

fake.street_name():街道名,比如宜都街

fake.city_name():城市名,比如兰州

fake.city():城市,比如兰州市

fake.province():省份名,比如陕西省

fake.postcode():邮编

fake.country():国家

 

公司信息类:

fake.company():公司名,比如惠派国际公司信息有限公司

fake.company_suffix():公司名后缀(公司性质),比如网络有限公司

fake.company_prefix():公司名前缀,比如鑫博腾飞

 

日期类:

fake.date(pattern=”%Y-%m-%d”, end_datetime=None) :随机日期

fake.year():随机年份

fake.day_of_week():随机星期数

fake.time(pattern=”%H:%M:%S”, end_datetime=None):随机时间

 

网络类:

fake.company_email():企业邮箱

fake.email():邮箱

 

个人信息类:

fake.name():姓名

fake.last_name(): 姓

fake.first_name(): 名

fake.name_male(): 男性姓名

fake.last_name_male(): 男性姓

fake.first_name_male(): 男性名

fake.name_female(): 女性姓名

fake.user_name(*args, **kwargs):用户名,只是随机的英文姓名组合,一般是6位

fake.password():密码

fake.simple_profile(sex=None):简略个人信息,包括用户名,姓名,性别,地址,邮箱,出生日期。

fake.profile(fields=None, sex=None):详略个人信息,比简略个人信息多出公司名、血型、工作、位置、域名等等信息。

 

工作职位类:

fake.job():工作

 

电话号码类:

fake.phone_number ():手机号码

fake.phonenumber_prefix():运营商号段,手机号码前三位

 

社会安全码(身份证)类:

fake.ssn():身份证号(18位)

 

银行卡类

fake.credit_card_number(card_type=None) :卡号

fake.credit_card_provider(card_type=None) :卡的提供者

fake.credit_card_security_code(card_type=None) :卡的安全密码

fake.credit_card_expire():卡的有效期

fake.credit_card_full(card_type=None) :完整卡信息

 

4、实例:批量生成测试数据

1)数据保存到Excel:

 

实现步骤:

(1)通过openpyxl打开Excel

(2)获取Excel的所有sheet页

(3)通过fake生成数据,写入单元格

(4)保存Excel

 

代码:

 1 from faker import Faker
 2 from openpyxl import load_workbook
 3 
 4 # 1、从faker模块导入Faker这个类。
 5 # 2、实例化,保存到变量fake中。
 6 # 3、调用name()方法随机生成一个名字。
 7 # 4、调用address()方法随机生成地址信息。
 8 
 9 
10 fake = Faker(locale='zh_CN')
11 
12 wb = load_workbook("1.xlsx")
13 
14 for sheetName in wb.sheetnames:
15     sheet = wb[sheetName]
16     for rownum in range(2, 100):
17         sheet.cell(row=rownum, column=1).value = fake.name()
18         sheet.cell(row=rownum, column=2).value = fake.address()
19         sheet.cell(row=rownum, column=3).value = fake.phone_number()
20         sheet.cell(row=rownum, column=4).value = fake.ssn(min_age=18, max_age=18)
21 
22 wb.save("1.xlsx")

 

运行结果如下:

 

 

2)数据保存到mysql数据库:

 

实现步骤:

(1)通过pymysql连接数据库

(2)创建数据表

(3)通过fake生成数据,并形成sql语句

(4)通过pymysql执行插入语句

 

代码:

 1 from faker import Faker
 2 
 3 import pymysql
 4 
 5  
 6 
 7 conn = pymysql.connect(host="xx.xxx.xxx.xx", port=3306, user="xxx", password="xxx", db="xx", charset="utf8")
 8 
 9  
10 
11 cursor = conn.cursor()
12 
13 # 这里给出表结构,如果使用已存在的表,可以不创建表。
14 
15 sql = """
16 
17 create table user(
18 
19 id int PRIMARY KEY auto_increment,
20 
21 username VARCHAR(20),
22 
23 password VARCHAR(20),
24 
25 address VARCHAR(35),
26 
27 tel VARCHAR(20),
28 
29 ssn VARCHAR(20)
30 
31 )
32 
33 """
34 
35 cursor.execute(sql)
36 
37  
38 
39 fake = Faker("zh-CN")
40 
41 for i in range(20):
42 
43     sql = """insert into user(username,password,address,tel,ssn)
44 
45   values('%s','%s','%s','%s','%s')""" \
46 
47           % (fake.user_name(), fake.password(special_chars=False), fake.address(), fake.phone_number(), fake.ssn(min_age=18, max_age=88, gender="M"))
48 
49     cursor.execute(sql)
50 
51  
52 
53 conn.commit()
54 
55 cursor.close()
56 
57 conn.close()

 

运行结果如下:

 

 

PS:不知道细心的你,有没有发现地址看起来怪怪的啊。

是的,虽然数据看起来还挺逼真的,但是这并不是真实的地址,而是将省、市、街道之类的随机组合在一起的。

 

原因在于,address的源代码中,并没有维护它们的对应关系,而且有些市或区县是随便写的。有兴趣的,可以看下源代码,路径参照:

D:\Python\Python37\Lib\site-packages\faker\providers\address\zh_CN

 

posted @ 2021-06-18 14:14  慧杰Jessie  阅读(1835)  评论(0)    收藏  举报