Python中Faker库详解:随机数据生成器

文章目录

  • Faker介绍
  • Faker安装
  • Faker使用
  • 基本使用方法
  • 随机生成人物相关的基础信息
  • 随机生成地理相关的信息
  • 随机生成网络相关的信息
  • 随机生成日期相关的信息
  • 随机生成数字/字符串/文本
  • 随机生成列表/元组/字典/集合/迭代器/json
  • 随机生成文件相关的信息
  • 随机生成颜色/表情
  • 每次请求获取相同的数据
  • Faker的应用
  • 结合pymysql库将数据插入到数据库中
  • 结合openpyxl库将数据导出到Excel中
  • 在Pytest中使用Faker随机生成入参
  • Faker介绍

    在软件测试过程中,我们经常需要使用一些测试数据,通常都是只能使用已有的系统数据,但可能会因权限或其它原因不可使用,又或者手工编造一些数据,但数据量较大时影响测试效率,Faker就解决这个问题,Faker是python的一个第三方库,主要是用来创造伪数据的,只需要调用Faker提供的相关api即可完成数据的生成

    Faker安装

    pip install faker
    

    Faker使用

    1. 基本使用方法
      from faker import Faker		# 导入faker库的Faker方法
      
      # ↓默认为en_US,只有使用了相关语言才能生成相对应的随机数据
      fk=Faker(locale="zh_CN")
      # ↓也可使用多种语言
      # fk = Faker(["zh_CN", "en_US", "zh_TW"])
      
      # ↓随机生成姓名+身份ID +手机号,因为已指定locale为中文,所以生成的数据都是符合中国环境的数据
      for i in range(10):
          print(fk.name() + "," + fk.ssn() + "," + fk.phone_number())
      
    2. 随机生成人物相关的基础信息
      print("随机生成一个姓:", fk.last_name())
      print("随机生成一个女性常用姓:", fk.last_name_female())
      print("随机生成一个男性常用姓:", fk.last_name_male())
      print("随机生成一个名:", fk.first_name())
      print("随机生成一个女性常用名:", fk.first_name_female())
      print("随机生成一个男性常用名:", fk.first_name_male())
      print("随机生成一个姓名:", fk.name())
      print("随机生成一个罗马文的姓名(当英文使用):", fk.romanized_name())
      print("随机生成一个女性全名:", fk.name_female())
      print("随机生成一个男性全名:", fk.name_male())
      print("随机生成一个手机号号段:", fk.phonenumber_prefix())
      print("随机生成一个手机号:", fk.phone_number())
      print("随机生成一个的身份ID:", fk.ssn())
      print("随机生成一个生日日期:", fk.date_of_birth())
      print("随机生成一个生日日期(20~30岁之间):", fk.date_of_birth(minimum_age=20, maximum_age=30))
      print("随机生成一个信用卡号:", fk.credit_card_number())
      print("随机生成一个完整的信用卡信息:", fk.credit_card_full())
      print("随机生成一份简略的个人信息:", fk.simple_profile())
      print("随机生成一份详细的个人信息:", fk.profile())
      print("随机生成一个车牌号:", fk.license_plate())
      print("随机获取一个银行名称:", fk.bank())
      print("随机生成一个银行账号:", fk.bban())
      print("随机获取一个国际银行账号:", fk.iban())
      print("随机生成一个邮箱:", fk.email())
      print("随机生成一个公司邮箱:", fk.company_email())
      print("随机生成一个免费邮箱:", fk.free_email())
      print("随机生成一个安全邮箱:", fk.safe_email())
      print("随机生成一个邮箱后缀:", fk.free_email_domain())
      print("随机生成一个完整的公司名称:", fk.company())
      print("随机生成一个公司名:", fk.company_suffix())
      print("随机生成一个公司性质:", fk.company_prefix())
      print("随机生成一个职位名称:", fk.job())
      
    3. 随机生成地理相关的信息
      print("随机生国际语言:", fk.language_name())
      print("随机生成一个国家名称:", fk.country())
      print("获取当前所在国家名称:", fk.current_country())
      print("随机生成一个行政单位:", fk.administrative_unit())
      print("随机生成一个省份:", fk.province())
      print("随机生成一个城市:", fk.city())
      print("随机生成一个城市名:", fk.city_name())
      print("随机生成一个城市名的后缀(即市县区):", fk.city_suffix())
      print("随机生成一个县/区:", fk.district())
      print("随机生成一个街道名称:", fk.street_name())
      print("随机生成一个街道名的后缀(即街路):", fk.street_suffix())
      print("随机生成一个街道地址:", fk.street_address())
      print("随机生成一个楼号:", fk.building_number())
      print("随机生成一个详情地址:", fk.address())
      print("随机生成一个邮编:", fk.postcode())
      print("随机生成一个地理坐标(纬度):", fk.latitude())
      print("随机生成一个地理坐标(经度):", fk.longitude())
      
    4. 随机生成网络相关的信息
      print("随机生成一个域名:", fk.domain_name())
      print("根据给定日期随机生成一个3位的域名:", fk.dga(year=2023, month=7, day=31, length=3))
      print("随机生成一个IPv4地址:", fk.ipv4())
      print("随机生成一个IPv6地址:", fk.ipv6())
      print("随机生成一个端口:", fk.port_number())
      print("随机生成一个MAC地址:", fk.mac_address())
      print("随机生成一个网址文件路径:", fk.uri_path())
      print("随机生成一个网址文件:", fk.uri_page())
      print("随机生成一个网址文件后缀:", fk.uri_extension())
      print("随机生成一个uri地址:", fk.uri())
      print("随机生成一个url地址:", fk.url())
      print("随机生成一个图片url地址:", fk.image_url())
      print("随机生成一个域名后缀:", fk.tld())
      print("随机生成一个用户名:", fk.user_name())
      print("随机生成一个用户ID:", fk.uuid4())
      print("随机生成一个HTTP请求方法:", fk.http_method())
      
      print("随机生成一个user_agent:", fk.user_agent())
      print("随机生成一个IOS的user_agent:", fk.ios_platform_token())
      print("随机生成一个安卓的user_agent:", fk.android_platform_token())
      print("随机生成一个Linux的user_agent:", fk.linux_platform_token())
      print("随机生成一个Windows的user_agent:", fk.windows_platform_token())
      print("随机生成一个MAC的user_agent:", fk.mac_platform_token())
      print("随机生成一个IE的user_agent:", fk.internet_explorer())
      print("随机生成一个Firefox的user_agent:", fk.firefox())
      print("随机生成一个Opera的user_agent:", fk.opera())
      print("随机生成一个Safari的user_agent:", fk.safari())
      print("随机生成一个Chrome的user_agent:", fk.chrome())
      # ↓指定随机生成一个Chrome的user_agent并指定浏览器版本范围
      print(fk.chrome(version_from=95, version_to=116, build_from=5500, build_to=5800))
      
      print("随机生成一个NIME类型:", fk.mime_type())
      # ↓支持的类别:application/image/model/multipart/text/message/video/audio
      print("随机生成一个指定类别的NIME类型:", fk.mime_type(category="application"))
      
      print("随机生成Ture或False:", fk.boolean())
      print("随机生成None、Ture或False:", fk.null_boolean())
      print("随机生成Ture或False(25%概率为True):", fk.boolean(chance_of_getting_true=25))
      
      print("随机生成一个密码:", fk.password())
      print("随机生成一个12位的密码:", fk.password(length=12))
      print("随机生成一个MD5:", fk.md5())
      print("随机生成一个SHA1:", fk.sha1())
      print("随机生成一个SHA256:", fk.sha256())
      
    5. 随机生成日期相关的信息
      from datetime import date, datetime
      
      print("随机生成一个年份:", fk.year())
      print("随机生成一个月份:", fk.month())
      print("随机生成一个月份名称:", fk.month_name())
      print("随机生成一个天数:", fk.day_of_month())
      print("随机生成一个年月日:", fk.date())
      print("指定格式随机生成一个年月日:", fk.date(pattern="%Y年%m月%d日"))
      print("随机生成一个星期数:", fk.day_of_week())
      print("随机生成AM/PM:", fk.am_pm())
      print("随机生成一个时间:", fk.time())
      print("指定格式随机生成一个时间:", fk.time(pattern="%H:%M"))
      print("随机生产一个日期和时间:", fk.date_time())
      print("随机生成过去某天:", fk.date_between())
      print("指定范围内随机生成过去某天(5年前~今天):", fk.date_between(start_date="-5y"))
      print("指定范围内随机生成过去某天(至30天前):", fk.date_between(end_date="-30d"))
      print("指定范围内随机生成某天(5天前~30天后):", fk.date_between(start_date="-5d", end_date="+30d"))
      print("使用date对象在指定范围内随机生成日期和时间:",
            fk.date_time_between_dates(datetime_start=date(2020, 6, 6), datetime_end=date(2023, 8, 8)))
      print("使用datetime对象在指定范围内随机生成日期和时间:",
            fk.date_time_between_dates(datetime_start=datetime(2020, 6, 6, 9, 30, 20),
                                       datetime_end=datetime(2023, 8, 8, 10, 30, 50)))
      print("随机生成未来某天:", fk.future_date())
      print("随机生成未来某个日期和时间:", fk.future_datetime())
      print("随机生成未来30天内的某个日期:", fk.future_date(end_date="+30d"))
      print("随机生成未来30天内的某个日期和时间:", fk.future_datetime(end_date="+30d"))
      print("随机生成过去某天:", fk.past_date())
      print("随机生成过去某个日期和时间:", fk.past_datetime())
      print("随机生成过去5年内的日期:", fk.past_date(start_date="-5y"))
      print("随机生成过去15天内的日期和时间:", fk.past_datetime(start_date="-15d"))
      print("获取今天的日期:", fk.date_between_dates())
      print("获取今天的日期和时间:", fk.date_time_between_dates())
      print("随机生成今年的某个月份:", fk.date_this_year())
      print("随机生成一个早于当前时间的日期和时间(即过去的时间):", fk.date_time_this_year(before_now=True))
      print("随机生成一个晚于当前时间的日期和时间(即未来的时间):", fk.date_time_this_year(after_now=True))
      print("随机生成本月的某天:", fk.date_this_month())
      print("随机生成unix时间戳:", fk.unix_time())
      print("随机生成ISO8601时间戳:", fk.iso8601())
      print("随机时区:", fk.timezone())
      
    6. 随机生成数字/字符串/文本
      print("随机生整一个整数:", fk.pyint())
      print("指定范围内随机生成一个奇数:", fk.pyint(min_value=1, max_value=10, step=2))
      print("随机生成一个字符串:", fk.pystr())
      print("随机生成一个带前缀和后缀的8位的字符串:", fk.pystr(min_chars=2, max_chars=8, prefix="dyd-", suffix="-123"))
      print("指定范围内随机生成一个奇数:", fk.pyint(min_value=1, max_value=10, step=2))
      # ↓随机生成一个小数(整数部分3位,小数2位,只生成负数)
      print(fk.pyfloat(left_digits=3, right_digits=2, positive=False, min_value=1, max_value=10))
      print("随机生成一个decimal数据:", fk.pydecimal())
      # ↓随机生成一个1~10的decimal数据(整数部分3位,小数2位,只生成负数)
      print(fk.pydecimal(left_digits=3, right_digits=2, positive=False, min_value=1, max_value=10))
      print("随机生成一组dict数据:", fk.pydict())
      
      print("生成一个3位随机数:", fk.numerify())
      print("生成一个指定位数的随机数:", fk.random_number(digits=5))
      print("生成一个0-9的随机数:", fk.random_digit())
      print("生成一个1-9的随机数:", fk.random_digit_not_null())
      print("生成一个0-9999随机数:", fk.random_int())
      print("指定范围内生成一个随机数:", fk.random_int(min=60, max=100))
      
      print("随机生成一个字符(a~z小写):", fk.random_element())
      print("指定字符内随机生成一个字符:", fk.random_element(elements=("a", "b", "1", "D")))
      print("随机生成多个字符:", fk.random_elements())
      print("指定字符内随机生成3个字符且元素不可重复:",
            fk.random_elements(elements=("a", "B", "c", "D"), unique=True, length=3))
      print("随机生成一个ASCII字母(a~z大小写):", fk.random_letter())
      print("随机生成一个长度为16的二进制编码:", fk.binary(length=16))
      
      print("随机生成一个词语:", fk.word())
      print("随机生成多个词语(默认3个):", fk.words())
      print("指定范围内随机选择2个词语:", fk.words(ext_word_list=["啊", "哈哈", "gaga", "嘿嘿"], nb=2))
      print("随机生成一条句子:", fk.sentence())
      print("随机生成一条2个词组成的句子:", fk.sentence(nb_words=2))
      print("指定范围内随机组合生成1句话:", fk.sentence(ext_word_list=["abc", "def", "ghi", "jkl"]))
      print("随机生成多条句子(默认3条):", fk.sentences())
      print("指定范围内随机组合生成3句话:", fk.sentences(ext_word_list=["abc", "def", "ghi", "jkl"]))
      print("随机生成一个段落(默认3句):", fk.paragraph())
      print("随机生成一个5句话的段落:", fk.paragraph(nb_sentences=5))
      print("指定范围内随机组合生成3个段落:", fk.paragraph(ext_word_list=["abc", "def", "ghi", "jkl"]))
      print("随机生成多个段落(默认3个):", fk.paragraphs())
      print("随机生成5个段落:", fk.paragraphs(nb=5))
      print("指定范围内随机组合生成3个段落:", fk.paragraphs(ext_word_list=["abc", "def", "ghi", "jkl"]))
      print("随机生成一段文本:", fk.text())
      print("随机生成160个字:", fk.text(max_nb_chars=160))
      print("指定范围内随机组合生成80个字:", fk.text(ext_word_list=["abc", "def", "ghi", "jkl"], max_nb_chars=80))
      
    7. 随机生成列表/元组/字典/集合/迭代器/json
      print("随机生成一组list数据:", fk.pylist())
      # ↓随机生成一组指定数据类型的3组数据组成的list并指定允许使用的数据类型
      print(fk.pylist(nb_elements=3, value_types=[int, str, tuple], allowed_types=[bool, str, float, int]))
      
      print("随机生成一组tuple数据:", fk.pytuple())
      # ↓随机生成一组指定数据类型的2组数据组成的tuple并指定允许使用的数据类型
      print(fk.pytuple(nb_elements=2, value_types=[str, float], allowed_types=[bool, str, float]))
      
      print("随机生成一组dict数据:", fk.pydict())
      # ↓随机生成一组指定数据类型的3组数据组成的dict并指定允许使用的数据类型
      print(fk.pydict(nb_elements=2, value_types=[int, str, list], allowed_types=[bool, str, float, int]))
      
      print("随机生成一组set数据:", fk.pyset())
      # ↓随机生成一组指定数据类型的3组数据组成的set并指定允许使用的数据类型
      print(fk.pyset(nb_elements=3, value_types=str, allowed_types=[bool, str, float]))
      
      print("随机生成一组iterable数据:", fk.pyiterable())
      # ↓随机生成一组指定数据类型的3组数据组成的iterable并指定允许使用的数据类型
      print(fk.pyiterable(nb_elements=3, value_types=[int, str], allowed_types=[int, str, float]))
      
      print("随机生成一份10组json数据组成的列表:", fk.json())
      # ↓随机生成一份指定内容的1组json数据
      print(fk.json(
          data_columns={"userId": "uuid4", "token": "md5", "Info": {"name": "user_name", "telephone": "phone_number"}},
          num_rows=1))
      # ↓随机生成一份指定内容的缩进为2的1组json数据
      print(fk.json(data_columns={"userId": "uuid4", "Info": ["user_name", "ssn", "phone_number"]}, num_rows=1, indent=2))
      # ↓随机生成一份指定内容的1组字节形式的json数据
      print(fk.json_bytes(data_columns={"Info": ["uuid4", "user_name", "ssn", "phone_number"]}, num_rows=1))
      # ↓随机生成3行name为20pyint为3的固定宽度的数据并居中对齐,默认left,可设置middle、right
      print(fk.fixed_width(data_columns=[(20, "name"), (3, "pyint", {"min_value": 80, "max_value": 120})], align="middle",
                           num_rows=3))
      
    8. 随机生成文件相关的信息
      # ↓随机生成3行带表头的有编号的以逗号分隔的数据
      print(fk.csv(header=("姓名", "地址", "身份ID", "手机号"),
                   data_columns=("{{name}}", "{{address}}", "{{ssn}}", "{{phone_number}}"), num_rows=3, include_row_ids=True))
      # ↓随机生成5行带表头的无编号的以管道符分隔的数据
      print(fk.psv(header=("员工编号", "员工姓名", "手机号"),
                   data_columns=("{{random_number}}", "{{name}}", "{{phone_number}}"), num_rows=5, include_row_ids=False))
      # ↓随机生成2行无编号的以制表符分隔的数据
      print(fk.tsv(data_columns=("{{phone_number}}", "{{name}}", "{{ssn}}"),
                   num_rows=2, include_row_ids=True))
      # ↓随机生成3行无编号的以csv.excel分隔的数据,其实也是逗号分隔,只是数据无双引号
      print(
          fk.dsv(dialect="excel", data_columns=("{{phone_number}}", "{{name}}", "{{ssn}}"), num_rows=3, include_row_ids=True))
      # ↓随机生成3行无编号的以csv.excel分隔的数据,也是制表符分隔,只是数据无双引号
      print(fk.dsv(dialect="excel-tab", data_columns=("{{phone_number}}", "{{name}}", "{{ssn}}"), num_rows=3,
                   include_row_ids=True))
      
    9. 随机生成颜色/表情
      print("随机生成一种颜色:", fk.color())
      print("随机生成一种颜色:", fk.color_name())
      # ↓支持的颜色选项:yellow/blue/orange/green/pink/purple/monochrome
      print("随机生成一种不同色调的红色:", fk.color(hue="red"))
      # ↓支持的亮度选项:light/dark/bright/random
      print("随机生成一种不同亮度的颜色:", fk.color(luminosity="light"))
      print("随机生成一个三元组颜色:", fk.hex_color())
      print("随机生成一种RGB格式颜色色值:", fk.rgb_color())
      print("随机生成一种CSS格式的RGB颜色色值:", fk.rgb_css_color())
      print("随机生成一个安全色名称:", fk.safe_color_name())
      print("随机生成一个安全色色值:", fk.safe_hex_color())
      
      print("随机生成一个emoji表情:", fk.emoji())
      

      以上所有入参均可为空,类似功能的参数基本一致,未详尽之处请自行尝试

    10. 每次请求获取相同的数据

      以上每个字段生成的数据都是随机的,但是了解编程的都明白计算机的这种随机只是一种伪随机,其随机性是可复现的,所以若想要每次生成的数据都是相同的,可通过固定住类方法的随机种子进而获得相同数据。在所需位置上方加上一条 Faker.seed(num)即可,使用seed(num)函数且给定同一个num值时,无论执行多少次获取随机数操作,得到的均为同一个数,比如:

      # 创建test1.py
      from faker import Faker
      
      fk = Faker(locale="zh_CN")
      print("随机生产一个日期和时间:", fk.date_time())			 # 2003-07-08 04:23:08
      Faker.seed(666)
      print("随机生成一个姓:", fk.last_name())					 # 孙
      print("随机生成一个女性常用姓:", fk.last_name_female())	 # 鲁
      print("随机生成一个男性常用姓:", fk.last_name_male())		 # 周
      

      如上,每次请求的时间都会变更,而3个获取姓氏的结果都不会变,之后可通过使用seed_instance()方法切换到自己的randomRandom实例,不影响test1.py的文件内容,比如:

      # 创建test2.py
      from faker import Faker
      
      fk = Faker(locale="zh_CN")
      print("随机生产一个日期和时间:", fk.date_time())
      fk.seed_instance(666)
      print("随机生成一个姓:", fk.last_name())					 # 孙
      print("随机生成一个女性常用姓:", fk.last_name_female())	 # 鲁
      print("随机生成一个男性常用姓:", fk.last_name_male())		 # 周
      print("随机生成一个姓名:", fk.name())
      

      以上每次请求的时间都会变更,但3个获取姓氏的结果会与test1.py中的结果一致,之后获取姓名的结果也会是固定数据

    11. Faker的应用
      1. 结合pymysql库将数据插入到数据库中

        关于pymysql的具体使用方法可通过查看官方文档了解,遇到个报错RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods,意思是此两种加密方式需要cryptography包,所以执行命令pip install cryptography安装即可

        # 创建test3.py
        import pymysql.cursors
        from faker import Faker
        
        fk = Faker(locale="zh_CN")
        
        class SQLFaker():
            def __init__(self):
                try:
                    self.db = pymysql.connect(		# 连接数据库信息
                        host="192.166.66.45",
                        port=3306,
                        user='root',
                        password="usTxxxxd&0",
                        database="test",
                        charset="utf8mb4")
                except pymysql.Error as e:
                    print(f'连接数据库失败!{e}')
        
                self.cursor = self.db.cursor()  	# 使用cursor()方法创建一个游标对象,用于操作数据库
        
            def createDabate(self):
                try:
                    sql = """CREATE TABLE `employees` (
                            `userid` varchar(50) UNIQUE COMMENT '员工id',
                            `ename` VARCHAR (50) NOT NULL COMMENT '姓名',
                            `username` VARCHAR (20) NOT NULL COMMENT '用户名',
                            `password` VARCHAR (50) NOT NULL COMMENT '登录密码',
                            `gender` VARCHAR (50) DEFAULT '-1' COMMENT '1表示男,0表示女,-1表示未知',
                            `IDNum` VARCHAR (50) NOT NULL UNIQUE COMMENT '身份ID',
                            `phoneNum` VARCHAR (50) NOT NULL COMMENT '手机号码',
                            `email` VARCHAR (50) COMMENT '邮箱',
                            `birthday` DATE COMMENT '生日',
                            `createtime` DATETIME COMMENT '创建时间'
                            ) DEFAULT CHARSET = utf8mb4 COMMENT = '员工信息表'"""
                    self.cursor.execute(sql)  			 # 执行SQL语句,创建数据表
                    print("employees表创建成功!")
                except pymysql.Error as e:
                    if str(e).split(",")[0] == "(1050":
                        print("employees表已存在,将尝试直接插入数据!")
                    else:
                        print(f'创建数据表失败!{e}')  		# 否则抛出异常
        
            def insertFakedata(self, num):
                try:
                    for i in range(num):
                        sql = """INSERT INTO `employees` VALUES('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')""" % (
                            fk.uuid4(),                     # 用户id
                            fk.name(),                      # 用户姓名
                            fk.user_name(),                 # 用户名
                            fk.password(),                  # 密码
                            fk.random_int(min=-1, max=1),   # 性别
                            fk.ssn(),                       # 身份ID
                            fk.phone_number(),              # 手机号码
                            fk.free_email(),                # 邮箱
                            fk.date_of_birth(minimum_age=20, maximum_age=30)    # 生日,20~30岁之间
                            fk.date_time_between_dates()	# 创建时间
                        )
                        self.cursor.execute(sql)	# 执行SQL语句,插入数据
                        self.db.commit()  			# 提交插入的数据,若缺少即使执行成功,数据库也不会显示数据
                    print(f"成功插入{num}条数据!")
                except pymysql.Error as e:
                    print(f'插入数据失败!{e}')
        
                self.cursor.close()  				# 关闭游标对象
                self.db.close()  					# 关闭数据库
        
        if __name__ == '__main__':
            SQLFaker().createDabate()  				# 执行创建数据库
            SQLFaker().insertFakedata(500)			# 执行插入500条数据
        

      2. 结合openpyxl库将数据导出到Excel中
        # 创建test4.py
        from faker import Faker
        from openpyxl import load_workbook
        from openpyxl.styles import Font, PatternFill
        from openpyxl.utils import get_column_letter
        from openpyxl.styles.alignment import Alignment
        from openpyxl.styles.borders import Border, Side
        
        fk = Faker("zh_CN")
        
        def save_to_excel():
            wb = load_workbook("E:/Fakerdata.xlsx")  	# 打开Excel文件
            sheet = wb[wb.sheetnames[0]]  				# 选择表1
            side = Side(style='thin', color="000000")   # 设置单元格边框线条样式
            # ↓配置标题信息
            excel_header = ["编号", "姓名", "身份ID", "手机号", "邮箱", "所属公司", "是否在职"]
            for h in range(len(excel_header)):
                sheet.cell(row=1, column=h + 1, value=excel_header[h])
                sheet.freeze_panes = "A2"  # 冻结表头
                # ↓设置标题背景色、字体样式、大小并垂直居中,通过将数字转换为字母获取设置的单元格
                sheet[f"{get_column_letter(h + 1)}1"].font = Font(name=u"楷体", bold=True, size=13)
                sheet[f"{get_column_letter(h + 1)}1"].alignment = Alignment(horizontal="center", vertical="center")
                sheet[f"{get_column_letter(h + 1)}1"].border = Border(left=side, right=side, top=side, bottom=side)
                sheet[f"{get_column_letter(h + 1)}1"].fill = PatternFill(fill_type="solid", fgColor="FCFC0C")
        
            # 随机生成1000条数据,同时设置单元格样式
            for i in range(1000):
                for h in range(len(excel_header)):
                    id = fk.random_number(digits=5)  # 随机生成5位数
                    name = fk.name()  				 # 随机生成姓名
                    ssn = fk.ssn()  				 # 随机生成身份ID
                    phone = fk.phone_number()  		 # 随机生成手机号
                    email = fk.email()  			 # 随机生成邮箱
                    company = fk.company()  		 # 随机生成公司名称
                    status = fk.words(ext_word_list=["在职", "已离职"], nb=1)[0]  # 在指定两个字中随机选择一个
        
                    sheet.cell(row=i + 2, column=1, value=id)
                    sheet.cell(row=i + 2, column=2, value=name)
                    sheet.cell(row=i + 2, column=3, value=ssn)
                    sheet.cell(row=i + 2, column=4, value=phone)
                    sheet.cell(row=i + 2, column=5, value=email)
                    sheet.cell(row=i + 2, column=6, value=company)
                    sheet.cell(row=i + 2, column=7, value=status)
                    # ↓设置生成内容的字体样式、大小并上下居中靠左对齐,通过将数字转换为字母获取设置的单元格
                    sheet[f"{get_column_letter(h + 1)}{i + 2}"].font = Font(name=u"宋体", size=11)
                    sheet[f"{get_column_letter(h + 1)}{i + 2}"].alignment = Alignment(horizontal="left", vertical="center")
                    sheet[f"{get_column_letter(h + 1)}{i + 2}"].border = Border(left=side, right=side, top=side, bottom=side)
        
            wb.save("E:/Fakerdata.xlsx")  # 保存Excel文件
        
        if __name__ == '__main__':
            save_to_excel()
        

      3. 在Pytest中使用Faker随机生成入参
        # 创建test5.py
        from faker import Faker
        import pytest, requests
        
        fk = Faker(locale="zh_CN")
        # Faker.seed(1)				# 测试创建同名文章接口响应情况时,使用seed获取相同结果即可
        
        @pytest.mark.repeat(5)		# 使用装饰器设置执行次数
        def test_art():
            res_url = "http://192.166.66.45:8090/api/admin/posts"
            header = {"Admin-Authorization": "xxxxxx91f43942b0b74803445771cfee"}
            # 定义传参,入参由Faker随机生成
            art_data = {
                "title": fk.sentence(),
                "originalContent": fk.text(200),
                "status": fk.words(ext_word_list=["DRAFT", "PUBLISHED"], nb=1)[0],  # 在指定两个单词中随机选择一个
                "slug": fk.pystr(),
                "tagIds": [fk.random_int(min=1, max=6)],
                "categoryIds": [1]
            }
            r_art = requests.request(method="post", url=res_url, headers=header, json=art_data)
            assert r_art.json()["message"] == "OK" and r_art.status_code == 200  	# 断言
        
        if __name__ == "__main__":
            pytest.main(["-sv", "test5.py"])
        

    在使用这些伪数据时,需要注意数据的格式,请根据实际情况进行数据格式转换,关于Faker更多详细的介绍及参数请查看官方文档

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python中Faker库详解:随机数据生成器

    发表评论