1.什么是faker库?
大家一看标题 ,faker,很快就能联想到lol里面的faker是不是?哈哈哈,当然了,这里的faker说的不是英雄联盟里面的faker大魔王,是第三方库faker。
2.faker库是用来干嘛的?
在介绍faker库是用来干嘛之前,我想问大家一个问题。相信很多做过自动化的小伙伴们都会遇到一个问题,就是我一个注册接口,我的测试数据有可能是写死的,就一个账号19951992345,那么第一次跑接口自动化的话,可能这个账号没有被注册过,然后测试用例通过;当我们后续再次跑这个接口自动化的时候,原先未被注册的账号由于第一次跑接口自动化就变成已注册了,那这个时候怎么办呢?我们不可能每次都主动去修改测试账号,那样子就会变得很繁琐。那么,这个时候就要用到我们这个faker第三方库啦。
3.faker的使用方法?
下面就给大家介绍 faker的基本使用方法。
import faker
fk = faker.Faker()
result = fk.phone_number()
print(result) # 随机生成一个电话号码
打印结果:001-216-131-5435x6699
那这个时候大家很清楚的看到,咦,这个随机生成的手机号码为啥跟我们中国的手机号码格式不一样。没错,是因为我们没有指定哪个国家的,默认用的是usa,也就是美国那边的电话号码格式。那我们这边再修改一些参数。
import faker
# 与上一段代码相比,这里加了locale='zh_CN'
fk = faker.Faker(locale='zh_CN')
result = fk.phone_number()
print(result)
打印结果:15750574236
当然了 除了随机生成手机号码,还能随机生成公司名称,地址,城市 等等。就不一一赘述啦,大家感兴趣的话可以去搜索faker官网。
import faker
fk = faker.Faker(locale='zh_CN')
result = fk.phone_number()
print(result)
# 随机生成公司名称
print(fk.company())
# 随机生成地址
print(fk.address())
# 随机生成一个城市
print(fk.city())
打印结果:
15136434635
和泰信息有限公司
青海省邯郸市华龙武汉路A座 796447
4.自己实现随机生成手机号,不用faker
我们还可以自己写个方法随机生成手机号。
def generate_new_phone():
# 自动生成手机号
phone = '1' + random.choice(['3', '5', '7'])
for i in range(9):
num = random.randint(0, 9)
phone += str(num)
return phone
print(generate_new_phone())
# 代码解读
# 第一行代码:随机生成 1 + 列表中的任意一个字符 组合起来,例如13,15,17
# 第二到四行代码:循环9次(为啥循环九次,因为phone已经是2个数了,手机号是11个数),每次循环从(0,9)之间随机抽取一个数字。
5.faker在接口自动化中的使用
那么今天的重点来了哦。
想必大家的接口自动化应该都是测试数据和逻辑是分开的,测试数据可以存放在excel里,也可以存放在yaml文件里,我是放在excel里面的。
大家可以看到我标红的地方,
json={"mobile_phone": "#new_phone#", "pwd": "123456789123456789"}
然后我从excel里面读取数据,通过ddt数据驱动,最后判断如果有 "#new_phone#",就通过字符串替换,替换的值就是用faker生成的手机号,这样子就能保证每次运行自动化,这个注册成功的手机号都是不同的,就会避免开头我说的那个问题(第一次运行成功,第二次运行测试用例就会是已注册的会导致测试用例失败)。下面,展示代码:
从excel里读取测试数据的方法:
# 封装从excel里读取测试数据的方法
def read_excel(file_path, sheet_name):
"""读取excel当中的数据"""
workbook = openpyxl.load_workbook(file_path)
sheet: Worksheet = workbook[sheet_name]
values = list(sheet.values)
workbook.close()
title = values[0]
rows = values[1:]
new_rows = [dict(zip(title, row)) for row in rows]
return new_rows
完整的代码:
import unittest
import requests
from common.excel import read_excel
from config.path_config import case_path
from unittestreport import ddt, list_data
import json
from config import setting
from common.logger import log
import faker
# 获取数据
data = read_excel(case_path, 'register')
@ddt
class TestRegister(unittest.TestCase):
@list_data(data)
def test_register(self, case_data):
# 1, 访问接口,得到响应数据
# 2, 获取预期结果
# 3, 响应数据和 预期结果的对比
# AttributeError: 'str' object has no attribute 'items'
# 判断json数据中是否有#new_phone#,如果有,替换成随机生成的手机号
json_data = case_data['json']
if '#new_phone#' in json_data:
# 随机生成一个手机号
fk = faker.Faker(locale='zh_CN')
new_phone = fk.phone_number()
json_data = json_data.replace('#new_phone#', new_phone)
# 把json格式的字符串转化为字典
json_data = json.loads(json_data)
headers = json.loads(case_data['headers'])
expected = case_data['expected']
resp = requests.request(
method=case_data['method'],
url=setting.host + case_data['url'],
json=json_data,
headers=headers
)
actual = resp.json()
print(actual)
try:
self.assertEqual(actual['code'], expected)
log.info(f"测试用例通过:{case_data}")
except AssertionError as e:
log.error(f'测试用例失败:{case_data}, 错误信息: {e}')
# 测试用例失败捕获之后,一定要使用raise抛出
raise e
其实随机生成手机号也可以封装成一个方法,这里方便大家理解,所以我没单独拿出来封装:
import faker
def generater_new_phone():
fk = faker.Faker(locale='zh_CN')
result = fk.phone_number()
return result
希望对大家有所帮助哈