【接口平台】生成静态模拟数据

接口用例智能生成,需要根据相应信息生成对应的字段值,比如自动生成手机号、姓名、身份证号等等,一开始的方案是手动撸代码

    def random_gbk2312(self,length):
        """
        生成指定长度常见的随机汉字
        """
        str = ''
        for i in range(0,length):
            head = randint(0xb0, 0xf7)
            body = randint(0xa1, 0xf9)  # 在head区号为55的那一块最后5个汉字是乱码,为了方便缩减下范围
            val = f'{head:x}{body:x}'
            str = str + bytes.fromhex(val).decode('gb2312')
        return str

规则全部写一套成本太大了

发现之前使用mockjs的时候,mockjs提供了一套非常丰富的字段自动生成

npm install mockjs --save 

// 定义模板
const Mock = require('mockjs');
var Random = Mock.Random;
Random.extend({
    uuid: function() {
        return Math.random().toString(36).substr(2);
    }
})
module.exports = {
    'status': 'ok',
    'results|25': [{
        'id|+1': 10,
        'posts': "@cparagraph(1)",
        'ctime': "@date('yyyy-MM-dd')",
        'title': '@ctitle(1,20)',
        'thumbnail': {
            'small': {
                url: "@image(321x210,@color())"
            },
            'large': {
                url: "@image(640x420,@color())"
            }
        }
    }]
}

常用API
Basic
Random.boolean( min?, max?, current? )返回一个随机的布尔值

Random.natural( min?, max? )返回一个随机的自然数(大于等于 0 的整数)

Random.integer( min?, max? )返回一个随机的整数

Random.float( min?, max?, dmin?, dmax? )返回一个随机的浮点数

Random.character( pool? )返回一个随机字符

Random.string( pool?, min?, max? )返回一个随机字符串

Random.range( start?, stop, step? )返回一个整型数组

Date
Random.date( format? )返回一个随机的日期字符串

Random.time( format? )返回一个随机的时间字符串

Random.datetime( format? )返回一个随机的日期和时间字符串

Random.now( unit?, format? )返回当前的日期和时间字符串

Text
Random.paragraph( min?, max? )随机生成一段文本

Random.cparagraph( min?, max? )随机生成一段中文文本

Random.sentence( min?, max? )随机生成一个句子,第一个单词的首字母大写

Random.csentence( min?, max? )随机生成一段中文文本

Random.word( min?, max? )随机生成一个单词

Random.cword( pool?, min?, max? )随机生成一个汉字

Random.title( min?, max? )随机生成一句标题,其中每个单词的首字母大写

Random.ctitle( min?, max? )随机生成一句中文标题

Name
Random.first() 随机生成一个常见的英文名

Random.last()随机生成一个常见的英文姓

Random.name( middle? )随机生成一个常见的英文姓名

Random.cfirst()随机生成一个常见的中文名

Random.clast()随机生成一个常见的中文姓

Random.cname()随机生成一个常见的中文姓名

那python是否也有这样的库?开始寻找未果
那python是否可以直接调js的库?

import execjs

def get_des_psswd(data, key):
    jsstr = get_js()
    ctx = execjs.compile(jsstr) #加载JS文件
    return (ctx.call('strEnc', data, key))  #调用js方法  第一个参数是JS的方法名,后面的data和key是js方法的参数



def get_js():
    f = open("./../lib/des.js", 'r', encoding='utf-8') # 打开JS文件
    line = f.readline()
    htmlstr = ''
    while line:
        htmlstr = htmlstr+line
        line = f.readline()
    return htmlstr


if __name__ == '__main__':
    print(get_des_psswd('123456', 'RUY2OTdCRUFFRTg0OUQ0Q0E0ODNDRDMxN0YzOEEzREQudG9tY2F0OTQ='))

直接调用是没有问题的,但是问题来了,接口平台使用的是docker部署,目前使用的是python环境,如果想调用js库,环境部署比较麻烦。

那是否真的强大的python没有这样的库?
并不是的

Faker,Python的伪造数据生成器

# coding=utf-8
"""一些生成器方法,生成随机数,手机号,以及连续数字等"""
import random
from faker import Factory
 
fake = Factory().create('zh_CN')
 
 
def random_phone_number():
    """随机手机号"""
    return fake.phone_number()
 
 
def random_name():
    """随机姓名"""
    return fake.name()
 
 
def random_address():
    """随机地址"""
    return fake.address()
 
 
def random_email():
    """随机email"""
    return fake.email()
 
 
def random_ipv4():
    """随机IPV4地址"""
    return fake.ipv4()
 
 
def random_str(min_chars=0, max_chars=8):
    """长度在最大值与最小值之间的随机字符串"""
    return fake.pystr(min_chars=min_chars, max_chars=max_chars)
 
if __name__ == '__main__':
    print(random_phone_number())
    print(random_name())
    print(random_address())
    print(random_email())
    print(random_ipv4())
    print(random_str(min_chars=6, max_chars=8))

方法介绍
如上面例子,每次调用 fake 实例的 name()方法时,都会产生不同随机姓名。fake 实例还有很多方法可用,这些方法分为以下几类:

address 地址
person 人物类:性别、姓名等
barcode 条码类
color 颜色类
company 公司类:公司名、公司email、公司名前缀等
credit_card 银行卡类:卡号、有效期、类型等
currency 货币
date_time 时间日期类:日期、年、月等
file 文件类:文件名、文件类型、文件扩展名等
internet 互联网类
job 工作
lorem 乱数假文
misc 杂项类
phone_number 手机号码类:手机号、运营商号段
python python数据
profile 人物描述信息:姓名、性别、地址、公司等
ssn 社会安全码(身份证号码)
user_agent 用户代理

自定义扩展
Faker 已经提供了足够丰富的信息生成,包括名字、手机号、邮箱地址、邮编等等。尽管如此,可能还是没有办法满足你的需求。这时,可以利用自定义扩展,引用外部的 provider,自定义你要的功能。

Faker 对象可以通过 add_provider 方法将自定义的 Provider 添加到对象中,自定义的 Provider 需要继承自 BaseProvider

from faker import Faker
fake = Faker()
# first, import a similar Provider or use the default one
from faker.providers import BaseProvider
# create new provider class
class MyProvider(BaseProvider):
    def foo(self):
        return 'bar'
# then add new provider to faker instance
fake.add_provider(MyProvider)
# now you can use:
print(fake.foo())

随机控制
Faker 随机生成由 random.Random 驱动。其中,.random 属性返回 random.Random 对象。通过对该对象的操作,可以实现自定义的行为

from faker import Faker
fake = Faker()
fake.random
fake.random.getstate()

那么,可以实现什么自定义呢?举个例子,我们可以设置 seed,通过给定的 seed 可以控制每次生成的内容都是一样的


>>> from faker import Faker
>>> fake = Faker()
>>> fake.random.seed(4321)
>>> fake.name()
'Ryan Gallagher'
>>> fake.address()
'7631 Johnson Village Suite 690\nAdamsbury, NC 50008'
>>> fake.random.seed(4321)
>>> fake.name()
'Ryan Gallagher'
>>> fake.address()
'7631 Johnson Village Suite 690\nAdamsbury, NC 50008'

不同的两次运行,只要seed一样,生成出来的信息就是一样的。

注: fake.random.seed(4321) 可以写成 fake.seed(4321)

搞定

posted @ 2019-12-28 15:49  guanqinghua  阅读(72)  评论(0编辑  收藏  举报