1. 程式人生 > 其它 >Python | 如何通過faker批量生成“逼真”的測試資料

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