脚本如何生成测试数据

wen 实用脚本 21

本文目录导读:

脚本如何生成测试数据

  1. 核心思路
  2. 使用 Python 脚本生成(最灵活、最推荐)
  3. 使用 JavaScript/Node.js 脚本生成
  4. 使用 SQL 与数据库内建函数生成
  5. 使用专门的命令行工具
  6. 高级场景与建议

生成测试数据是软件开发、数据库管理和测试中的常见需求,根据你的具体需求(如数据类型、规模、结构),有多种脚本和方法可以实现。

以下是几种常见的生成测试数据的方法和脚本示例,从简单到复杂:

核心思路

无论用什么语言,生成测试数据的核心思路通常是:

  1. 定义结构:需要什么类型的字段(姓名、年龄、日期、邮箱等)。
  2. 准备数据池:准备一批真实或模拟的样本数据(如常见的姓氏列表、城市名称)。
  3. 随机化:从数据池中随机选取,或使用算法生成随机数字、字符串、日期。
  4. 组合输出:将生成的字段组合成需要的格式(CSV, JSON, SQL文件, 或直接写入数据库)。

使用 Python 脚本生成(最灵活、最推荐)

Python 拥有大量优秀的库用于生成测试数据。

方法 A:使用 Faker 库(最强大,生成逼真数据)

Faker 库能生成从姓名、地址、电话号码到公司名、信用卡号、句子等几乎所有你可以想到的真实虚假数据。

安装:

pip install faker

示例 1:生成 100 条 JSON 格式的客户数据

from faker import Faker
import json
fake = Faker('zh_CN')  # 使用中文环境
customers = []
for _ in range(100):
    customers.append({
        "name": fake.name(),
        "address": fake.address().replace('\n', ' '),
        "phone_number": fake.phone_number(),
        "email": fake.email(),
        "company": fake.company(),
        "birthday": fake.date_of_birth(minimum_age=18, maximum_age=80).isoformat()
    })
# 保存为 JSON 文件
with open('customers.json', 'w', encoding='utf-8') as f:
    json.dump(customers, f, ensure_ascii=False, indent=2)
print("100条客户数据已生成到 customers.json")

示例 2:生成 1000 行 SQL INSERT 语句

from faker import Faker
fake = Faker()
sql_statements = []
for i in range(1, 1001):
    name = fake.name().replace("'", "''")  # 防止SQL注入
    email = fake.email()
    salary = fake.random_int(min=30000, max=150000, step=1000)
    sql = f"INSERT INTO employees (id, name, email, salary) VALUES ({i}, '{name}', '{email}', {salary});"
    sql_statements.append(sql)
# 保存为 SQL 文件
with open('employees.sql', 'w') as f:
    f.write('\n'.join(sql_statements))
print("1000条SQL插入语句已生成到 employees.sql")

方法 B:使用 pandas 结合 numpy(适合结构化表格数据)

如果你需要生成大量的表格数据(CSV 或 Excel 文件),pandas + numpy 是绝佳选择。

import pandas as pd
import numpy as np
from faker import Faker
fake = Faker()
# 设置随机种子,保证每次运行生成的数据一样(便于调试)
np.random.seed(42)
num_rows = 5000
data = {
    'ID': range(1, num_rows + 1),
    'Name': [fake.name() for _ in range(num_rows)],
    'Age': np.random.randint(18, 70, size=num_rows),
    'City': [fake.city() for _ in range(num_rows)],
    'Salary': np.random.normal(loc=60000, scale=15000, size=num_rows).astype(int)
}
df = pd.DataFrame(data)
# 保存为 CSV
df.to_csv('employees_data.csv', index=False, encoding='utf-8-sig')
# 保存为 Excel
df.to_excel('employees_data.xlsx', index=False, engine='openpyxl')
print(f"已生成 {num_rows} 条数据到 csv 和 excel 文件")

使用 JavaScript/Node.js 脚本生成

同样,JavaScript 也有 faker.js 库(现在常用 @faker-js/faker)。

安装:

npm install @faker-js/faker

示例:生成 100 条用户数据并输出为 JSON

const { faker } = require('@faker-js/faker');
const users = [];
for (let i = 0; i < 100; i++) {
  users.push({
    id: faker.string.uuid(),
    name: faker.person.fullName(),
    email: faker.internet.email(),
    address: {
      street: faker.location.streetAddress(),
      city: faker.location.city(),
      country: faker.location.country(),
    },
    jobTitle: faker.person.jobTitle(),
    avatar: faker.image.avatar(),
  });
}
// 输出 JSON 字符串
process.stdout.write(JSON.stringify(users, null, 2));
// 如果需要保存到文件,可以重定向输出:
// node generateData.js > users.json

运行: node generateUsers.js > users.json


使用 SQL 与数据库内建函数生成

如果你直接在数据库管理系统(DBMS)中操作,可以利用其自带的函数。

SQL Server 示例:生成 1000 条测试记录

-- 创建一个临时表或永久表
CREATE TABLE #TestUsers (
    UserID INT IDENTITY(1,1) PRIMARY KEY,
    FirstName NVARCHAR(100),
    LastName NVARCHAR(100),
    Email VARCHAR(255),
    SignupDate DATE,
    IsActive BIT
);
-- 插入 1000 行数据
WITH Numbers AS (
    SELECT TOP 1000 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS n
    FROM master.dbo.spt_values
)
INSERT INTO #TestUsers (FirstName, LastName, Email, SignupDate, IsActive)
SELECT
    -- 随机从几个名字中选取 (更复杂的话可以用多个CROSS JOIN)
    CHOOSE(1 + (n % 10), 'John', 'Jane', 'Tom', 'Lucy', 'Mike', 'Amy', 'Bob', 'Lily', 'Dave', 'Sara'),
    CHOOSE(1 + (n % 10), 'Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Davis', 'Miller', 'Wilson', 'Moore', 'Taylor'),
    -- 生成邮箱
    'user' + CAST(n AS VARCHAR) + '@example.com',
    -- 随机日期 (过去3年内)
    DATEADD(DAY, -ABS(CHECKSUM(NEWID())) % (365*3), GETDATE()),
    -- 随机布尔值
    CASE WHEN n % 3 = 0 THEN 0 ELSE 1 END
FROM Numbers;
-- 查看结果
SELECT TOP 10 * FROM #TestUsers;

PostgreSQL 示例

-- 使用 generate_series 和 random()
INSERT INTO test_data (name, value, created_at)
SELECT
    'Item ' || gs.n,
    random() * 1000,
    now() - (random() * interval '100 days')
FROM generate_series(1, 100) AS gs(n);

使用专门的命令行工具

random-utility / jte (Java)

如果你不介意用Java,random-beanspodam 可以很轻松地填充任意Java Bean。

mockaroo (图形化/API)

Mockaroo 是一个非常受欢迎的在线工具,你可以:

  1. 选择数据类型(姓名、日期、银行卡号等)。
  2. 设置格式(CSV, JSON, SQL, Excel)。
  3. 设置行数(免费版最多1000行/次)。
  4. 下载文件。

它也提供了CLI工具和API,可以集成到自动化流程中。


高级场景与建议

  • 大规模数据(百万级)

    • 对于Python,Faker 生成每条数据都有开销,速度较慢,可以考虑使用 pandas + numpy 的向量化操作,或者编写多线程/异步脚本。
    • 对于SQL,可以使用循环 + INSERT INTO ... SELECT 的方式(复制现有数据并稍作修改)来指数级增长数据量。
  • 保持数据一致性

    • 如果需求是“一个用户必须有一个订单,订单金额不能为负”,你需要编写逻辑来先创建用户,再为每个用户创建订单(或使用数据库外键和级联)。
    • 使用 FakerUnique 功能来保证某些字段(如邮箱/ID)唯一。
  • 性能测试数据

    • 需要生成大量、重复、边界值或符合特定分布的数据。numpyrandom 模块(如 normaluniform)在这方面非常有用。
  • 敏感数据脱敏

    • 如果你需要基于生产数据生成测试数据,请务必使用 Faker 等工具对真实姓名、手机号、身份证号等敏感字段进行脱敏替换,而非直接拷贝。
场景 推荐方法
快速、逼真的各类数据 Faker (Python) / @faker-js/faker (Node.js)
大规模结构化表格数据 pandas + numpy (Python)
在数据库内直接生成 generate_series (PG) / CTE + NEWID() (SQL Server)
一次性的、无代码需求 Mockaroo 网站
Java/Spring项目 podamrandom-beans

最佳实践: 明确需求 > 选择工具 > 编写脚本 > 校验数据完整性,最灵活的通常是 Python + Faker 组合。

抱歉,评论功能暂时关闭!