【jmeter】利用python生成真实的手机号

背景

之前做压测对于手机号的处理一直是使用jmeter随机数生成:${__Random(10000000000,19999999999,mobile)},用着也没啥问题,但今天看了下生成的手机号:
【jmeter】利用python生成真实的手机号

总感觉透露着一股不专业的气息,怎么可能有111开头的手机号格式,百度了一下有没有现成的脚本,发现都是千篇一律的代码也看不太懂,所以考虑还是自己来写。

手机号格式

特地查询了一下目前国内的手机号格式,对于一个手机号,比如说:17612341234,它的组成规律如下表格:

176 1234 1234
网络识别号 地区编码 用户号码

由此我们可以发现对于一个手机号来说前3位和4-7位已经是固定了的,查询可知三大运营商的前三位为:

mobile_yd = [
    # 移动号码段,更新至198号段,不包含物联网、卫星电话、虚拟号段。
    134, 135, 136, 137, 138, 139, 147, 148, 150, 151, 152, 157, 158, 159, 178, 182, 183, 184, 187, 188, 198
]
mobile_lt = [
    # 联通号码段,更新至186号段,不包含物联网、卫星电话、虚拟号段。
    130, 131, 132, 145, 146, 155, 156, 166, 175, 176, 185, 186
]
mobile_dx = [
    # 电信号码段,更新至199号段,不包含物联网、卫星电话、虚拟号段。
    133, 149, 153, 173, 177, 180, 181, 189, 191, 199
]

python代码

思路:对于压测来说我们需要一个单独的csv文件存储生成的手机号,并且有的接口对于手机号是有重复性验证的,而且在每次压测前我们都需要先清空旧的手机号文件,然后再生成新的。

定义方法:清空旧文件、写手机号至csv文件

def CleanFile(FileURL):
    # 每次打开文件清空旧文件内容
    with open(FileURL, 'r+', encoding='UTF-8') as file:
        file.truncate(0)

def WriteFile(FileURL,File):
    # 写入数据,每写一次就换行一次。
    file = open(FileURL, mode='a+', encoding='UTF-8')
    file.write(str(File) + '\n')
    file.close()

def Result():
    # 调用Python脚本执行成功时,在控制台显示信息。
    return print('Result:' + 'The Python script executed successfully')

定义方法:生成11位数的手机号

def Mobile_Three():
    # 手机号前3位
    i = random.randint(1, 100)
    if i <= 40:
        # 生成40%的移动号码
        three = mobile_yd[random.randint(0, len(mobile_yd) - 1)]
    elif 40 < i <= 70:
        # 生成30%的联通号码
        three = mobile_lt[random.randint(0, len(mobile_lt) - 1)]
    else:
        # 生成30%的电信号码
        three = mobile_dx[random.randint(0, len(mobile_dx) - 1)]
    return three

def Mobile_Eight():
    # 手机号后8位
    eight = random.randint(10000000, 99999999)
    return eight

def Mobile():
    # 生成11位手机号
    mobile = str(Mobile_Three()) + str(Mobile_Eight())
    return mobile

定义方法:调用生成手机号的方法并去掉重复的手机号

def WriteMobile(FileURL,data):
    i = 0
    # 循环生成多少数据
    while i < data:
        mobile = [
            Mobile()
        ]
        # 去掉重复的手机号
        mobile_old = set(mobile)
        mobile_new = list(mobile_old)
        # 开始循环写入csv文件
        j = 0
        while j < len(mobile_new):
            z = (
                mobile_new[j]
            )
            WriteFile(FileURL, z)
            j = i + 1
        i = i + 1

最后查看生成的csv文件:
【jmeter】利用python生成真实的手机号
完美!

附代码[全]

# -*- coding: utf-8 -*-
# @date    : 2021-11-03
# @author  : aizhijie

import random

mobile_yd = [
    # 移动号码段,更新至198号段,不包含物联网、卫星电话、虚拟号段。
    134, 135, 136, 137, 138, 139, 147, 148, 150, 151, 152, 157, 158, 159, 178, 182, 183, 184, 187, 188, 198
]
mobile_lt = [
    # 联通号码段,更新至186号段,不包含物联网、卫星电话、虚拟号段。
    130, 131, 132, 145, 146, 155, 156, 166, 175, 176, 185, 186
]
mobile_dx = [
    # 电信号码段,更新至199号段,不包含物联网、卫星电话、虚拟号段。
    133, 149, 153, 173, 177, 180, 181, 189, 191, 199
]

def Mobile_Three():
    # 手机号前3位
    i = random.randint(1, 100)
    if i <= 40:
        # 生成40%的移动号码
        three = mobile_yd[random.randint(0, len(mobile_yd) - 1)]
    elif 40 < i <= 70:
        # 生成30%的联通号码
        three = mobile_lt[random.randint(0, len(mobile_lt) - 1)]
    else:
        # 生成30%的电信号码
        three = mobile_dx[random.randint(0, len(mobile_dx) - 1)]
    return three

def Mobile_Eight():
    # 手机号后8位
    eight = random.randint(10000000, 99999999)
    return eight

def Mobile():
    # 生成11位手机号
    mobile = str(Mobile_Three()) + str(Mobile_Eight())
    return mobile

def CleanFile(FileURL):
    # 每次打开文件清空旧文件内容
    with open(FileURL, 'r+', encoding='UTF-8') as file:
        file.truncate(0)

def WriteFile(FileURL,File):
    # 写入数据,每写一次就换行一次。
    file = open(FileURL, mode='a+', encoding='UTF-8')
    file.write(str(File) + '\n')
    file.close()

def Result():
    # 调用Python脚本执行成功时,在控制台显示信息。
    return print('Result:' + 'The Python script executed successfully')

def WriteMobile(FileURL,data):
    i = 0
    # 定义 循环生成多少数据
    while i < data:
        mobile = [
            Mobile()
        ]
        # 去掉重复的手机号
        mobile_old = set(mobile)
        mobile_new = list(mobile_old)
        # 开始循环写入csv文件
        j = 0
        while j < len(mobile_new):
            z = (
                mobile_new[j]
            )
            WriteFile(FileURL, z)
            j = i + 1
        i = i + 1


if __name__ == '__main__':

    data = 1000000
    FileURL = 'D:\\jmeter\\csv_mobile.csv'

    MobileFileURL = FileURL
    CleanFile(MobileFileURL)
    WriteMobile(MobileFileURL, data)

    Result()

git仓库地址

https://github.com/aizhijie-yeah-net/jmeter/blob/main/python/python_mobile.py
该脚本可单独运行,只需要修改下csv文件的地址即可。

上一篇:程序员是如何提涨薪的?


下一篇:MySQL进阶系列: 怎么创建更合适的索引