自动化脚本如何生成测试数据

wen 实用脚本 1

本文目录导读:

自动化脚本如何生成测试数据

  1. 核心原则
  2. 方法一:使用现成的测试数据生成库(最推荐)
  3. 方法二:使用自动化测试框架自带功能
  4. 方法三:批量生成数据库记录
  5. 方法四:从生产环境脱敏复制
  6. 高级技巧:约束与自定义数据
  7. 给不同类型测试的建议
  8. 总结步骤

生成测试数据是自动化测试中非常关键的环节,好的测试数据能覆盖正常流程、边界条件和异常情况,从而提高测试的覆盖率。

以下是几种常用的自动化生成测试数据的方法和脚本思路,从简单到复杂,你可以根据项目需求选择:

核心原则

  1. 可重复性:每次运行脚本生成的同一组数据(或特定种子)应完全一致。
  2. 随机性与可控性:既能生成随机数据覆盖不同场景,又能通过种子(Seed)或配置文件控制生成特定数据。
  3. 数据隔离:生成的测试数据应能在测试结束后方便地清理。

使用现成的测试数据生成库(最推荐)

几乎每种主流编程语言都有成熟的库,这是最快、最标准的方法。

Python 库:Faker

Faker 是生成假数据最流行的 Python 库,可以生成姓名、地址、邮箱、电话、公司名、日期、文本等。

  • 安装

    pip install Faker
  • 脚本示例

    from faker import Faker
    import json
    fake = Faker('zh_CN')  # 设置为中文环境
    def generate_user_data(num=10):
        users = []
        for _ in range(num):
            user = {
                "name": fake.name(),
                "email": fake.email(),
                "phone_number": fake.phone_number(),
                "address": fake.address(),
                "birthday": fake.date_of_birth().isoformat(),
                "company": fake.company(),
                "credit_card_number": fake.credit_card_number()
            }
            users.append(user)
        return users
    # 生成10个用户数据并保存为JSON
    data = generate_user_data(10)
    with open('test_users.json', 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=4)
    print("测试数据已生成!")

JavaScript/TypeScript 库:Faker.js

前端或Node.js自动化脚本常用。

  • 安装

    npm install @faker-js/faker --save-dev
  • 脚本示例

    const { faker } = require('@faker-js/faker'); // 或 import { faker } from '@faker-js/faker';
    function generateOrders(count) {
        const orders = [];
        for (let i = 0; i < count; i++) {
            orders.push({
                orderId: faker.string.uuid(),
                product: faker.commerce.productName(),
                price: faker.commerce.price({ min: 10, max: 1000, dec: 2 }),
                quantity: faker.number.int({ min: 1, max: 10 }),
                customerEmail: faker.internet.email(),
                createdAt: faker.date.past().toISOString()
            });
        }
        return orders;
    }
    console.log(JSON.stringify(generateOrders(5), null, 2));

Java 库:Java Faker (或 Instancio + Faker)

  • Maven 依赖

    <dependency>
        <groupId>com.github.javafaker</groupId>
        <artifactId>javafaker</artifactId>
        <version>1.0.2</version>
    </dependency>
  • 代码示例

    import com.github.javafaker.Faker;
    import java.util.Locale;
    public class DataGenerator {
        public static void main(String[] args) {
            Faker faker = new Faker(new Locale("zh-CN"));
            for (int i = 0; i < 5; i++) {
                System.out.println("Name: " + faker.name().fullName());
                System.out.println("Phone: " + faker.phoneNumber().cellPhone());
                System.out.println("Street: " + faker.address().streetAddress());
                System.out.println("---");
            }
        }
    }

使用自动化测试框架自带功能

很多测试框架直接集成了数据生成能力。

Cypress (测试前端)

它可以通过 cy.fixture() 加载固定数据,也可以结合 JavaScript 的 faker 库在测试中动态生成。

Postman / Newman (API 测试)

Postman 的 Pre-request Script 中可以编写JS代码动态生成随机值:

// Pre-request Script
pm.variables.set("randomEmail", "test_" + Math.random().toString(36).substring(2, 8) + "@example.com");
pm.variables.set("randomName", "User_" + pm.variables.replaceIn("{{$randomInt}}"));

然后直接在请求体中使用 {{randomEmail}}

JMeter (性能测试)

JMeter 内置了丰富的 函数助手 用于生成数据:

  • __Random:生成随机数。
  • __RandomString:生成随机字符串。
  • __CSVRead:从CSV文件读取数据。
  • __threadNum:生成线程编号。
  • 插件jp@gc - Dummy Sampler 可以生成固定或随机的响应数据。

批量生成数据库记录

如果你需要往数据库里灌入大量数据来测试性能或功能。

使用 SQL 脚本 + 循环

-- MySQL 示例:生成1000条用户数据
CREATE PROCEDURE generate_test_users()
BEGIN
  DECLARE i INT DEFAULT 0;
  WHILE i < 1000 DO
    INSERT INTO users (username, email, created_at)
    VALUES (
      CONCAT('user_', i),
      CONCAT('test_', i, '@example.com'),
      NOW()
    );
    SET i = i + 1;
  END WHILE;
END;
CALL generate_test_users();

使用 Python 脚本 + ORM (如 SQLAlchemy)

这是最灵活的方式,可以生成符合业务逻辑的复杂关联数据。

import random
from datetime import datetime, timedelta
from sqlalchemy import create_engine, Column, Integer, String, DateTime
from sqlalchemy.orm import declarative_base, Session
Base = declarative_base()
class Order(Base):
    __tablename__ = 'orders'
    id = Column(Integer, primary_key=True)
    user_id = Column(Integer)
    product_name = Column(String)
    amount = Column(Integer)
    created_at = Column(DateTime)
# 连接数据库
engine = create_engine('sqlite:///test.db') # 示例用SQLite
Base.metadata.create_all(engine)
session = Session(engine)
# 使用Faker生成关联数据
from faker import Faker
fake = Faker()
for _ in range(100):
    order = Order(
        user_id=random.randint(1, 100),
        product_name=fake.word(),
        amount=random.randint(1, 1000),
        created_at=datetime.now() - timedelta(days=random.randint(1, 30))
    )
    session.add(order)
session.commit()
session.close()
print("100条订单数据已插入!")

从生产环境脱敏复制

有时,最能反映真实问题的数据来自生产,但直接复制有安全风险。

  1. 导出生产数据(部分数据)。

  2. 编写脱敏脚本:对所有敏感字段(姓名、电话、身份证、卡号、地址)进行替换或掩码处理。

    • Python 示例

      import hashlib
      import json
      def anonymize_user(user):
          # 对姓名做单向哈希加密
          user['name'] = hashlib.md5(user['name'].encode()).hexdigest()
          # 对手机号做掩码
          user['phone'] = user['phone'][:3] + '****' + user['phone'][-4:]
          return user
      # 读取原始数据文件
      with open('production_data.json', 'r') as f:
          raw_data = json.load(f)
      # 脱敏
      anonymized_data = [anonymize_user(u) for u in raw_data]
      with open('test_data_clean.json', 'w') as f:
          json.dump(anonymized_data, f, indent=2)
  3. 使用数据库的 ANONYMIZE 功能:一些数据库如 PostgreSQL 有专门的脱敏扩展。


高级技巧:约束与自定义数据

当标准库无法满足复杂业务规则时,可以编写自定义生成器。

  • 场景1:生成符合规则的用户名

    import random
    prefixes = ['admin', 'test', 'user', 'demo', 'qa']
    suffixes = ['_111', '_test', '2024', str(random.randint(1, 999))]
    username = random.choice(prefixes) + random.choice(suffixes)
  • 场景2:生成特定分布的数据(用于测试性能瓶颈) 80%的订单金额 < 100元,15%在100-500元,5% > 500元。

    def generate_order_amount():
        r = random.random()
        if r < 0.80:
            return random.randint(10, 99)
        elif r < 0.95:
            return random.randint(100, 499)
        else:
            return random.randint(500, 10000)
  • 场景3:关联数据生成 生成一个完整的订单,包含:用户信息、商品信息、支付信息、物流信息,所有数据必须逻辑自洽(订单总金额 = 商品单价 x 数量)。

给不同类型测试的建议

测试类型 推荐方案 原因
单元测试 代码中直接写硬编码对象或 Faker 数据量小,追求精确和可读性,使用Faker值固定
API/接口测试 Faker + JSON/CSV 文件 生成候选数据,通过参数化循环执行,覆盖各种输入
UI/E2E测试 Faker (在测试脚本内) 每次测试生成新鲜数据,避免重复用户导致报错
性能/压力测试 Faker批量生成 + 数据库直接插入 或 JMeter函数 需要海量不同数据,并且要快,JMeter直接处理性能测试
数据仓库/ETL测试 SQL脚本 + 自定义脚本 需要生成大量、有业务逻辑关联、符合一定统计规律的数据

总结步骤

  1. 需求分析:需要什么样的数据?(用户、订单、日志?)
  2. 选择工具:Python + Faker?SQL?JMeter?
  3. 编写脚本:生成数据并导出为常见的格式(JSON、CSV、SQL)。
  4. 集成到CI:将脚本作为测试准备步骤,在流水线中自动运行。
  5. 数据清理:测试结束后,自动清理生成的数据(重要)。

推荐从 Python + Faker 开始,它上手简单、生态强大,能覆盖90%的测试数据生成需求。

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