1.faker.Faker()

2022-08-01 15:20:14 浏览数 (1)

软件质量保障 专注于测试圈:测试质量保障、自动化工具/框架、平台开发、算法测试、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'

0 人点赞