☰
用ChatGPT高效生成测试数据:从Prompt到落地实践
2026/10/26 7:05:42 网站建设 项目流程

说实话,我第一眼看到“ChatGPT生成测试数据”这个标题时,心里是有点不服气的。干了六七年测试开发,手工造数、脚本造数、SQL灌数、甚至自己写数据工厂,什么路子都折腾过,怎么想都觉得AI顶多就是帮我把字段随机化,还能玩出花来?直到我真的把一份带完整业务规则的订单数据需求丢给它,几分钟后拿到一百条逻辑自洽、格式规整、连时间先后都对得上的JSON记录,我才意识到以前那一套手工拼字段的路子,确实到了该被重新审视的时候。

这篇文章不是概念科普,是我在实际项目里把ChatGPT当成“测试数据生成器”用下来的完整复盘。我会把为什么它能大幅提效、如何把业务规则翻译成Prompt、从单条数据到批量数据怎么落地、以及我踩过的那些坑和对应的排查方法,全部摊开来讲。无论你是刚接触测试的新人,还是正在为造数愁到头秃的测试开发,这篇文章都应该能给你一套可以直接抄作业的思路。

1. 为什么用ChatGPT生成测试数据:从手工造数到AI代劳

1.1 测试数据需求到底有多烦

测试数据这件事,表面上看起来是“随便造几条就行”,但真正到了业务系统里,约束条件多到你怀疑人生。我手头一个订单中台项目就是典型例子:订单状态有PENDING、PAID、SHIPPED、COMPLETED、CANCELLED,光这五个状态就能延伸出支付流水是否生成、退款单是否存在、售后入口是否开放等一系列关联数据。再叠加用户等级、优惠券类型、收货地址、下单时间与支付时间的前后关系,一条可用的测试数据往往是“一个字段错了,整条链路都跑不通”。

手工造数最崩溃的点在于,你为了测某一个状态组合,必须把一堆基础字段先凑齐。比如要测“会员折扣与满减券叠加”,你需要构造一个特定等级的用户、一张有效期内且满足门槛的优惠券、一个金额刚好卡在门槛边界的订单。每次改一个条件,其他字段还得跟着联动,这种重复劳动做久了,人是会麻木的,而且特别容易出错——我经常出现手动改完了金额,却忘了改优惠券实付金额之类的问题。

1.2 传统造数方式的三个痛点

除了手工复制粘贴,常规方法无非是写脚本随机生成,或者直接从生产环境脱敏拷贝。这两条路我都走过,各自的痛点也很明显。

脚本造数的问题是维护成本高。你写一个Python脚本,用Faker库生成姓名、手机号、地址,再用random拼订单金额和状态,一开始很爽。但业务规则一变,比如新增了“跨境订单需要海关申报信息”的字段,你就得去改脚本、改映射、跑回归,脚本本身的逻辑甚至比被测系统的某些模块还复杂。更麻烦的是,脚本里写死的枚举值很容易和线上代码里的枚举不同步,过了几个月再跑,生成的数据根本不被接口接受。

生产数据脱敏则是合规风险和工作量两头堵。脱敏工具要配,敏感字段要扫,关联表要一起处理,一套流程走下来,不比手工造数省时间。而且很多测试场景需要的“脏数据”“异常数据”“边界数据”,生产环境里根本不存在,你还得额外再造。

1.3 ChatGPT在造数这件事上的天然优势

与之相比,ChatGPT在生成测试数据上的优势是“降维打击”式的。它天然理解自然语言约束,你不需要写代码,只要用清晰的规则描述需求,它就能把字段、格式、枚举、关联关系组合成结构化数据。这相当于把一个“可编程的数据生成器”的交互门槛直接从代码级别降到了说话级别。

更重要的是,它具备上下文归纳能力。你可以先告诉它业务背景,再描述字段规则,最后附加一批真实样例,它能根据这些信息反推出数据规律,并且生成的数据在风格、格式上高度一致。另一个对我帮助很大的点是它支持多轮修正。我生成完数据后如果发现某个字段不符合预期,直接说“把金额范围改到100到500之间,并且让所有SHIPPED状态的订单都带上物流单号”,它会在已有基础上重新输出,不用像脚本改配置那样重头再来。

2. 整体设计思路:先拆需求,再写Prompt

2.1 测试数据的本质是“带约束的随机”

很多人在用AI生成数据时第一步就错了,上来就是“帮我生成100条订单数据”,然后一看结果,全是逻辑混乱的垃圾。原因在于没有理解测试数据的本质:它不是纯随机,而是在一组明确约束条件下的随机采样。

一个字段至少包含四层信息:数据类型、取值范围、业务枚举、字段间关联。举例,“订单金额”不是随便一个数字,它必须在0到一个合理上限之间,且带有两位小数;如果订单使用了优惠券,实付金额应该等于订单总金额减去优惠金额;如果订单状态是PAID,那么支付时间一定不能早于下单时间。这些约束不写在Prompt里,AI就只能在“什么都生成”和“生成得花哨但错误”之间摇摆。

所以我的建议是在写Prompt前,先把这个数据需求拆成一张字段清单。你不需要画什么复杂的图,就用表格列出字段名、类型、格式要求、范围、枚举值、与其他字段的关系。这张清单既是给机器的指令,也是你自己梳理需求的工具。很多时候,我写着写着就发现业务规则里还有模糊的地方,反而是AI造数据之前先帮我把需求缺口暴露了出来。

2.2 如何把业务规则翻译成Prompt

把规则翻译成Prompt,核心就一句话:不要省略任何约束。你脑子里的“正常订单”,可能在系统里包含了几十个隐式默认值,但AI不知道你的默认值是什么,它只会根据字面意思生成。

我给一个实际转化过程。假设业务需求是“生成一条已支付的普通会员订单”,完整Prompt我大概会写成这样:

请扮演测试数据生成器。生成一条订单数据,要求如下: 1. order_id:10位数字,字符串类型,不重复。 2. user_id:格式为U+5位数字,范围U10001到U20000。 3. user_level:枚举,可选值[normal, silver, gold, platinum],本次取normal。 4. amount:10.00到5000.00之间的数字,保留两位小数,必须大于0。 5. discount_amount:0.00到100.00之间的数字,不能大于amount。 6. payable_amount:等于amount减去discount_amount。 7. status:本次取PAID。 8. status为PAID时,必须包含paid_at字段,格式为ISO8601时间,且晚于created_at。 9. address:对象,包含province、city、detail三个字段,内容为虚构的中国地址。 10. 输出为JSON对象,不要输出其他解释文字。

你可能会觉得这不就是把规则抄一遍吗?对,这就是正确姿势。把业务规则显式列出,其实就是在做“需求结构化”。我通常会在命令行或文档里先写好这份字段清单,然后复制进ChatGPT,而不是边聊边想。因为聊天窗口的上下文有限,如果第一轮就漏掉关键约束,后面多轮修正会浪费大量时间。

2.3 三种可落地的生成方案选型

在实际项目里,我不会总用同一种方式让ChatGPT生成数据。针对不同场景,我会用三种不同的配合模式。

第一种是“聊天窗口直接生成”,适合一次性小批量数据。比如联调环境需要5条特殊状态的订单,直接把Prompt发给ChatGPT,复制结果粘贴到接口测试工具里就行。优点是零成本启动,缺点是不能自动化,且数量大了容易输出到一半就截断。

第二种是“让ChatGPT生成Python脚本,再由本地脚本跑出大数据量”。当测试数据达到上千条,或者需要按规则生成一批随机数据并保存到文件时,我会让ChatGPT先写一个带参数的数据生成脚本,然后我在本地执行。这时候ChatGPT的角色是“帮我把造数逻辑翻译成代码”,而脚本本身承担了大规模生成能力。这个模式也是我实际项目里用得最多的。

第三种是“通过API调用,结合JSON Schema校验”。如果测试平台或CI流程需要自动生成数据,我会写一个调用OpenAI API的小服务,把Prompt模板和JSON Schema作为输入,拿到AI返回后再用Schema做校验,不合规就自动重新请求。这个模式适合工程化团队,适合把“AI造数”能力沉淀成一个公共服务。

三种模式的选型其实取决于数据量和对自动化程度的要求。日常手工测试用第一种,接口批量测试用第二种,持续集成环境用第三种。这个思路我建议你按团队现状来,没必要一上来就搞平台化,先用聊天窗口跑通流程,再逐步自动化也不迟。

3. 核心实操:用ChatGPT快速生成高质量测试数据

3.1 可以直接复制的Prompt模板

我自己把高频的造数需求沉淀成了一套模板,核心格式就是“角色+任务+字段定义+约束条件+输出格式”。这套模板不只是给我自己用,团队新人也靠它快速上手。

下面是一个偏通用的“订单中心测试数据”模板,你可以把它改成自己的业务字段:

你是测试数据生成助手。请根据以下规则生成N条订单数据。 全局规则: - 所有时间字段使用ISO8601格式,例如2025-06-01T10:30:00Z。 - 所有金额保留两位小数,单位是元。 - user_id在U10001到U20000范围内,不能重复。 - order_id为10位数字字符串,不能重复。 - status枚举:PENDING, PAID, SHIPPED, COMPLETED, CANCELLED。 - 如果status为PAID、SHIPPED或COMPLETED,则必须有paid_at,且paid_at不早于created_at。 - 如果status为SHIPPED或COMPLETED,则必须有shipping_time,且晚于paid_at。 - 每个地址对象包含province、city、detail,虚构中国城市地址。 - 每条记录必须包含字段:order_id, user_id, amount, discount_amount, payable_amount, status, created_at, address。 - payable_amount = amount - discount_amount,且不小于0。 请生成10条数据,status分布尽量覆盖5个枚举值,输出为JSON数组,不要输出解释。

这里有一个很关键的细节:我明确告诉它“输出为JSON数组,不要输出解释”。如果不加这句话,它会经常在你数据前面加一段“以下是根据您的需求生成的数据”,后面再加一句总结,复制起来非常痛苦。加了之后,输出干净得可以直接喂给接口。

3.2 从单条用例到批量数据:一次生成100条订单记录

在一次实际迭代中,我需要100条订单数据来压测列表接口的翻页和筛选逻辑。如果用老办法,我得先写脚本,预设订单号前缀、状态分布、金额范围等,至少半小时起步。用ChatGPT,我的操作大概分三步。

第一步,先发一条“生成5条数据”的Prompt,看看字段和格式是否符合预期。这一步相当于“试跑”,能用最小的代价发现问题。当时我发现AI生成的address对象里缺少邮编字段,而接口刚好需要,于是我立刻补上了规则。

第二步,修正Prompt要求“现在生成100条,在所有约束不变的前提下,尽量让amount覆盖10到5000的均匀分布,让status每个枚举值都至少有15条”。这个指令不能太模糊,要给它明确的数量分布,否则它可能会让CANCELLED特别多,别的状态特别少。

第三步,把它输出的100条JSON数组以文本形式保存到data.json文件,再用一条jq命令检查数量:

jq 'length' data.json jq 'group_by(.status) | map({status: .[0].status, count: length})' data.json

实测下来,90%的情况下一次生成就是100条,偶尔它会只给到80多条然后告诉你“生成了100条”,这种时候我会让它“继续补全到100条,不要重新生成已有的”。这个小小的修正指令非常管用,能避免全量重新生成导致的数据波动。

3.3 数据一致性保障:关联字段与状态机的处理技巧

AI生成数据最怕的就是字段之间逻辑不一致。最典型的是时间线乱套:created_at比paid_at还晚,shipping_at比paid_at还早,一放进业务接口就立刻报校验错误。所以我在Prompt里会非常刻意地强调状态机的先后顺序,而且会用“阶梯式时间”而不是“精确时间点”来描述。

我常用的一种做法是:给AI一个时间参照基准,比如“所有数据都假设发生在2025年6月1日到6月10日之间,created_at随机分布在这个区间,paid_at在created_at之后10分钟到2小时之间,shipping_time在paid_at之后2小时到1天之间”。这样即使用户不提供具体时间,AI也能基于相对顺序生成合理的时间线。

关联字段的一致性也是重灾区。比如订单里有user_id,紧接着用户详情接口又需要用户的手机号和注册时间。遇到这种情况,我一般会要求ChatGPT“先定义10个用户,再生成50条订单,每个订单随机引用这些用户,并确保同一个user_id在不同订单中手机号一致”。这个技巧本质上是让AI在一个批次内先建立“用户主数据”,再生成“事实表数据”,和数据库建模的思路一脉相承。

另外,我还会留一个“自我检查”步骤。生成完后,不急着复制走,而是再加一句指令:“请检查你生成的数据,是否存在paid_at早于created_at、payable_amount不等于amount减discount_amount、字段缺失等问题,若有请直接修正后输出完整数据。”这相当于让AI做了一遍静态校验,能拦下相当一部分低级错误。

3.4 导出与格式化:JSON、SQL、CSV怎么选

ChatGPT生成的测试数据一般有三种落地格式,各自的适用场景完全不同。

JSON是最常见的,适合直接粘贴到接口测试工具,比如Postman、Apifox,或者保存成文件供自动化脚本读取。它的缺点是体积大,如果数据量上万条,文件会很难读,而且不方便直接灌数据库。

SQL适合直接往测试库灌数据。我会让ChatGPT生成INSERT语句,比如:

INSERT INTO orders (order_id, user_id, amount, discount_amount, payable_amount, status, created_at, address_json) VALUES ('202506010001', 'U10001', 199.90, 10.00, 189.90, 'PAID', '2025-06-01T10:30:00Z', '{"province":"浙江省","city":"杭州市","detail":"西湖区文三路138号"}'), ...

注意,如果要生成大批量SQL,建议让ChatGPT生成“多行VALUES”的语句而不是每行一个INSERT,这样导入数据库会快很多。但也要提醒一句,ChatGPT生成的SQL在引号、反斜杠、日期格式上偶尔会出错,导入前最好用数据库客户端做一次语法校验。

CSV适合性能测试和数据处理。因为CSV没有复杂的嵌套结构,适合直接导入JMeter、LoadRunner,或者用于Pandas做数据分析。但它对字段嵌套不友好,如果address是对象,就必须先拍平成多列,所以我会让ChatGPT“把address展开成province,city,detail三列,输出CSV,表头包含所有字段”。这样出来的文件直接可以当测试数据源。

4. 质量把控与常见问题排查实录

4.1 AI生成测试数据最常见的5个翻车点

用ChatGPT生成数据不是每次都能一次成功,翻车点其实挺集中,我整理了一个速查表:

问题现象根本原因解决办法
数字字段被生成了带千分位逗号的字符串Prompt里没有明确要求“不要千分位”加一条“金额不要千分位,不要货币符号”
日期逻辑自相矛盾只说了“晚于”,没给具体时间区间指定基准日期,并给出相对时间范围
枚举值出现了不在范围内的值Prompt里的枚举没有写全,或AI自己“发散”显式列出所有枚举值,并要求“只允许出现这些值”
关联字段不一致,同一个人手机号字段不同没有建立主数据约束先让AI定义用户主数据,再生成订单引用它
输出内容夹杂解释文案,导致解析失败没有指定纯数据输出明确“只输出JSON/SQL/CSV,不要解释”

其实这些问题归纳起来就是一句话:你没把话说清楚。AI不是不聪明,而是它默认会按最宽松的方式理解你的需求。你把约束条件补全,它的输出质量会瞬间提升一个级别。

4.2 与手动造数、脚本造数的成本对比

很多人会问,既然我会写脚本,为什么还要用ChatGPT生成数据?我可以给一个非常粗的对比。

手工造一条数据,假设字段不多,5分钟。造100条数据,不可能手工复制100遍,所以通常是用Excel拉公式,然后转JSON,这个流程顺利的话也要1到2小时,而且一旦字段规则变了,全部重来。脚本造数第一次开发可能需要1小时左右,之后每次改规则也需要10到30分钟修改代码。而ChatGPT生成100条数据,从写Prompt到校验输出,我目前稳定在5到10分钟。

当然,这个提效不是无条件的。如果你每天要生成几十万条高度定制化的数据,那显然还是脚本更合适。但如果是日常接口测试、功能联调,这种“一百条以内、场景多样化、规则频繁调整”的场景,ChatGPT真的比脚本省事得多。我认为这不是“AI替代脚本”,而是“AI把脚本的创建成本从1小时压缩到5分钟,让临时造数不再有心理负担”。

4.3 使用ChatGPT客户端或CLI时的启动报错处理

在实际用ChatGPT辅助造数的时候,还经常会遇到工具本身起不来的问题,尤其是用桌面版或Codex CLI这类本地环境时。这里分享两个我遇到比较多的情况和处理思路。

第一个是启动报错“ChatGPT failed to start. Unable to locate the Codex CLI binary. Set codex_cli_path or ensure the Electron resources include bin/codex.”。这个报错的意思是应用找不到codex这个命令行工具。我遇到后先检查命令行里能不能直接执行codex,如果执行不了,大概率是Codex CLI没装好,重新安装一遍即可。如果命令行能执行,说明二进制存在,只是应用没找到路径,这时候在应用配置或环境变量里把codex_cli_path指向实际路径就行。比如在Linux下我常用的是/usr/local/bin/codex,在Windows下则可能是AppData下的具体路径。

第二个是“ChatGPT 无法加载 config.toml,因此此对话串无法继续。请修复 config.toml”。这个和conversation恢复机制有关,通常是配置文件里的model字段写错了,或者填了一个当前不可用的模型标识。比如之前我遇到过把模型标识写成gpt-5.6-sol,结果启动时直接报不支持。解决办法是打开config.toml,把model改成当前账号可用的模型名,或者把配置文件先备份再删掉,让应用重新生成一份默认配置。注意不要乱改其他参数,除非你明确知道含义。

这两种问题都和网络无关,也不是账号问题,主要是本地环境配置没对齐。处理原则很简单:先看二进制文件在不在,再看路径指向对不对,最后看配置文件里的模型标识是否合法。按这个顺序排查,基本几分钟就能解决。

4.4 数据脱敏与合规心法

最后聊一个和“安全”强相关但很多人忽略的点:AI生成测试数据时必须做脱敏。我见过有人直接把生产环境的Excel或日志丢给ChatGPT,让它“总结字段规则”或者“生成类似的数据”,这里面的风险非常高。因为生产数据里往往包含真实姓名、手机号、身份证号甚至银行账号,这些数据一旦进入第三方大模型服务,就有泄露和合规风险。

我的习惯是在Prompt里强制加一条“所有用户姓名、手机号、身份证号、地址必须是完全虚构的,不得参考任何真实人物”。同时,在给ChatGPT提供样例时,也会提前做替换或打码,绝不让真实数据原文出现在对话里。

另外一个容易被忽视的坑是“AI有时会生成恰好存在的真实手机号”。这其实不是它刻意抄谁,而是数据集里见过的号码模式很容易被组合出来。为了安全,我一般会要求生成的手机号以190或191这类虚拟号段开头,或者直接要求“手机号统一使用13800000000到13800009999之间”,这样就算被误拨也不会打给真实用户。身份证号更是直接生成一个受校验规则约束但前缀明显虚构的号码,或者干脆用Faker库再后处理一遍。

在这个问题上我的建议是:无论多着急,都不要把真实生产数据喂给AI,也不要让AI生成无法辨别真伪的个人信息。测试数据的第一原则是“假得足够像,但本质是假的”。

我在实际项目里已经把这套方法沉淀成了团队规范,写了一份“测试数据生成Prompt模板”,新人照着改字段就能用。从那以后,大家再也不用为了造数据去翻老脚本,也不必追着开发问字段含义。ChatGPT生成测试数据这件事,说到底不是“AI自己变魔法”,而是把需求描述清楚后,让AI帮你把重复劳动压缩到了极致。如果你也正在被造数折磨,我建议你从今天起,把一个你最近最头疼的造数场景拿出来,按上面的思路拆成规则写进Prompt,试试看会不会真的“怀疑人生”。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询