数据工厂 - Faker
2019-04-17 本文已影响0人
halfempty
前言
无论是性能测试, 还是大数据的测试, 甚至基本的功能测试, 造数据都是一件棘手的事
抛开数据间的关联关系不谈, 各种类型的数据长短不一, 格式不一, 单纯的复制粘贴不利于识别, 也不符合一般的数据场景
有幸得知Faker模块, 解决了大部分的数据构造问题
使用
语法特别简单, 学习参考: https://faker.readthedocs.io/en/master/index.html
from faker import Faker
fake = Faker(locale='zh-CN')
print(
fake.email(),
fake.domain_name(),
fake.hostname(),
fake.url(),
fake.ipv4(),
fake.ipv6(),
fake.mac_address(),
fake.name(),
fake.province(),
fake.address(),
fake.phone_number(),
fake.job(),
sep='\n'
)
----------------------------
sunwei@ox.cn
jie.cn
desktop-52.zhong.cn
https://www.qiangna.cn/
96.147.217.87
a3b5:3ca6:21d:2cf7:a61f:ae69:145b:74d7
5c:87:ba:89:dd:ac
蒋建
山西省
湖南省建市沈北新深圳街a座 238009
18770641692
硬件工程师
深入理解
构造数据的思路大体相似, 采用随机方式
- 模板数据, 通过正则将模板中的占位符替换成数字/字母等
- 约束数据, 如省/市, 域名后缀等, 预置列表
各类数据通过不同的provider
实现, provider
定义数据模板和具体实现
内置provider有address, color, compnay, internet, person, geo, user_agent
等, 不过并不是所有类型都适用于zh_CN
我们看一下如何生成姓名
-
person
基类
class Provider(BaseProvider):
formats = ['{{first_name}} {{last_name}}']
first_names = ['John', 'Jane']
last_names = ['Doe']
def name(self):
"""
:example 'John Doe'
"""
pattern = self.random_element(self.formats)
return self.generator.parse(pattern)
....
- 中文下的
person
继承基类, 并override
class Provider(PersonProvider):
formats = ["{{last_name}}{{first_name}}"]
first_names_male = [
"伟", "强", "磊", "洋", "勇", "军", "杰", "涛", "超", "明", "刚", "平", "辉", "鹏", "华", "飞",
"鑫", "波", "斌", "宇", "浩", "凯", "健", "俊", "帆", "帅", "旭", "宁", "龙", "林", "欢", "佳",
"阳", "建华", "亮", "成", "建", "峰", "建国", "建军", "晨", "瑞", "志强", "兵", "雷", "东", "博",
"彬", "坤", "想", "岩", "杨", "文", "利", "楠", "红霞", "建平",
]
first_names_female = [
"芳", "娜", "敏", "静", "秀英", "丽", "艳", "娟", "霞", "秀兰", "燕", "玲", "桂英", "丹", "萍",
"红", "玉兰", "桂兰", "英", "梅", "莉", "秀珍", "婷", "玉梅", "玉珍", "凤英", "晶", "玉英", "颖",
"雪", "慧", "红梅", "倩", "琴", "兰英", "畅", "云", "洁", "柳", "淑珍", "春梅", "海燕", "冬梅",
"秀荣", "桂珍", "莹", "秀云", "桂荣", "秀梅", "丽娟", "婷婷", "玉华", "琳", "雪梅", "淑兰", "丽丽",
"玉", "秀芳", "欣", "淑英", "桂芳", "丽华", "丹丹", "桂香", "淑华", "荣", "秀华", "桂芝", "小红",
"金凤", "瑜", "桂花", "璐", "凤兰",
]
first_names = first_names_male + first_names_female
...
看以看到formats
定义了姓名的格式, 属性由一系列样本数据构成, 通过随机方式获取, 格式中的占位符(last_name, first_name)则通过正则表达式完成替换