1. 概述

测试数据是测试执行的基石,但在实际项目中,获取高质量、合规且覆盖全面的测试数据从来都是难题。AI合成数据的出现,为这一长期困扰测试团队的痛点提供了一条全新的解决路径。通过大语言模型(LLM)和生成模型,我们可以按需生成结构化、语义合理且隐私安全的测试数据。

💡 核心洞察 测试数据问题本质上是「效率-安全-覆盖」的不可能三角。AI合成数据的独特价值在于:它不需要触碰真实数据即可逼近真实分布,从而在三个维度上同时得到改善。

1.1 测试数据的核心痛点

1.2 合成数据 vs 真实数据

对比维度真实生产数据AI合成数据
获取效率审批+脱敏,通常需3-10个工作日分钟到小时级按需生成
隐私合规需脱敏处理,仍有重识别风险原生无隐私泄露风险,天然合规
场景覆盖以正常业务为主,边界/异常少可定向生成边界、异常、安全攻击数据
数据量控制受限于生产数据规模任意规模,从小样本到海量压测数据
数据新鲜度需要定期从生产刷新按需即时生成最新格式的数据
关联一致性天然具备引用完整性需额外约束保证跨表关联一致性
统计分布反映真实业务分布取决于模型训练数据质量,可能存在偏差
数据标注无标注,需人工标注生成过程可同步产出预期标签
✅ 最佳策略 合成数据与真实数据不是二选一的关系。推荐采用「真实数据为骨架,合成数据为血肉」的混合策略:用脱敏的真实数据覆盖正向回归,用AI合成数据补充边界和异常场景。

2. AI合成数据的核心方法

不同数据类型对合成方法的要求截然不同。以下从文本、图像、结构化数据和异常数据四个维度,分别介绍当前最有效的AI合成方法。

2.1 基于LLM的文本数据合成

大语言模型在文本生成领域表现出色,可以用于合成各类测试所需的文本数据。与传统的规则模板方式不同,LLM能理解语义上下文,生成更自然、更多样的文本。

主要应用场景:

LLM文本合成的Prompt示例:

你是一位银行系统测试数据生成器。请生成10条银行客服对话记录,每条包含用户问题和客服回复。

## 数据要求
- 用户情绪分布:60% 正常咨询 / 20% 抱怨不满 / 10% 紧急挂失 / 10% 投诉
- 对话长度:3-6轮
- 涉及业务:账户查询、转账失败、卡片挂失、理财产品咨询
- 每轮对话需包含:说话人角色、时间戳、消息内容

## 输出格式
JSON数组,每条记录包含:
{
  "session_id": "唯一会话ID",
  "channel": "渠道(手机银行/网银/电话/柜面)",
  "sentiment": "用户情绪标签",
  "turns": [
    {"speaker": "user", "timestamp": "ISO时间", "content": "消息"},
    {"speaker": "agent", "timestamp": "ISO时间", "content": "消息"}
  ]
}

2.2 基于GAN/扩散模型的图像数据合成

对于需要图像测试数据的场景(如UI自动化测试中的截图对比、OCR识别测试、人脸识别测试等),GAN(生成对抗网络)和扩散模型是目前最主流的选择。

方法原理优势适用场景
GAN 生成器与判别器对抗训练 生成速度快,适合批量数据 UI截图模拟、证件图片生成
Stable Diffusion 文生图扩散模型 可控性强,文本描述即可生成 多样化场景图片、异常图像
数据增强工具 对真实图像进行变换 成本低,保留原始语义 OCR噪声测试、分辨率适配
条件生成模型 在约束条件下的定向生成 可生成特定类别/属性的图像 票据类型识别、印章真伪测试
⚠️ 图像合成的局限 GAN生成的图像在细节(如文字、线条)上可能出现扭曲或伪影,不适合直接用于高精度OCR测试。建议只在验证基本布局和颜色时使用合成图像,文字识别测试仍以真实样本为主体。

2.3 基于规则+AI的结构化数据合成

数据库表、API请求体、配置文件等结构化数据的合成,既需要保证字段级别的格式正确,又需要跨字段、跨表的语义一致性。单纯使用规则模板(如Faker库)可以解决格式问题,但难以处理复杂的业务逻辑;而纯LLM生成又可能产生格式错误。因此「规则+AI」的混合方案是最佳实践。

混合方案的分工:

LLM生成结构化数据示例(银行交易表):

请生成50条银行借记卡交易记录,写入以下表结构:

CREATE TABLE transactions (
  txn_id VARCHAR(32) PRIMARY KEY,
  card_no VARCHAR(19),
  txn_type VARCHAR(20),   -- 消费/取现/转账/退款
  amount DECIMAL(12,2),
  currency CHAR(3),        -- CNY/USD
  merchant VARCHAR(100),
  txn_time TIMESTAMP,
  status VARCHAR(10)       -- 成功/失败/处理中/已冲正
);

## 生成约束
- amount分布:70% 在 1-500 元,20% 在 500-5000 元,8% 在 5000-50000 元,2% 在 50000 元以上
- 失败交易占比约5%,包含:余额不足、卡片冻结、超限额、网络超时
- 退款交易占比约8%,对应之前的消费交易
- 时间范围:最近90天内,工作时间(9-18点)占比60%
- card_no去敏:前6位+后4位为真实BIN格式,中间用*号替代

以INSERT语句格式输出,并在每条后加注释说明该条数据的测试目的。

2.4 异常数据生成

异常数据是测试数据合集中最容易被忽视但又最关键的部分。AI在生成异常数据方面有天然优势——它可以从海量已知漏洞和错误模式中学习,系统性地构造各种破坏性输入。

AI擅长生成的异常数据类型:

⚡ 安全测试数据警示 AI生成的攻击Payload中可能包含真实可执行的恶意代码或真正有效的注入语句。在测试环境中使用时,务必确保隔离,避免攻击数据被误提交到生产系统或日志审计系统触发告警。

2.5 数据增强:从少量真实数据扩展

当已有少量真实数据样本时,数据增强可以成倍扩展测试数据集。AI增强超越了传统的「复制+扰动」,能够在语义层面进行变换。

常用的增强技术:

3. 数据质量保障

合成数据并非「生成即用」,其质量直接影响测试结果的可信度。以下是合成数据质量保障的核心维度。

3.1 数据真实性评估

合成数据需要在「像真实数据」和「不是真实数据」之间找到平衡——既要足够真实以触发实际业务逻辑,又不能是真实数据的简单复制。

评估维度:

3.2 数据多样性评估

多样性的缺失会导致测试遗漏。好的合成数据应该覆盖真实数据中不常见的「长尾场景」。

3.3 数据覆盖度评估

覆盖度评估回答的核心问题是:合成数据集是否提供了足够的「测试弹药」。

覆盖度类型评估指标目标
场景覆盖 测试用例-数据映射矩阵 每个测试用例有其对应的测试数据
参数组合覆盖 Pairwise / N-wise覆盖率 关键字段的两两组合不低于90%
代码路径覆盖 分支/条件覆盖关联度 合成数据能触发预期代码分支
状态机覆盖 状态转移矩阵覆盖 覆盖所有合法的状态转移路径

3.4 偏差检测

AI模型在训练过程中可能吸收了训练数据的固有偏见,这些偏见可能通过合成数据「悄无声息」地传递到测试环节。偏差检测需要关注的维度包括:

🔍 偏差检测的实操建议 建议为合成数据集建立「偏差仪表盘」:定期对比合成数据与真实数据的统计特征,将偏差值(如PSI/群体稳定性指数)纳入质量门禁。当偏差超过阈值时自动告警并触发重新生成。

3.5 隐私保护

虽然合成数据天然不需要直接使用真实数据,但仍需防范模型「记忆」训练数据导致的隐私泄露风险。

4. 银行业合成数据实践

银行业是测试数据合成需求最强、要求也最高的行业之一。监管合规的高压线、业务数据的敏感性、以及复杂的数据模型,使得银行测试数据合成成为一个极具挑战但也价值巨大的实践领域。

4.1 银行测试数据的特殊要求

要求维度具体内容对数据合成的影响
数据脱敏客户姓名、身份证号、手机号、卡号、地址等必须不可识别合成时应使用格式正确的「伪真实」数据,而非简单替换为随机字符串
监管合规满足银保监会1104报表、反洗钱(AML)、KYC等监管要求合成数据需包含合规验证所需的全部维度,不能有结构性缺失
格式一致性银行内各系统(核心、信贷、支付、风控)对数据格式有统一标准合成数据必须严格遵循行内数据字典和编码规范
金额精度银行交易金额通常精确到分(小数点后2位),利率计算更细注意浮点精度陷阱,合成时使用DECIMAL而非FLOAT
关联完整性核心系统、信贷系统、支付系统之间的数据通过流水号/凭证号关联合成数据需保持跨系统引用的完整性和一致性

4.2 AI生成合规的银行交易数据

银行交易数据的合成需要在「逼真」和「合规」之间取得精妙平衡。以下是经实践验证的合成策略:

4.3 信贷审批场景的测试数据生成

信贷审批是银行核心业务中最复杂的流程之一,也是测试数据合成价值最高的场景。AI可以系统性生成覆盖各类客户画像和审批路径的测试数据。

4.4 客户信息合成与隐私保护平衡

客户信息是测试中最敏感的数据类型。在银行场景下,AI客户信息合成需要满足以下「既要……又要……」的要求:

4.5 与现有数据脱敏流程的结合

目前已有成熟的生产数据脱敏流程,AI合成数据并非要替代它,而是作为有力的补充和增强。

结合策略建议:

🏦 实践建议 建议先在非生产环境(开发/测试环境)中试点AI合成数据的生成和验证流程,与现有脱敏流程并行运行1-2个迭代,收集质量数据和环节衔接问题后再考虑逐步扩大范围。

5. 工具链

5.1 主流数据合成工具对比

工具类型数据形态核心能力适用场景
SDV (Synthetic Data Vault) 开源框架 结构化/表格 基于GAN/Copula的表格数据合成,支持多表关联 数据库表数据合成、隐私保护数据集
Gretel.ai 商业SaaS 结构化/文本 差分隐私合成、质量报告自动生成 企业级合规、银行金融数据
Mostly AI 商业平台 结构化 高保真度结构化数据合成,含偏差检测 需要高度真实的报表/分析测试
OpenAI / Claude API LLM API 文本/JSON/代码 Prompt驱动,灵活生成任意格式数据 文本、日志、复杂业务数据
Faker + LLM 混合方案 结构化 Faker负责字段格式,LLM负责业务逻辑 快速生成中小规模数据库测试数据
Mockaroo 在线工具 结构化 可视化配置字段规则,支持API生成 快速原型验证、API Mock
JFairy 开源库 结构化 Java/多语言,生成符合地区格式的数据 集成到Java测试框架中的数据生成

5.2 提示词模板:生成特定格式的测试数据

以下是几个经过验证的Prompt模板,可直接用于生成常见测试数据类型。使用前请根据具体项目的字段定义和业务规则进行调整。

模板一:数据库Insert语句生成

你是一个数据库测试数据生成器。根据以下表结构生成用于测试的INSERT语句。

## 表结构
[在此粘贴 DDL CREATE TABLE 语句]

## 生成要求
- 生成 [N] 条记录
- 主键/唯一键不能重复
- 外键关联的数据需在对应的父表中存在
- 包含5%的边界值和异常数据(如空字符串、超长字符串、NULL等)
- 金额类字段使用DECIMAL(12,2)精度
- 时间为DDL中定义的合理范围
- 输出格式:纯SQL INSERT语句,每行一条

模板二:API测试报文生成

根据以下OpenAPI/Swagger接口定义,生成接口测试所需的JSON请求报文。

## 接口定义
[在此粘贴 OpenAPI 片段或接口描述]

## 生成场景
1. 成功场景:所有必填字段提供合法值
2. 参数缺失:逐一省略必填字段
3. 参数类型错误:将数字字段传入字符串,字符串传入数字等
4. 参数越界:数值超出范围、字符串超长、枚举值非法
5. 安全场景:在字符串字段中注入SQL/XSS Payload

## 输出格式
```json
[
  {
    "scenario": "场景名称",
    "method": "POST",
    "path": "/api/xxx",
    "headers": {"Content-Type": "application/json"},
    "body": { ... },
    "expected_status": 200,
    "expected_check": "断言描述"
  }
]
```

模板三:压力测试数据批量生成

生成用于性能压测的批量交易数据。数据量:[10万条],切分为 [10] 个文件。

## 数据规格
- 交易类型分布:70% 查询 / 20% 转账 / 8% 缴费 / 2% 外汇
- 交易金额:符合长尾分布(Pareto分布),大部分为小额,少量大额
- 账户数量:[5000] 个,20%为活跃账户(高频交易),80%为普通账户
- 并发时段:模拟上午9-11点和下午2-4点的交易高峰

## 文件要求
- CSV格式,UTF-8 with BOM
- 每个文件1万条
- 不同文件之间的账户可以复用(模拟同一账户的多次交易)

6. 常见坑点

基于行业实践总结,以下是AI测试数据合成中最常见的陷阱及其应对策略。

6.1 合成数据偏见转移到被测系统

AI合成数据中如果存在系统性偏见,这些偏见会通过测试过程「传染」给被测系统的评估体系。

6.2 过拟合到真实数据分布

AI模型可能过度记忆训练数据的特定模式,导致合成数据缺乏泛化性。

6.3 数据一致性问题

跨表、跨系统的关联数据一致性是合成数据最大的工程挑战之一。

⚡ 一致性问题的高危场景 会计分录不一致(借贷不平衡)是银行测试中的零容忍问题。在合成银行交易数据时,强烈建议在生成流程中内置「借贷校验」环节——每批次数据生成后自动进行试算平衡检查,不通过则不释放给测试使用。

6.4 评估数据质量的难度

「合成数据质量好」本身就是一条难以量化的评估准则。实践中常见以下评估误区:

应对策略:

6.5 坑点速查表

坑点典型表现严重程度预防措施
幻觉数据 LLM编造系统中不存在的业务编码、状态值 在Prompt中提供完整的枚举值/码表,并明确禁止编造
格式漂移 JSON/XML格式在大量生成时出现结构不一致 使用JSON Schema校验输出;分批次生成,减小单次Token窗口
重复生成 生成大量高度相似的记录(仅主键不同) 在Prompt中加入多样性约束;启用temperature参数控制随机性
依赖泄露 训练合成模型的真实数据包含不应被使用的敏感字段 训练前彻底剔除敏感字段;使用差分隐私训练
Token截断 长文档生成被截断,导致输出不完整 设置足够的max_tokens;分章节生成后拼接

🛠️ 实战演练

以下三个实战任务覆盖测试数据合成的核心场景,建议按顺序完成。每个任务均提供完整的场景背景、操作步骤和评估标准。

任务一:用LLM生成银行客户测试数据

📋 场景某银行零售系统新版客户信息模块即将上线,测试团队需要一批格式正确、语义合理且完全脱敏的客户信息数据用于功能验证和回归测试。
🎯 背景生产环境客户数据严格受控,审批流程至少需要5个工作日。你需要用LLM在30分钟内生成10条可直接投入测试的客户信息数据,数据需覆盖不同年龄段、职业类型和账户等级,且所有个人标识信息必须符合脱敏规范(不可追溯真实个人)。
📝 步骤
  1. 设计Prompt:编写一段Prompt,要求LLM生成10条银行客户信息,包含以下字段:客户姓名(脱敏,如"张*明")、性别、年龄(18-80岁合理分布)、身份证号(符合编码规则但非真实)、手机号(合法号段,中间4位脱敏)、职业、年收入区间、账户等级(普通/金卡/钻石)、开户日期(近3年内)。
  2. 设定约束条件:在Prompt中明确:年龄与职业需合理匹配、账户等级与年收入正相关、不同客户之间需保持多样性(避免生成10个"30岁程序员")。
  3. 调用LLM生成:将Prompt输入LLM(如Claude/GPT-4),获取生成的10条数据。
  4. 质量校验:逐条检查:① 身份证号是否通过校验位验证;② 手机号格式是否正确且中间4位已脱敏;③ 年龄-职业-年收入是否逻辑自洽;④ 10条数据是否存在重复或高度雷同。
  5. 格式标准化:将校验通过的数据整理为CSV或JSON格式,标注每条数据的测试用途(如"该条用于验证金卡客户转账限额")。
✅ 评估标准
  • 10条数据全部通过格式校验(身份证校验位、手机号格式)
  • 姓名、手机号已完成脱敏,不包含完整真实个人信息
  • 年龄、职业、年收入之间逻辑自洽率 ≥ 90%
  • 10条数据覆盖至少4种不同职业和3种账户等级
  • 无重复数据,每条数据的字段组合至少有一项明显差异
⏱️ 预计耗时30-45 分钟

任务二:异常数据生成 — 转账接口测试

📋 场景银行核心系统的转账接口(POST /api/transfer)需要在上线前进行全面的异常输入测试,验证接口的鲁棒性和安全性。该接口接收JSON请求体,包含转出卡号、转入卡号、转账金额、交易附言等字段。
🎯 背景传统测试往往只覆盖正向场景和少量边界值,导致接口在上线后频繁遭受异常输入攻击。你需要用LLM系统性地生成一套异常测试数据集,覆盖边界值、格式破坏、SQL注入、XSS等典型攻击向量,确保接口具备足够的防御能力。
📝 步骤
  1. 梳理接口字段:列出转账接口的所有字段及其类型、长度限制、格式约束(如卡号19位、金额DECIMAL(12,2)、附言最长200字符)。
  2. 编写异常生成Prompt:要求LLM为每个字段生成以下5类异常数据:
    • 边界值:最小值-0.01、最大值+0.01、0元、空字符串、超长字符串(201字符)
    • 格式破坏:卡号含字母、金额含特殊字符、负数金额、JSON结构错误
    • SQL注入:经典注入Payload(' OR '1'='1、UNION SELECT、'; DROP TABLE等)
    • XSS攻击:<script>alert(1)</script>、<img onerror=...>等
    • 业务逻辑异常:转出卡号=转入卡号、金额超过单笔限额、卡号不存在格式
  3. 生成测试数据集:将Prompt输入LLM,获取完整的异常JSON测试报文集合(每种类型至少2条)。
  4. 安全审查:检查生成的Payload是否包含真正可执行的恶意代码,确认测试环境隔离后再使用。
  5. 组织测试用例:将异常数据与预期结果(预期返回400/422错误码及具体错误信息)配对,形成可执行的测试用例文档。
✅ 评估标准
  • 至少生成20条异常测试数据,覆盖上述5个类别
  • 每条异常数据都配有预期HTTP状态码和预期错误信息描述
  • SQL注入Payload覆盖Union注入、布尔盲注、时间盲注至少3种类型
  • 边界值测试覆盖每个数值字段的最小值、最大值、零值和负值
  • 所有异常数据均为合法的JSON格式(即使是测试格式破坏的数据,也需区分"格式破坏的字段值"与"非法JSON"两种情况)
⏱️ 预计耗时45-60 分钟

任务三:数据增强 — 从3条扩展到30条

📋 场景你手上有3条来自业务方提供的真实客户数据样本(已脱敏),现在需要为压力测试准备30条多样化的合成数据。要求扩展后的数据既保留原始数据的业务特征,又具备足够的多样性以覆盖更广泛的测试场景。
🎯 背景直接复制粘贴3条样本10次无法满足测试需求——数据多样性不足会导致压测结果失真,无法暴露真实并发场景下的问题。你需要利用LLM的语义理解和变换能力,以3条种子数据为基础,扩展出30条形态各异但保持业务合理性的合成数据。
📝 步骤
  1. 准备种子数据:整理3条已脱敏的真实客户数据样本。示例:
    种子1: 王*明 | 男 | 35 | 310***199001012345 | 138****5678 | IT工程师 | 25-40万 | 金卡 | 2022-03-15
    种子2: 李*芳 | 女 | 28 | 440***199701012345 | 139****8901 | 教师 | 10-15万 | 普通 | 2023-06-01
    种子3: 赵*强 | 男 | 52 | 110***197301012345 | 136****2345 | 企业主 | 80-120万 | 钻石 | 2021-09-20
  2. 编写增强Prompt:要求LLM基于以上3条种子数据进行扩展,生成30条多样化数据。在Prompt中明确:
    • 保留种子数据的字段结构和脱敏格式
    • 职业类型在种子基础上升级扩展(如IT工程师 → 扩展出前端/后端/架构师/产品经理等)
    • 年龄、年收入在合理范围内波动(保持正相关性)
    • 账户等级分布调整为:普通50%、金卡35%、钻石15%
    • 开户日期在3年内随机分布
    • 每条数据需有明显差异,避免批量雷同
  3. 执行生成与分批校验:建议分3批(每批10条)调用LLM,避免单次Token限制导致输出截断。每批生成后立即校验。
  4. 多样性验证:统计30条数据中:① 职业种类数(目标 ≥ 12种);② 年龄分布是否覆盖各年龄段;③ 年收入区间覆盖度;④ 各账户等级占比是否接近设定目标。
  5. 生成数据报告:汇总生成结果,标注种子数据与扩展数据的对应关系,输出统计摘要(字段分布、覆盖率等)。
✅ 评估标准
  • 成功生成30条格式完整、逻辑自洽的客户数据
  • 职业类型 ≥ 12种,且与种子数据的职业有明显关联(非凭空编造)
  • 年龄-年收入正相关性保持率 ≥ 85%(如30岁以下年收入超过50万需有合理解释)
  • 账户等级分布偏差 ≤ ±5%(普通48-52%、金卡32-38%、钻石13-17%)
  • 30条数据中无完全重复记录(所有字段值完全相同)
  • 能清楚追溯每条扩展数据与哪条种子数据对应
⏱️ 预计耗时50-70 分钟

📋 案例研究:用LLM生成银行客户测试数据

背景

测试需要100条符合银行数据规范的客户信息数据。

过程

用LLM生成 → 数据校验 → 脱敏处理 → 格式转换。

结果

生成100条,校验通过85条,修复后100条可用。

启示

LLM生成数据效率高但需校验,复杂关联数据仍需人工调整。