← Back to skills
extension
Category: Development & EngineeringAPI key requirement unconfirmed

SQL 测试加固 - 边界用例生成器

从 CREATE TABLE 建表语句自动生成覆盖数值边界、字符串长度边界、NULL/NOT NULL、主键与唯一约束冲突、默认值、日期格式等场景的 SQL 测试用例集,用于数据库兼容性测试与测试加固。输入一个含建表语句的文件,即可生成带预期结果注释的可执行 .sql 用例文件,支持 mysql / oceanbase / postgresql 方言与 basic / standard / strict 三档用例强度。

personAuthor: Siri0804hubModelScope

SQL Test Hardening

从建表语句自动生成数据库测试用例集,覆盖常见边界与异常场景,辅助数据库兼容性测试与测试加固。

功能

  • 解析 CREATE TABLE 语句,提取表名、列名、类型、约束(NOT NULL / UNIQUE / PRIMARY KEY / DEFAULT / CHECK)
  • 按场景分类生成测试用例:正常插入、NULL 约束、数值边界、字符串长度边界、唯一/主键冲突、默认值、日期格式、CHECK 约束
  • 每条用例附带预期结果注释(-- expect: pass / -- expect: error),可直接接入自动化测试框架
  • 输出为单个可执行 .sql 文件,支持批量执行与结果比对

输入

| 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | ddl_file | string | 是 | 含 CREATE TABLE 语句的文件路径 | | output_dir | string | 否 | 输出目录,默认 ./test_cases | | dialect | string | 否 | 方言:mysql / oceanbase / postgresql,默认 mysql | | case_level | string | 否 | 强度:basic / standard / strict,默认 standard |

输出

  • <output_dir>/<table_name>.sql:该表对应的测试用例集,按场景分组,每条用例含预期结果注释
  • <output_dir>/summary.txt:全部用例统计(总数、各场景数量)

使用方式

命令行执行

# 基础用法:为 sample.sql 中的所有建表语句生成用例
python scripts/generate_tests.py --ddl sample.sql

# 指定输出目录与方言
python scripts/generate_tests.py --ddl sample.sql --output-dir ./cases --dialect oceanbase

# 生成严格模式用例(含更多边界组合)
python scripts/generate_tests.py --ddl sample.sql --case-level strict

被 Agent 调用

Agent 将本技能作为工具调用时,按 input_schema 传入参数:

  • ddl_file:必填,建表语句文件路径
  • 其余参数可选

调用后读取输出目录中的 .sql 文件,将用例交给用户执行或接入测试流程。

示例

输入建表语句 sample.sql:

CREATE TABLE t_user (
    id         INT NOT NULL,
    name       VARCHAR(32) NOT NULL,
    score      DECIMAL(5,2) DEFAULT 0.00,
    email      VARCHAR(64) UNIQUE,
    birthday   DATE,
    PRIMARY KEY (id)
);

生成用例(节选,standard 强度):

-- ============================================================
-- 场景 1:正常插入(expect: pass)
-- ============================================================
INSERT INTO t_user (id, name, score, email, birthday)
VALUES (1, 'alice', 88.50, 'alice@example.com', '2000-01-01');

-- ============================================================
-- 场景 2:NOT NULL 约束(expect: error)
-- ============================================================
INSERT INTO t_user (id, name) VALUES (2, NULL);
INSERT INTO t_user (id, name) VALUES (NULL, 'bob');

-- ============================================================
-- 场景 4:数值边界(expect: pass / error)
-- ============================================================
-- INT 最大值
INSERT INTO t_user (id, name) VALUES (2147483647, 'max_int');
-- INT 溢出(expect: error)
INSERT INTO t_user (id, name) VALUES (2147483648, 'overflow');

-- ============================================================
-- 场景 5:字符串长度边界
-- ============================================================
-- VARCHAR(32) 恰好 32 字符(expect: pass)
INSERT INTO t_user (id, name) VALUES (3, REPEAT('a', 32));
-- 33 字符超长(expect: error)
INSERT INTO t_user (id, name) VALUES (4, REPEAT('b', 33));

-- ============================================================
-- 场景 6:唯一约束冲突(expect: error)
-- ============================================================
INSERT INTO t_user (id, name, email) VALUES (5, 'carol', 'alice@example.com');

工作流程

  1. 读取 ddl_file,逐个解析 CREATE TABLE 语句
  2. 对每个表,根据列类型与约束生成分场景用例(场景清单见下)
  3. 按方言调整语法(如注释风格、REPEAT/REPLACE 函数差异)
  4. 写入 <output_dir>/<table_name>.sql 并生成汇总文件

用例场景清单

| 编号 | 场景 | 说明 | | --- | --- | --- | | 1 | 正常插入 | 每列给定合法值,全列插入与最小列插入各一条 | | 2 | NOT NULL | 对每个 NOT NULL 列插入 NULL | | 3 | 主键约束 | 重复主键、NULL 主键(非 NOT NULL 时) | | 4 | 数值边界 | 整数/小数类型的最小值、最大值、越界 ±1 | | 5 | 字符串长度 | CHAR/VARCHAR(n):长度 n 与 n+1 | | 6 | 唯一约束 | 对每个 UNIQUE 列插入重复值 | | 7 | 默认值 | 省略带 DEFAULT 的列,验证默认值写入 | | 8 | 日期格式 | 合法日期、非法日期(如 2024-02-30)、非法格式 | | 9 | CHECK 约束 | 满足与违反 CHECK 表达式的值各一条 | | 10 | 特殊值 | 空字符串、纯空格、NULL 与空串区分(strict 强度) |

注意事项

  • 脚本仅依赖 Python 标准库,无需安装第三方包
  • 生成用例前会先执行 DROP TABLE IF EXISTS,请在测试库中运行
  • expect: error 用例需要人工或测试框架确认报错是否符合预期
  • 解析器基于正则实现,支持常见 DDL 写法;若遇复杂 DDL 解析失败,会在汇总文件中记录
<!-- OB-S:A26AbftjlLggqlhvi-1RiQ -->