影刀RPA 随机数与模拟数据生成测试数据准备作者林焱开发RPA流程时经常需要测试数据来验证流程是否正常——测试表单填写需要随机姓名和手机号、测试数据处理需要随机数量的数据行、测试文件操作需要随机文件名。手动造数据太慢这篇文章讲清楚怎么用Python快速生成各种模拟测试数据。一、什么情况用什么场景推荐方法说明生成随机数random模块基础随机数生成随机姓名预设姓氏随机组合中文姓名生成随机手机号号段随机数字11位手机号生成随机日期randomdatetime日期范围内随机生成随机选择random.choice从列表随机选生成随机字符串stringrandom指定长度的字符串批量生成测试数据Faker库一行代码生成完整假数据生成随机文件写入随机内容测试文件操作生成随机Excelopenpyxl随机数据测试数据处理二、怎么做2.1 基础随机数拼多多店群自动化报活动上架importrandom# 设置随机种子可重复random.seed(42)# 随机整数print(random.randint(1,100))# 1-100之间的整数print(random.randrange(0,100,5))# 0-100之间5的倍数# 随机小数print(random.random())# 0.0-1.0之间print(random.uniform(10.5,99.9))# 指定范围的小数# 从序列中随机选择colors[红,黄,蓝,绿,黑,白]print(random.choice(colors))# 随机选择多个可重复print(random.choices(colors,k3))# 随机选择多个不重复print(random.sample(colors,3))# 打乱列表顺序numslist(range(1,11))random.shuffle(nums)print(nums)2.2 生成随机中文姓名importrandom# 常见姓氏surnameslist(赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮卞齐康伍余元卜顾孟平)# 名字用字name_charslist(伟芳娜秀英敏静丽磊强洋勇艳杰娟涛明超秀峰平刚桂英华慧巧美娜静淑惠珠翠雅芝玉萍红娥玲芬芳燕彩春菊兰凤洁梅琳素云莲真环雪荣爱妹霞香月莺媛艳瑞凡佳嘉琼斌能睿诚晓明晨辰帆辉杰天浩宇轩博思远)defgenerate_name():生成随机中文姓名surnamerandom.choice(surnames)# 名字1-2个字name_lengthrandom.choice([1,1,2])# 单字名概率更高given_name.join(random.choices(name_chars,kname_length))returnsurnamegiven_name# 生成10个姓名for_inrange(10):print(generate_name())2.3 生成随机手机号importrandom# 手机号段phone_prefixes[130,131,132,133,134,135,136,137,138,139,150,151,152,153,155,156,157,158,159,170,176,177,178,180,181,182,183,184,185,186,187,188,189,191,198,199]defgenerate_phone():生成随机手机号prefixrandom.choice(phone_prefixes)suffix.join(random.choices(0123456789,k8))returnprefixsuffix# 生成10个手机号for_inrange(10):print(generate_phone())2.4 生成随机邮箱和地址importrandomimportstringdefgenerate_email():生成随机邮箱username.join(random.choices(string.ascii_lowercasestring.digits,krandom.randint(6,12)))domains[qq.com,163.com,gmail.com,outlook.com,126.com,sina.com]domainrandom.choice(domains)returnf{username}{domain}defgenerate_address():生成随机地址provinces[北京市,上海市,广东省,浙江省,江苏省,四川省,湖北省,湖南省]cities[朝阳区,海淀区,浦东新区,天河区,西湖区,武侯区,江汉区,岳麓区]streets[人民路,解放路,建设路,中山路,和平路,文化路,科技路,创新大道]provincerandom.choice(provinces)cityrandom.choice(cities)streetrandom.choice(streets)numberrandom.randint(1,200)buildingrandom.randint(1,30)roomrandom.randint(101,2505)returnf{province}{city}{street}{number}号{building}栋{room}室for_inrange(5):print(f邮箱:{generate_email()})print(f地址:{generate_address()})print()2.5 生成随机日期importrandomfromdatetimeimportdatetime,timedeltadefgenerate_date(start_date,end_date):在指定范围内生成随机日期deltaend_date-start_date random_daysrandom.randint(0,delta.days)returnstart_datetimedelta(daysrandom_days)defgenerate_datetime(start_date,end_date):在指定范围内生成随机日期时间deltaend_date-start_date random_secondsrandom.randint(0,int(delta.total_seconds()))returnstart_datetimedelta(secondsrandom_seconds)# 2025年1月1日 到 2026年7月1日 之间的随机日期startdatetime(2025,1,1)enddatetime(2026,7,1)for_inrange(5):dtgenerate_datetime(start,end)print(dt.strftime(%Y-%m-%d %H:%M:%S))2.6 生成随机字符串importrandomimportstringdefgenerate_random_string(length,charsetNone):生成随机字符串ifcharsetisNone:charsetstring.ascii_lettersstring.digitsreturn.join(random.choices(charset,klength))# 各种随机字符串print(generate_random_string(8))# aB3xK9mNprint(generate_random_string(6,string.digits))# 385921print(generate_random_string(4,string.ascii_uppercase))# XKQMprint(generate_random_string(32,string.hexdigits.lower()))# a3f8b2c1...print(generate_random_string(10,一二三四五六七八九十))# 三七八二...# 生成UUID更规范的唯一IDimportuuidprint(str(uuid.uuid4()))# 550e8400-e29b-41d4-a716-4466554400002.7 批量生成测试数据到Excelimportrandomimportopenpyxlfromdatetimeimportdatetime,timedeltadefgenerate_test_excel(num_rows,output_path):生成测试数据Excel# 准备随机数据池surnameslist(赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨)name_charslist(伟芳娜秀英敏静丽磊强洋勇艳杰娟涛明超)departments[销售部,技术部,市场部,人事部,财务部,运营部]positions[专员,主管,经理,总监,实习生]cities[北京,上海,广州,深圳,杭州,成都,武汉]phone_prefixes[138,139,150,151,186,187,188]# 生成数据data[]start_datedatetime(2020,1,1)end_datedatetime(2026,6,30)foriinrange(1,num_rows1):namerandom.choice(surnames).join(random.choices(name_chars,krandom.choice([1,2])))departmentrandom.choice(departments)positionrandom.choice(positions)phonerandom.choice(phone_prefixes).join(random.choices(0123456789,k8))emailfuser{i}example.comcityrandom.choice(cities)salaryrandom.randint(5000,50000)hire_dategenerate_date(start_date,end_date)data.append([i,name,department,position,phone,email,city,salary,hire_date.strftime(%Y-%m-%d)])# 写入Excelwbopenpyxl.Workbook()wswb.active ws.title员工数据headers[ID,姓名,部门,职位,手机号,邮箱,城市,月薪,入职日期]ws.append(headers)# 表头加粗forcellinws[1]:cell.fontopenpyxl.styles.Font(boldTrue)forrowindata:ws.append(row)# 自适应列宽forcolinws.columns:max_lenmax(len(str(cell.valueor))forcellincol)ws.column_dimensions[col[0].column_letter].widthmin(max_len4,25)wb.save(output_path)print(f生成{num_rows}条测试数据 →{output_path})returnoutput_pathdefgenerate_date(start,end):fromdatetimeimporttimedelta deltaend-startreturnstarttimedelta(daysrandom.randint(0,delta.days))# 生成100条测试数据# generate_test_excel(100, rD:\test_data\employees.xlsx)2.8 使用Faker库高级Faker是专门生成假数据的库支持中文# 安装pip install fakerfromfakerimportFaker# 创建中文假数据生成器fakeFaker(zh_CN)# 生成各种假数据print(f姓名:{fake.name()})print(f手机号:{fake.phone_number()})print(f邮箱:{fake.email()})print(f地址:{fake.address()})print(f公司:{fake.company()})print(f职位:{fake.job()})print(f日期:{fake.date_between(start_date-5y).strftime(%Y-%m-%d)})print(f身份证:{fake.ssn()})print(f银行卡:{fake.credit_card_number()})print(fIP地址:{fake.ipv4()})print(fURL:{fake.url()})print(f文本:{fake.text(max_nb_chars50)})# 批量生成print(\n 批量生成 )for_inrange(5):print(f{fake.name()}|{fake.phone_number()}|{fake.company()})三、有什么坑坑1随机数不随机没设种子导致无法复现TEMU店群矩阵自动化运营核价报活动importrandom# 不设种子每次运行结果不同正常print(random.randint(1,100))# 每次不同# 设种子每次运行结果相同用于测试复现random.seed(42)print(random.randint(1,100))# 每次都是同一个数测试时设种子可以复现问题生产环境不要设种子。坑2生成的手机号不合法importrandom# 错误完全随机11位数字phone.join(random.choices(0123456789,k11))# 可能生成 01234567890第一位是0不合法# 正确用真实号段prefixes[130,131,138,150,186,188,199]phonerandom.choice(prefixes).join(random.choices(0123456789,k8))坑3随机日期超出范围importrandomfromdatetimeimportdatetime,timedelta startdatetime(2026,1,1)enddatetime(2026,12,31)# 错误可能生成2月31日# month random.randint(1, 12)# day random.randint(1, 31)# date datetime(2026, month, day) # 2月31日报错# 正确用timedeltadeltaend-start random_datestarttimedelta(daysrandom.randint(0,delta.days))print(random_date.strftime(%Y-%m-%d))坑4Faker生成的地址不真实Faker生成的地址是随机拼接的不是真实地址。如果测试依赖真实地址数据如地理编码需要用真实数据集。坑5大批量生成数据太慢importrandomimporttime# 慢逐条生成starttime.time()data[]for_inrange(100000):data.append(random.randint(1,100))print(f逐条:{time.time()-start:.2f}秒)# 快批量生成starttime.time()data[random.randint(1,100)for_inrange(100000)]print(f列表推导式:{time.time()-start:.2f}秒)# 更快用numpyimportnumpyasnp starttime.time()datanp.random.randint(1,101,size100000)print(fnumpy:{time.time()-start:.2f}秒)总结模拟数据生成的核心要点基础数据用random模块——随机数、选择、打乱中文数据自己造池——姓氏、名字、号段等预设列表批量数据用Faker——一行代码生成完整的假人信息测试复现设种子——random.seed(42)让结果可复现大批量用numpy——比random快几十倍