欢迎关注公众号 学习资料不会少
在做功能测试或者自动化测试过程中,准备的数据常常会因为数据库中已有存在的数据而出来运行异常的情况。
举个例子,再测试注册用户的使用,会准备一个正确的测试数据,比如下面
username | password | repsass | expect |
user1 | 123456 | 123456 | 成功 |
如果系统中已经存在测试用户user1,那么再次注册就会发现user1不能成功注册。针对这种场景,普遍的做法是在自动化脚本执行之前把原来的用户user1 删掉。但是这种做法可能要涉及到数据库的相关操作,是比较麻烦也是比较危险的。
比较理想的一种操作是每次注册用户时都使用一个随机的用户名,并且保证每次随机的值都不一样,这样数据库中不会存在相同的用户名,就不会出现上述问题。
要想实现这样的操作,一种操作方式使用第三方库比如 python的 faker。
主要内容
● faker自动生成测试数据
faker 使用
faker是python的一个第三方库,能够帮你自动模拟一些假数据。
https://faker.readthedocs.io/en/master/
01
安装
Law
pip install Faker
02
基本使用
Law
from faker import Faker
f = Faker()
# 随机生成姓名
print(f.name()
)# 随机生成地址
print(f.address())
# 随机生成email
print(f.email())
# 随机生成password
print(f.password())
# 随机生成一段文本
print(f.text())
输出
Ryan Lee
0018 Victor Mills
Brewerberg, RI 59924
karen59@gmail.com
3Iqq20KuK%
Keep have well year thousand science. Close drop father list behind hand. Time he themselves break more.
每次生成的数据都是不一样的。可以写一个for循环来查看数据
for _ in range(10):
print(f.name())
输出
Daniel Palmer
Amanda Park
Stephanie Willis
Daniel Kerr
Shannon Boone
John Smith
Geoffrey Gibson
Eric Newman
Nicolas Gordon
Laura Jones
03
设置地域语言
Law
默认faker出来的数据是英语,如果数据有地域限制,比如要使用的语言为中文,通过设置地域更改文本语言。
支持的语言列表如下:
ar_EG - Arabic (Egypt)
ar_PS - Arabic (Palestine)
ar_SA - Arabic (Saudi Arabia)
bg_BG - Bulgarian
bs_BA - Bosnian
cs_CZ - Czech
de_DE - German
dk_DK - Danish
el_GR - Greek
en_AU - English (Australia)
en_CA - English (Canada)
en_GB - English (Great Britain)
en_NZ - English (New Zealand)
en_US - English (United States)
es_ES - Spanish (Spain)
es_MX - Spanish (Mexico)
et_EE - Estonian
fa_IR - Persian (Iran)
fi_FI - Finnish
fr_FR - French
hi_IN - Hindi
hr_HR - Croatian
hu_HU - Hungarian
hy_AM - Armenian
it_IT - Italian
ja_JP - Japanese
ka_GE - Georgian (Georgia)
ko_KR - Korean
lt_LT - Lithuanian
lv_LV - Latvian
ne_NP - Nepali
nl_NL - Dutch (Netherlands)
no_NO - Norwegian
pl_PL - Polish
pt_BR - Portuguese (Brazil)
pt_PT - Portuguese (Portugal)
ro_RO - Romanian
ru_RU - Russian
sl_SI - Slovene
sv_SE - Swedish
tr_TR - Turkish
uk_UA - Ukrainian
zh_CN - Chinese (China)
zh_TW - Chinese (Taiwan)
使用中文,则可以设置
from faker import Faker
# 设置中文
f = Faker("zh_CN")
print(f.name())
Provider
faker 库在设计上,为了解耦,将 Provider 对象做成了 Faker 对象的”插件“。Faker 可以添加一个个 Provider 对象,Provider 对象为 Faker 对象提供了生成某项数据的核心实现。就相当于 Faker 对象是一个生成器,它的生成功能依赖于什么呢?依赖于 Provider,是 Provider 提供给了 Faker 对象生成某项数据的能力。
正是因为 Faker 对象内置了一些 Provider 对象,Faker 对象才可以生成刚才所要求的姓名、地址和文本。
from faker import Faker
faker = Faker('zh_CN')
# 查看内置Provider
print(faker.providers)
输出
[, , <
原来我们调用的方法就是 Faker 对象调用的 Provider 里面的对应方法,比如 name 就是 faker.providers.person.zhCN.Provider 里面的 name 方法,二者是一致的,我们扒一扒源码验证下,源码在:https://github.com/joke2k/faker/blob/master/faker/providers/person/__init__.py 里面定义了name 方法,然后 Faker 动态地将这个方法引入进来了,就可以使用了。
from faker import Faker
fake = Faker("zh_CN")
print(fake.last_name())
print(fake.first_name())
print(fake.name_male())
更多支持的模拟假数据地址
https://faker.readthedocs.io/en/stable/providers/faker.providers.address.html
Address
Address,用于生成一些和地址相关的数据,如地址、城市、邮政编码、街道等内容, 用法如下:
faker.address()
# '新疆维吾尔自治区杰县南湖武汉街D座 253105'
faker.building_number()
# 'B座'
faker.city()
# '璐县'
faker.city_name()
# '贵阳'
faker.city_suffix()
# '县'
faker.country()
# '阿拉斯加'
faker.country_code(representation="alpha-2")
# 'CR'
faker.district()
# '西峰'
faker.postcode()
# '726749'
faker.province()
# '福建省'
faker.street_address()
# '余路N座'
faker.street_name()
# '李路'faker.street_suffix()# '路'
Color
用于生成和颜色相关的数据,如 HEX、RGB、RGBA 等格式的颜色,用法如下:
faker.color_name()
# 'DarkKhaki'
faker.hex_color()
# '#97d14e'
faker.rgb_color()
# '107,179,51'
faker.rgb_css_color()
# 'rgb(20,46,70)'
faker.safe_color_name()
# 'navy'
faker.safe_hex_color()
# '#dd2200'
Company
用于生成公司相关数据,如公司名、公司前缀、公司后缀等内容,用法如下:
faker.bs()
# 'grow rich initiatives'
faker.catch_phrase()
# 'Self-enabling encompassing function'
faker.company()
# '恒聪百汇网络有限公司'
faker.company_prefix()
# '晖来计算机'
faker.company_suffix()
# '信息有限公司'
Credit Card
Credit Card,用于生成信用卡相关数据,如过期时间、银行卡号、安全码等内容,用法如下:
faker.credit_card_expire(start="now", end="+10y", date_format="%m/%y")
# '08/20'
faker.credit_card_full(card_type=None)
# 'Mastercardn玉兰 范n5183689713096897 01/25nCVV: 012n'
faker.credit_card_number(card_type=None)
# '4009911097184929918'
faker.credit_card_provider(card_type=None)
# 'JCB 15 digit
'faker.credit_card_security_code(card_type=None)
# '259'
Date Time
Date Time,用于生成时间相关数据,如年份、月份、星期、出生日期等内容,可以返回 datetime 类型的数据,用法如下:
faker.am_pm()
# 'AM'
faker.century()
# 'X'
faker.date(pattern="%Y-%m-%d", end_datetime=None)
# '1997-06-16'
faker.date_between(start_date="-30y", end_date="today")
# datetime.date(2000, 8, 30)
faker.date_between_dates(date_start=None, date_end=None)
# datetime.date(2019, 7, 30)
faker.date_object(end_datetime=None)
# datetime.date(1978, 3, 12)
faker.date_of_birth(tzinfo=None, minimum_age=0, maximum_age=115)
# datetime.date(2012, 6, 3)
faker.date_this_century(before_today=True, after_today=False)
# datetime.date(2011, 6, 12)
faker.date_this_decade(before_today=True, after_today=False)
# datetime.date(2011, 8, 22)
faker.date_this_month(before_today=True, after_today=False)
# datetime.date(2019, 7, 25)
faker.date_this_year(before_today=True, after_today=False)
# datetime.date(2019, 7, 22)
faker.date_time(tzinfo=None, end_datetime=None)
# datetime.datetime(2018, 8, 11, 22, 3, 34)
faker.date_time_ad(tzinfo=None, end_datetime=None, start_datetime=None)
# datetime.datetime(1566, 8, 26, 16, 25, 30)
faker.date_time_between(start_date="-30y", end_date="now", tzinfo=None)
# datetime.datetime(2015, 1, 31, 4, 14, 10)
faker.date_time_between_dates(datetime_start=None, datetime_end=None, tzinfo=None)
# datetime.datetime(2019, 7, 30, 17, 51, 44)
faker.date_time_this_century(before_now=True, after_now=False, tzinfo=None)
# datetime.datetime(2002, 9, 25, 23, 59, 49)
faker.date_time_this_decade(before_now=True, after_now=False, tzinfo=None)
# datetime.datetime(2010, 5, 25, 20, 20, 52)
faker.date_time_this_month(before_now=True, after_now=False, tzinfo=None)
# datetime.datetime(2019, 7, 19, 18, 4, 6)
faker.date_time_this_year(before_now=True, after_now=False, tzinfo=None)
# datetime.datetime(2019, 3, 15, 11, 4, 18)
faker.day_of_month()
# '04'
faker.day_of_week()
# 'Monday'
faker.future_date(end_date="+30d", tzinfo=None)
# datetime.date(2019, 8, 12)
faker.future_datetime(end_date="+30d", tzinfo=None)
# datetime.datetime(2019, 8, 24, 2, 59, 4)
faker.iso8601(tzinfo=None, end_datetime=None)
# '1987-07-01T18:33:56'
faker.month()
# '11'
faker.month_name(
# 'August'
faker.past_date(start_date="-30d", tzinfo=None)
# datetime.date(2019, 7, 25)
faker.past_datetime(start_date="-30d", tzinfo=None)
# datetime.datetime(2019, 7, 18, 22, 46, 51)
faker.time(pattern="%H:%M:%S", end_datetime=None)
# '16:22:30'
faker.time_delta(end_datetime=None)
# datetime.timedelta(0)
faker.time_object(end_datetime=None)
# datetime.time(22, 12, 15)
faker.time_series(start_date="-30d", end_date="now", precision=None, distrib=None, tzinfo=None)
#
faker.timezone()
# 'Indian/Comoro'
faker.unix_time(end_datetime=None, start_datetime=None)
# 1182857626
faker.year()
# '1970'
File
用于生成文件和文件路径相关的数据,包括文件扩展名、文件路径、MIME_TYPE、磁盘分区等内容
faker.file_extension(category=None)
# 'flac'
faker.file_name(category=None, extension=None)
# '然后.numbers'
faker.file_path(depth=1, category=None, extension=None)
# '/关系/科技.mov'
faker.mime_type(category=None)
# 'video/ogg'
faker.unix_device(prefix=None)
# '/dev/sdd'faker.unix_partition(prefix=None)# '/dev/xvds3'
Lorem
Lorem,用于生成一些假文字数据,包括句子、自然段、长文本、关键词等,另外可以传入不同的参数来控制生成的长度,用法如下:
faker.paragraph(nb_sentences=3, variable_nb_sentences=True, ext_word_list=None)
# '包括的是报告那些一点.图片地址基本全部.'
faker.paragraphs(nb=3, ext_word_list=None)
# [ '计划规定这样所以组织商品其中.参加成为不同发表地区.精华科技谢谢大家需要.一下手机上海中文工程.',
# '非常相关是一就是一个一种文章发生.增加那些以及之后以下你的.',
# '学生应该出来分析增加关系组织.评论来源朋友注册应该需要单位.感觉最后无法发现选择人民.']
faker.sentence(nb_words=6, variable_nb_words=True, ext_word_list=None)
# '介绍结果自己解决处理.'
faker.sentences(nb=3, ext_word_list=None)
# ['查看其实一次学习登录浏览是一他们.', '而且资源的人事情.', '科技价格免费大学教育.']
faker.text(max_nb_chars=200, ext_word_list=None)
# ('只是当前国内中文所以.威望系统在线虽然.n'
# '图片人民非常合作这种谢谢更新.名称详细直接社会一直首页完全.n'
# '重要更多只要市场.必须只是学生音乐.系统美国类别这些一切环境.n'
# '但是的话人民美国关于.n'
# '情况专业国际看到研究.音乐环境市场搜索发现.n'
# '工具还是到了今天位置人民.留言作者品牌工程项目必须.上海精华现在我们新闻应该关系.n'
# '更新经济能力全部资源如果.手机能够登录国内.')
faker.texts(nb_texts=3, max_nb_chars=200, ext_word_list=None)
# [ '成功可能推荐你的行业.地区而且推荐.n'
# '网络不断是一主要必须.开始安全服务.n'
# '应该网上通过以后通过大学.管理要求有关国际阅读当前.为了应该结果点击公司开始怎么.n'
# '成功一次最大生产网站.这种加入她的地址有限.n'
# '根据新闻汽车起来非常主题显示必须.有些建设来自作者电话支持.n'
# '只是资源还是由于经济事情喜欢.为什中文大小得到服务.网络密码是否免费参加一次社区欢迎.',
# '部门活动技术.商品影响发生行业密码完成.就是部门结果资料学习当然.或者帮助城市要求首页市场教育你们.n'
# '专业完全分析处理城市大学什么.n'
# '文件非常国际全部起来积分公司.资料的是电影没有.这是本站需要.n'
# '合作重要没有现在市场开发空间.您的会员推荐成功教育进行中国.n'
# '文件不是如果评论.因为经验设备规定.n'
# '加入一起影响网上大家运行在线如果.工程企业这种以后.',
# '空间市场出现必须基本电话.显示一个标准其他设计作品.工程不断新闻问题更多更新这么.n'
# '一起简介网上内容不会.任何知道各种两个.类别事情经营那么投资市场.n'
# '那些使用介绍公司朋友人民你们浏览.应该表示一点一般说明主要谢谢.电话回复起来经验一个来源加入.n'
# '地区法律其他表示虽然.参加社会喜欢有限论坛一般发布.类别目前文化可以.n'
# '报告质量工作主要.企业发布完全.得到名称作者等级两个论坛只要电话.']
faker.word(ext_word_list=None)
# '注意'
faker.words(nb=3, ext_word_list=None, unique=False)
# ['责任', '组织', '以后']
Misc
Misc,用于生成生成一些混淆数据,比如密码、sha1、sha256、md5 等加密后的内容,用法如下:
faker.boolean(chance_of_getting_true=50)
# True
faker.md5(raw_output=False)
# '3166fa26ffd3f2a33e020dfe11191ac6'
faker.null_boolean()
# False
faker.password(length=10, special_chars=True, digits=True, upper_case=True, lower_case=True)
# 'W7Ln8La@%O'
faker.sha1(raw_output=False)
# 'c8301a2a79445439ee5287f38053e4b3a05eac79'
faker.sha256(raw_output=False)
# '1e909d331e20cf241aaa2da894deae5a3a75e5cdc35c
053422d9b8e7ccfa0402'
faker.uuid4(cast_to=)
# '6e6fe387-6877-48d9-94ea-4263c4c71aa5'
设置seed
有时候我们需要的数据是固定的,设置seed值,可以保持每次取到的值是一致的
from faker import Faker
fake = Faker("zh_CN")
# 设置seed 值
fake.seed(1222)
print(fake.credit_card_full())
print(fake.date_time())
往期精彩文章
喜报来了!凡猫学员薪资最高16K!
金融行业软件测试介绍
2020年为什么大家都开始学习自动化测试?
学习测试开发前 你需要掌握的python 代码水平
1万+软件测试人员都在学的精品课程免费送,大家别错过
![44de2e6366799410bb5a4ad8fd50af91.gif](https://i-blog.csdnimg.cn/blog_migrate/cf538526d5eebd800cc697abbd29f976.gif)