zl程序教程

您现在的位置是:首页 >  其它

当前栏目

利用Faker生成常用的测试数据

利用 常用 生成 测试数据
2023-09-11 14:21:25 时间

最近发现一个能够任意生成各种数据的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"下