faker第三方库

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

希望对大家有所帮助哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值