fasionchan

读万卷书,行万里路,品万味肴,撸万行码。

更优雅地造测试数据

| Comments

开发系统时,经常需要一些伪数据用于测试。举个例子,设计一个学生管理系统,测试注册功能,总需要一些用户信息吧。我猜大部分人都会填:用户aaaa,密码1111,手机号码1111……感觉略无追求~

那么有没有办法造一个看上是真的数据呢?肯定是有的——人是活的嘛~

自己造很累,有没有不需要大脑的方法的?还真有,这就是本文要介绍的一个Python模块——Faker

安装

其实,这节可以不必说,Python装包无非就pip嘛:

1
pip install Faker

快速入手

生成数据前需要先初始化一个生成器,有两种方式可以完成:①用faker.Factory.create();②用faker.Faker()

快速入手
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from faker import Factory
fake = Factory.create()

# OR
from faker import Faker
fake = Faker()

fake.name()
# 'Lucy Cechtelar'

fake.address()
# "426 Jordy Lodge# Cartwrightshire, SC 88120-6700"

fake.text()
# Sint velit eveniet. Rerum atque repellat voluptatem quia rerum. Numquam excepturi# beatae sint laudantium consequatur. Magni occaecati itaque sint et sit tempore. Nesciunt# amet quidem. Iusto deleniti cum autem ad quia aperiam.# A consectetur quos aliquam. In iste aliquid et aut similique suscipit. Consequatur qui# quaerat iste minus hic expedita. Consequuntur error magni et laboriosam. Aut aspernatur# voluptatem sit aliquam. Dolores voluptatum est.# Aut molestias et maxime. Fugit autem facilis quos vero. Eius quibusdam possimus est.# Ea quaerat et quisquam. Deleniti sunt quam. Adipisci consequatur id in occaecati.# Et sint et. Ut ducimus quod nemo ab voluptatum.

看看自动化的威力!批量生成,每次都是随机的哦!

批量生成
1
2
3
4
5
6
7
8
9
10
11
12
13
for _ in range(0, 10):
    print fake.name()

# Adaline Reichel
# Dr. Santa Prosacco DVM
# Noemy Vandervort V
# Lexi O'Conner
# Gracie Weber
# Roscoe Johns
# Emmett Lebsack
# Keegan Thiel
# Wellington Koelpin II
# Ms. Karley Kiehn V

本地化

你可能会说,这个玩意儿太洋气了——生成一堆英文名字地址啥的有毛用?确实,在计算机领域,英文有天生优势。

但是,重点来了——Faker还支持本地化,真是天地良心!一起来看看怎么生成中文信息吧:

本地化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from faker import Factory
fake = Factory.create('zh_CN')

for _ in range(0, 10):
    print fake.name()

# 於涛
# 万静
# 孙秀荣
# 丘辉
# 方玉
# 虞建国
# 丘丽丽
# 郭杨
# 江欣
# 狐龙

for _ in range(0, 10):
    print fake.address()

# 杰市戚路d座 855521
# 丽华市魏街e座 800775
# 坤市莘路P座 376919
# 秀云市温街s座 518607
# 晨市季街Z座 931186
# 丽市夹路N座 670627
# 坤市漆街k座 968075
# 瑞市於街z座 168689
# 金凤市雍路E座 148292
# 晨市黎路R座 916369

高级用法

功能扩展

Faker已经提供了足够丰富的信息生成,包括名字、手机号、邮箱地址、邮编等等。尽管如此,可能还是没有办法满足你的需求。这时,你可以自己动手,丰衣足食。下面,我们通过一个例子看看怎么扩展Faker的功能吧:

功能扩展
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from faker import Faker
fake = Faker()

# first, import a similar Provider or use the default one
from faker.providers import BaseProvider
# create new provider class
class MyProvider(BaseProvider):
    def foo(self):
        return 'bar'

# then add new provider to faker instance
fake.add_provider(MyProvider)

# now you can use:
fake.foo()
> 'bar'

随机控制

Faker随机生成由random.Random驱动。其中,.random属性返回random.Random对象。通过对该对象的操作,可以实现自定义的行为。

随机对象
1
2
3
4
from faker import Faker
fake = Faker()
fake.random
fake.random.getstate()

那么,可以实现什么自定义呢?举个例子,我们可以设置seedseed在随机数生成逻辑中什么作用,估计大家都清楚。比如,通过给定seed可以控制每次生成的内容都是一样的:

设置seed
1
2
3
4
5
from faker import Faker
fake = Faker()
faker.random.seed(4321)
print fake.name()
# Margaret Boehm

还有等价写法哦:

设置seed
1
2
3
4
5
from faker import Faker
fake = Faker()
fake.seed(4321)
print fake.name()
# Margaret Boehm

注意到,不同的两次运行,只要seed一样,生成出来的信息就是一样的。

命令行生成

有时想在shell或者其他程序中生成一些伪数据,是不是一定要写一个Python脚本呢?别急——Faker提供了一个命令行工具,估计可以应对大部分场景了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ faker address
968 Bahringer Garden Apt. 722Kristinaland, NJ 09890

$ faker -l de_DE address
Samira-Niemeier-Allee 5694812 Biedenkopf

$ faker profile ssn,birthdate
{'ssn': u'628-10-1085', 'birthdate': '2008-03-29'}

$ faker -r=3 -s=";" name
Willam Kertzmann;
Josiah Maggio;
Gayla Schmitt;

$ faker -h
usage: faker [-h] [--version] [-o output] [-l LOCALE] [-r REPEAT] [-s SEP]
             [-i [INCLUDE [INCLUDE ...]]]
             [fake] [fake argument [fake argument ...]]
...

Comments