• Python好酷|数据生成工具Faker


    软件质量保障

    专注于测试圈:测试质量保障、自动化工具/框架、平台开发、算法测试、BAT/TMD大厂测试岗面试题/面经分享、测试团队建设与管理、测试新技术的分享。 偶尔也聊聊个人工作的收获与经验。可以帮忙内推字节、阿里、百度等大厂。

    接口测试需要依赖大量的测试数据,因此测试用例数据构造是个老生常谈的话题。通常我们在非自动化测试过程都是随机想一条数据,而自动化测试测试则不行,因为自动化测试对测试数据有一定的约束,例如某些字段不能写死,某些整型字段不能重复等,所以我们在利用接口测试工具(jmeter、postman)写自动化测试用例过程,往往会自己开发随机数、字符串生成的工具。而在自研的接口测试框架中,我们则可以使用数据Fake工具。

    下面介绍下Python栈下数据Fake库:Faker,一个虚拟数据生成Python库。

    关于版本:

    从4.0.0版本开始,Faker不再支持 Python 2;

    从5.0.0版本开始 只支持 Python 3.6 及更高版本。

    对于Python 2,需要安装3.0.1版本。

    用法

    1.faker.Faker()

    使用faker.Faker()创建并初始化一个 faker generator,它可以为你想要的数据类型生成数据。

    from faker import Faker
    fake = Faker()
    
    fake.name()
    # 'Lucy Cechtelar'
    
    fake.address()
    # '426 Jordy Lodge
    #  Cartwrightshire, SC 88120-6700'
    
    fake.text()

    faker 将faker.Generator.method_name()调用转发给faker.Generator.format(method_name),每次调用fake.name() 都会随机生成一条新数据。

    for _ in range(10):
      print(fake.name())
    
    Charles Washington
    Joseph Williams PhD
    Thomas Mitchell
    Zachary Clark
    Joanna Fisher
    Kelly Moore
    Laura Salazar
    Shawn Harris
    Tiffany Lopez
    Christopher Gibson

    2.Pytest fixtures

    Faker也有自己的pytest插件,可以让开发者在测试中使用的faker fixture。

    3.Providers

    每个生成器属性(如name、address和 lorem)被称为“fake”。一个faker生成器包含很多属性,被打包在“providers”中。例如添加internet属性,生成一个IP地址。

    from faker import Faker
    from faker.providers import internet
    
    fake = Faker()
    fake.add_provider(internet)
    
    print(fake.ipv4_private())
    
    # 192.168.208.8

    4.支持本地化

    faker.Faker可以将语言环境作为参数,以返回本地化数据。如果没有找到本地化的提供者,faker会默认en_US 语言环境的数据。此外,faker还支持多本地化属性配置。

    from faker import Faker
    fake = Faker(['it_IT', 'en_US', 'zh_CN'])
    for _ in range(10):
        print(fake.name())

    5.命令行使用

    安装好faker,也可以使用命令行生成数据。

    faker [-h] [--version] [-o output]
          [-l {bg_BG,cs_CZ,...,zh_CN,zh_TW}]
          [-r REPEAT] [-s SEP]
          [-i {package.containing.custom_provider otherpkg.containing.custom_provider}]
          [fake] [fake argument [fake argument ...]]

    参数解释:

    • -h , --help : 显示帮助信息

    • --version : 显示程序的版本号

    • -o FILENAME : 将输出重定向到指定的文件名

    • -l {bg_BG,cs_CZ,...,zh_CN,zh_TW}:允许使用本地化提供程序

    • -r REPEAT : 将生成指定数量的输出

    • -s SEP : 将在每次生成输出后生成指定的分隔符

    • -i {my.custom_provider other.custom_provider}要使用的其他自定义提供程序列表。

    • fake:生成输出的名称,例如 name、address或text

    • [fake argument ...] : 传递给 fake 的可选参数(例如,profile fake 将可选的逗号分隔字段名称列表作为第一个参数)

    例子:

    rain@raindeMac-mini ~ % faker address
    山西省关岭市静安史路K座 704149
    rain@raindeMac-mini ~ % faker profile ssn,birthdate
    {'ssn': '211303193906241855', 'birthdate': datetime.date(2000, 8, 4)}
    rain@raindeMac-mini ~ % faker -r=3 -s=";" name
    阎淑珍;
    李鑫;
    潘兵;

    可以看到,使用命令行默认会生成本地化数据。

    6.如何创建Provider

    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'

    7.生成句子

    faker支持生成句子,也可以自定义基础词语,通过组合生成句子。

    from faker import Faker
    fake = Faker()
    
    my_word_list = [
    'danish','cheesecake','sugar',
    'Lollipop','wafer','Gummies',
    'sesame','Jelly','beans',
    'pie','bar','Ice','oat' ]
    
    fake.sentence()
    # 'Result cell our politics culture impact player.'
    
    fake.sentence(ext_word_list=my_word_list)
    # 'Cheesecake pie pie Jelly cheesecake.'

    8.如何结合Factory Boy一起使用

    Factory Boy已经与Faker集成。只需使用factory_boy的factory.Faker方法即可:

    import factory
    from myapp.models import Book
    
    class BookFactory(factory.Factory):
        class Meta:
            model = Book
    
        title = factory.Faker('sentence', nb_words=4)
        author_name = factory.Faker('name')

    9.生成唯一值

    通过在生成器上使用.unique属性,可以确保任何一次生成的值都是唯一的。这个可以很好解决文章开头提到的测试数据重复性问题。

    from faker import Faker
    fake = Faker()
    names = [fake.unique.first_name() for i in range(500)]
    assert len(set(names)) == len(names)

    10.seed()方法

    开发者使用 Faker 进行单元测试时,也有需求每次生成相同的数据集。为方便起见,faker还提供了一个seed()方法,它为共享随机数生成器提供seed。使用相同版本的faker 和 seed 调用相同的方法会产生相同的结果。

    from faker import Faker
    fake = Faker()
    for _ in range(3):
        Faker.seed(4321)
        print(fake.name())
        
    # Jason Brown
    Jason Brown
    Jason Brown

    当然,也可以使用seed_instance()方法达到相同的效果。例如:

    from faker import Faker
    fake = Faker()
    fake.seed_instance(4321)
    
    print(fake.name())
    # 'Jason Brown'

    往期推荐:

    Python好酷|抓包神器-mitmproxy

    Python好酷|allpairspy一款高效的正交实验法生成用例工具

    Python好酷|Python好酷之Pyecharts

  • 相关阅读:
    学习WWDC的好资源!
    运行 CMD 时,參数加引號常见问题
    FileChannel的深入理解
    C#单例模式的三种写法
    Linux 安装Nginx具体图解教程
    计网面试题
    VS:"64位调试操作花费的时间比预期要长"的一解决途径
    中小型WEB系统权限日志数据表设计
    CDN服务上线,DNSPOD布局云端生态圈
    怎样利用ash监控会话
  • 原文地址:https://www.cnblogs.com/iloverain/p/16515141.html
Copyright © 2020-2023  润新知