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