Files
apiautotest/utils/data_utils/faker_handle.py
2024-04-17 16:14:45 +08:00

274 lines
7.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
# @Time : 2023/12/5 13:51
# @Author : floraachy
# @File : faker_handle
# @Software: PyCharm
# @Desc:
# 标准库导入
import random
import string
import re
from datetime import datetime, date, timedelta
# 第三方库导入
from faker import Faker
# 本地应用/模块导入
class FakerData:
"""
测试数据生成类
官方文档https://faker.readthedocs.io/en/master/index.html
"""
def __init__(self):
self.fk_zh = Faker(locale='zh_CN')
self.faker = Faker()
@classmethod
def generate_random_int(cls, *args) -> int:
"""
:return: 随机数
"""
# 检查是否传入了参数
if not args:
# 没有传参就从5000内随机取一个整数返回
return random.randint(0, 5000)
# 排序参数并获取最小值和最大值
min_val = min(args)
max_val = max(args)
# 生成并返回随机整数
return random.randint(min_val, max_val)
def generate_catch_phrase(self):
"""
:return: 生成妙句(口号) (输出结果都是英文)
"""
return self.faker.catch_phrase()
def generate_phone(self, lan="en") -> int:
"""
:return: 随机生成手机号码
"""
if lan == "zh":
phone = self.fk_zh.phone_number()
else:
phone = self.faker.phone_number()
return phone
def generate_id_number(self, lan="en") -> int:
"""
:return: 随机生成身份证号码
"""
if lan == "zh":
id_number = self.fk_zh.ssn()
else:
id_number = self.faker.ssn()
return id_number
def generate_female_name(self, lan="en") -> str:
"""
:return: 女生姓名
"""
if lan == "zh":
female_name = self.fk_zh.name_female()
else:
female_name = self.faker.name_female()
return female_name
def generate_male_name(self, lan="en") -> str:
"""
:return: 男生姓名
"""
if lan == "zh":
male_name = self.fk_zh.name_male()
else:
male_name = self.faker.name_male()
return male_name
def generate_name(self, lan="en") -> str:
"""
生成人名
:return: 人名
"""
if lan == "zh":
name = self.fk_zh.name()
else:
name = self.faker.name()
return name
def generate_company_name(self, lan: str = "en", fix: str = None) -> str:
"""
生成公司名
:param lan: 语言类型可选en, zh zh表示中文en表示英文默认是en
:param fix: 前后缀可选pre suf pre表示公司前缀suf标识公司后缀
:return: 公司名
"""
if lan == "zh":
if fix == "pre":
name = self.fk_zh.company_prefix()
elif fix == "suf":
name = self.fk_zh.company_suffix()
else:
name = self.fk_zh.company()
else:
if fix == "pre":
name = self.faker.company_prefix()
elif fix == "suf":
name = self.faker.company_suffix()
else:
name = self.faker.company()
return name
def generate_paragraph(self, lan: str = "en", nb: int = 3) -> str:
"""
生成段落
:param lan: 语言类型可选en, zh zh表示中文en表示英文默认是en
:param nb: 段落个数默认是3个
"""
if lan == "zh":
text = self.fk_zh.paragraph(nb_sentences=nb, variable_nb_sentences=True, ext_word_list=None)
else:
text = self.faker.paragraph(nb_sentences=nb, variable_nb_sentences=True, ext_word_list=None)
return text
def generate_words(self, lan: str = "en", nb: int = 1) -> str:
"""
生成词语
:param lan: 语言类型可选en, zh zh表示中文en表示英文默认是en
:param nb: 词语个数默认是1个
"""
if lan == "zh":
if nb == 1 or nb < 1:
text = self.fk_zh.word(ext_word_list=None)
else:
res = self.fk_zh.words(nb=nb, ext_word_list=None)
text = "-".join(res)
else:
if nb == 1 or nb < 1:
text = self.faker.word(ext_word_list=None)
else:
res = self.faker.words(nb=nb, ext_word_list=None)
text = "-".join(res)
return text
def generate_email(self, lan="en") -> str:
"""
:return: 生成邮箱
"""
if lan == "zh":
email = self.fk_zh.email()
else:
email = self.faker.email()
return email
def generate_identifier(self, lan="en", char_len=8):
"""
:return:生成随机标识满足要求长度为2~100这里长度通过传参控制默认为8 只能包含数字,字母,下划线(_),中划线(-),英文句号(.),必须以数字和字母开头,不能以下划线/中划线/英文句号开头和结尾
"""
if lan == "zh":
fk = self.fk_zh
else:
fk = self.faker
while True:
identifier = ''.join(random.choices(string.ascii_letters + string.digits + '_.-', k=char_len)) # 生成指定长度的随机标识
if (
re.match(r'^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,98}[a-zA-Z0-9]$', identifier) and
not (identifier.startswith('_') or identifier.startswith('-') or identifier.startswith('.')) and
not (identifier.endswith('_') or identifier.startswith('-') or identifier.endswith('.'))
):
return identifier
def generate_city(self, lan="en", full: bool = True) -> str:
"""
:return: 随机生成城市名
"""
if lan == "zh":
faker = self.fk_zh
else:
faker = self.faker
if full:
city = faker.city()
else:
city = faker.city_name()
return city
def generate_province(self, lan="en") -> str:
"""
:return: 随机生成城市名
"""
if lan == "zh":
faker = self.fk_zh
else:
faker = self.faker
return faker.province()
def generate_address(self, lan="en") -> str:
"""
:return: 生成地址
"""
if lan == "zh":
address = self.fk_zh.address()
else:
address = self.faker.address()
return address
@classmethod
def generate_time(cls, fmt='%Y-%m-%d %H:%M:%S') -> str:
"""
计算当前时间
:return:
"""
now_time = datetime.now().strftime(fmt)
return now_time
@classmethod
def generate_today_date(cls, fmt='%Y-%m-%d'):
"""获取今日0点整时间"""
today = datetime.now().date()
if fmt == '%Y-%m-%d %H:%M:%S':
return today.strftime(fmt) + " 00:00:00"
return today.strftime(fmt)
@classmethod
def generate_time_after_week(cls, fmt='%Y-%m-%d'):
"""获取一周后12点整的时间"""
if fmt == '%Y-%m-%d %H:%M:%S':
return (date.today() + timedelta(days=+6)).strftime(fmt) + " 00:00:00"
return (date.today() + timedelta(days=+6)).strftime(fmt)
@classmethod
def remove_special_characters(cls, target: str):
"""
移除字符串中的特殊字符。
在Python中用replace()函数操作指定字符
常用字符unicode的编码范围
数字:\u0030-\u0039
汉字:\u4e00-\u9fa5
大写字母:\u0041-\u005a
小写字母:\u0061-\u007a
英文字母:\u0041-\u007a
"""
pattern = r'([^\u4e00-\u9fa5])'
result = re.sub(pattern, '', target)
return result