更优雅地造测试数据

作者: fasionchan | 来源:发表于2016-12-11 09:57 被阅读427次

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

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

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

    安装

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

    pip install Faker
    

    快速入手

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

    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.
    

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

    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还支持本地化,真是天地良心!一起来看看怎么生成中文信息吧:

    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的功能吧:

    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对象。通过对该对象的操作,可以实现自定义的行为。

    from faker import Faker
    fake = Faker()
    fake.random
    fake.random.getstate()
    

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

    from faker import Faker
    fake = Faker()
    faker.random.seed(4321)
    print fake.name()
    # Margaret Boehm
    

    还有等价写法哦:

    from faker import Faker
    fake = Faker()
    fake.seed(4321)
    print fake.name()
    # Margaret Boehm
    

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

    命令行生成

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

    $ 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 ...]]
    ...
    

    相关文章

      网友评论

      本文标题:更优雅地造测试数据

      本文链接:https://www.haomeiwen.com/subject/hacymttx.html