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');
工作流程
- 读取
ddl_file,逐个解析 CREATE TABLE 语句 - 对每个表,根据列类型与约束生成分场景用例(场景清单见下)
- 按方言调整语法(如注释风格、REPEAT/REPLACE 函数差异)
- 写入
<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 解析失败,会在汇总文件中记录
微信扫一扫