一、测试数据动态生成

动态生成手机号码,来完成完全自动化的回归测试

1. 随机库random

1.1 生成[0-1)之间的随机浮点数(左闭右开)

import random
random.random()

输出:

0.8825516238816438
random.random()

输出:

0.6465163461469168

1.2 生成[a,b]之间的随机整数(左闭右闭)

random.randint(1,10)

输出:

4
random.randint(-10,10)
-9

1.3 生成[a,b)之间的随机整数(左闭右开)

random.randrange(-1,1)

输出:

-1

1.4 在一个序列中随机选择一个元素

# 有一个列表,要求随机抽取其中一个元素
ls = list('abcdefg')  # 0-len(ls)-1
index = random.randrange(0,len(ls))
ls[index]

输出:

'b'
random.choice(ls)

输出:

'b'
dir(random)

查看random方法的使用

['BPF',
 'LOG4',
 'NV_MAGICCONST',
 'RECIP_BPF',
 'Random',
 'SG_MAGICCONST',
 'SystemRandom',
 'TWOPI',
 '_Sequence',
 '_Set',
 '__all__',
 '__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__spec__',
 '_accumulate',
 '_acos',
 '_bisect',
 '_ceil',
 '_cos',
 '_e',
 '_exp',
 '_floor',
 '_inst',
 '_log',
 '_os',
 '_pi',
 '_random',
 '_repeat',
 '_sha512',
 '_sin',
 '_sqrt',
 '_test',
 '_test_generator',
 '_urandom',
 '_warn',
 'betavariate',
 'choice',
 'choices',
 'expovariate',
 'gammavariate',
 'gauss',
 'getrandbits',
 'getstate',
 'lognormvariate',
 'normalvariate',
 'paretovariate',
 'randbytes',
 'randint',
 'random',
 'randrange',
 'sample',
 'seed',
 'setstate',
 'shuffle',
 'triangular',
 'uniform',
 'vonmisesvariate',
 'weibullvariate']

2. 封装生成手机号码的函数

功能分析:

  1. 随机生成符合规则的手机号码

目前手机号码的不严格规则如下:

A. 11位数字
B. 第一位是1
C. 第二位数字是3-9具体项目要结合后台代码规则进行处理
  1. 生成手机号码要没有使用过 需要到数据库中去校验

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/11 20:51
# @Author  : shisuiyi
# @File    : data_handler.py
# @Software: win10 Tensorflow1.13.1 python3.9
# 测试数据处理模块
def general_phone():
    """
    随机生成手机号码
    @return:
    """
    # phone = ['1', str(random.randint(3, 9))]
    # for _ in range(9):
    #     phone.append(str(random.randint(0, 9)))
    # return ''.join(phone)  # str.join(item)
    phone = ['158']
    for _ in range(8):
        phone.append(random.choice('0123456789'))
    return ''.join(phone)


if __name__ == '__main__':
    # res = get_data_from_excel(setting.TEST_DATA_FILE)
    # print(res)
    print(general_phone())

2.2 Faker库

pip install faker

文档地址

import faker
f = faker.Faker(locale='zh-cn')  # 设置地区
f.phone_number()

输出:

'13708890210'
f.name()

输出:

'王玉梅'
f.address()

输出:

'山东省琳市东城黄路W座 542406'
f.ipv4()

输出:

'174.75.64.215'

3. 应用到项目中

3.1 思路

  1. 在用例数据中添加生成手机号码的标志位,设计这个标志位为

    $特殊的变量名$
    

    ,例如生成手机号码的标志位为

    $phone_number$
    
    • 什么字段里有可能有这个标志

      • request_data

      • sql

      • url

  2. 检查用例数据,如果出现了标志则动态生成对应数据并替换

3.2 用例数据修改

excle测试用例中的request_data内容

{
"headers": {"X-Lemonban-Media-Type": "lemonban.v1"},
"json": {"mobile_phone":$phone_number$,"pwd":"12345678"}
}

替换手机号:

@list_data(cases)
    def test_register(self, item):
        logger.info('>>>>>>>用例{}开始执行>>>>>>>>'.format(item['title']))
        # 1. 处理测试数据
        # 是否有动态生成手机号码
        item = json.dumps(item)
        if '$phone_number$' in item:
            phone = generate_no_use_phone()
            item = item.replace('$phone_number$', phone)
        item = json.loads(item)

        # 把请求参数处理好,request_data是一个json字符串,怎么通过封装好的发送请求的函数发送
        # expect_data也是一个json字符串,也需要loads成python对象
        request_data = json.loads(item['request_data'])
        expect_data = json.loads(item['expect_data'])