利用Faker生成常用的測試數據


最近發現一個能夠任意生成各種數據的python庫:faker,可以借助它來生成各種數據,例如姓名、地名、日期、電話號碼等(各種有意義、無意義的假數據)

git地址:https://github.com/joke2k/faker

文檔:https://faker.readthedocs.io/en/stable/

本文將簡單介紹一下我在實際工作中的一些應用

1、生成手機號碼

import faker

fake = faker.Faker(locale='zh_CN')  # 初始化,指定生成中文格式數據
phone = fake.phone_number()  # 生成一條電話號碼

每次執行時都會生成一個新的電話號碼

如果想一次生成多條, 可以借助for循環

import faker

fake = faker.Faker(locale='zh_CN')
phones = [fake.phone_number() for _ in range(5)]  # 列表推導,把生成的數據組成一個列表
print(phones)

結果:
['14589888619', '13107540315', '15341290420', '13915229439', '13591304092']
import faker

fake = faker.Faker(locale='zh_CN')

for _ in range(5):  # 借助for循環
    phone = fake.phone_number()
    print(phone)

結果:
15219917682
14511308981
18819869885
18220361555
18591857341

2、生成人名

通過 fake.name() 隨機生成一個人名

效果如下

>>> from faker import Faker
>>> fake = Faker()
>>> fake = Faker(locale='zh_CN')
>>> fake.name()
'陳飛'
>>> fake.name()
'陳楊'

嗯...還挺像回事的

如果在平時測試過程中比如遇到補全個人信息之類的功能,可以用這個來隨機生成一個名字,省的自己去想了

並且在寫一些造數腳本時,也可以給那種名稱參數傳入這種隨機值,省時省力,還不重樣

3、生成身份證號

測試過程中,有些測試數據可能會涉及到輸入身份證號,利用 fake.ssn() 即可生成一個隨機的身份證ID

import faker

fake = faker.Faker(locale='zh_CN')

identity_id = fake.ssn()
print(identity_id)

結果:
511623199003268061

identity_ids = [fake.ssn() for i in range(5)]  # 生成多個
print(identity_ids)

結果:
['140108198905080513', '532325199712279418', '370601193711292094', '610526199905267515', '652101194803155106']

4、生成數字

 faker也提供了一些方法來生成隨機數

1、fake.numerify(),生成3位隨機數字
>>> fake.numerify()
'531'

2、random_digit(),生成0~9之間的隨機數
>>> fake.random_digit()
6
3、random_digit_not_null(),生成1~9之間的隨機數 >>> fake.random_digit_not_null() 5
4、random_int(),默認0~9999,可以通過設置min, max來設置數值范圍 >>> fake.random_int() 8388 >>> fake.random_int(100, 200) 113

5、生成日期

同樣faker也可以生成隨機日期、時間等,下面列舉幾個常用的

(1)fake.date(),生成一個隨機日期字符串

import faker

fake = faker.Faker(locale='zh_CN')

random_date1 = fake.date(pattern='%Y-%m-%d', end_datetime=None)  # 生成一個隨機日期(格式為日期字符串),end_datetime參數限制最大日期
print(random_date1)
print(type(random_date1))

結果:
2004-10-19
<class 'str'>

可以看到,生成是日期字符串

end_datetime 參數可以限制日期的最大范圍,它可以接收date對象,如下
import faker

fake = faker.Faker(locale='zh_CN')

from datetime import date

random_date2 = fake.date(pattern='%Y-%m-%d', end_datetime=date(1980, 12, 20))  # end_datetime設置為1980年12月20日
print(random_date2)

結果:
1974-04-03

(2)fake.date_between()生成一個指定范圍的日期

通過查看源碼可以發現,默認生成的是30年前至今天的一個隨機日期

源碼如下:

 date_start和date_end傳入不同參數值對應的結果 

1、
random_date1 = fake.date_between(start_date=date(1970, 12, 20), end_date=date(1970, 12, 25))  # 取1970年12月20至1970年12月25之間的1天
print(random_date1)
結果:
1970-12-20

2、
random_date2 = fake.date_between(start_date='-30y', end_date='today')
# -1y, 表示相對於end_date,往前推1年
# -1M, 表示相對於end_date,往前推1個月
# -5d, 表示相對於end_date,往前推5天
# today, 表示今天

結果:
2017-11-27
print(type(random_date2))
結果:
<class 'datetime.date'>
random_date3 = fake.date_between(start_date='today', end_date='+5d')
# +5d, 表示相對於start_date,往后推5d

(3) fake.date_this_month(),生成本月中的一天

它有2個參數,before_today和after_today,默認情況下 before_today=True, after_today=False

意思是獲取當月今天之前的日期

可以通過修改兩個參數的布爾值,獲取本月今天之前或者今天之后的日期

random_date = fake.date_this_month()
print(random_date)
print(type(random_date))

結果:
2021-06-03
<class 'datetime.date'>

fake.date_this_month(before_today=True, after_today=False)

簡單試了一下,發現

before_today=True, after_today=False時,可以得到今天之前的日期(不包含今天)
before_today=True, after_today=True時,可以得到本月的任意一天(包含今天)
before_today=False, after_today=True時,可以得到今天之后的日期(包含今天)
before_today=False, after_today=False時,獲取今天的日期  

(4)fake.date_this_year()獲取今年的某一天

用法參考fake.date_this_month(),也是包含 before_today和after_today2個參數

 

如果生成一批數據中有重復的該怎么辦?

可以借助set()去重

phones = [fake.phone_number() for _ in range(5)]
phones_new = list(set(phones))  # 先使用set去重,再通過list方法轉為列表(是否再轉換為列表,看個人需要)

 還有很多用法,可以參考:
https://www.jianshu.com/p/6bd6869631d9

https://zhuanlan.zhihu.com/p/87203290

或者查看源碼,一般各種方法的源碼路徑在"faker/providers"下

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM