前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >1.faker.Faker()

1.faker.Faker()

作者头像
互联网金融打杂
发布2022-08-01 15:20:14
3930
发布2022-08-01 15:20:14
举报

软件质量保障 专注于测试圈:测试质量保障、自动化工具/框架、平台开发、算法测试、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,它可以为你想要的数据类型生成数据。

代码语言:javascript
复制
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() 都会随机生成一条新数据。

代码语言:javascript
复制
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地址。

代码语言:javascript
复制
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还支持多本地化属性配置。

代码语言:javascript
复制
from faker import Faker
fake = Faker(['it_IT', 'en_US', 'zh_CN'])
for _ in range(10):
    print(fake.name())

5.命令行使用

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

代码语言:javascript
复制
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 将可选的逗号分隔字段名称列表作为第一个参数)

例子:

代码语言:javascript
复制
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

代码语言:javascript
复制
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支持生成句子,也可以自定义基础词语,通过组合生成句子。

代码语言:javascript
复制
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方法即可:

代码语言:javascript
复制
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属性,可以确保任何一次生成的值都是唯一的。这个可以很好解决文章开头提到的测试数据重复性问题。

代码语言:javascript
复制
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 调用相同的方法会产生相同的结果。

代码语言:javascript
复制
from faker import Faker
fake = Faker()
for _ in range(3):
    Faker.seed(4321)
    print(fake.name())
    
# Jason Brown
Jason Brown
Jason Brown

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

代码语言:javascript
复制
from faker import Faker
fake = Faker()
fake.seed_instance(4321)

print(fake.name())
# 'Jason Brown'
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-07-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 用法
    • 1.faker.Faker()
      • 2.Pytest fixtures
        • 3.Providers
          • 4.支持本地化
            • 5.命令行使用
              • 6.如何创建Provider
                • 7.生成句子
                  • 8.如何结合Factory Boy一起使用
                    • 9.生成唯一值
                      • 10.seed()方法
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档