模式上线也是一次发布
一条模式进入生产后通常影响整条数据链路:校验通过的数据往下走,匹配错的内容被静默放过或误删。上线前准备一组覆盖正例、反例与边界的样本,是最划算的投入。
反例比正例重要
正例只能证明它能匹配,反例才能证明它不会乱匹配。设计反例时按三种方式构造:加法(正确输入上多一段字符)、删法(少一段)、换法(把某段换成非法内容),绝大多数宽松判定都能被这三类暴露。
基本信息
| 正例覆盖 | 典型合法输入,含最长与最短形态 |
|---|---|
| 反例覆盖 | 加多余内容、缺内容、替换非法内容 |
| 边界样本 | 空串、恰好最短、恰好最长、首尾带空白 |
| 字符样本 | 全角与半角、大小写、其它语言文字、不可见字符 |
| 跨行样本 | 不同换行风格,验证锚点与点号行为 |
| 规模样本 | 超长输入用于观察性能是否退化 |
| 校验语义 | 校验场景必须用整串匹配,样本里要有「合法片段加杂质」的反例 |
典型使用场景
- 新增或修改字段校验规则后做回归验证
- 把模式改动纳入自动化测试,避免下次回归
- 评估从别的引擎迁移模式的风险,用同一批样本对比结果
- 排查线上误判时,用样本复现并补进测试集
- 对性能敏感路径做长输入压测,确认不会出现耗时异常
样本集的组织方式
样本集的组织方式
正例: 2026-10-17 期望命中整串
正例: 2026-1-7 期望命中或按规则明确拒绝(需决策)
反例: 2026-10-17x 加法:尾部多了字符,必须拒绝
反例: 2026-10-17- 加法:尾部多了分隔符,必须拒绝
反例: 2026-10 删法:缺少日,必须拒绝
反例: 2026-aa-17 换法:非法字符混入,必须拒绝
边界: (空串) 必须拒绝
边界: ' 2026-10-17 ' 首尾空白,按业务规则明确预期
字符: 2026-10-17 全角数字,按规则明确预期
跨行: 2026-10-17\n 末尾换行,验证锚点严格程度
规模: 超长字符串 观察耗时是否随长度线性增长用例类型与目的
| 类型 | 构造方式 | 暴露的问题 |
|---|---|---|
| 正例 | 典型合法输入 | 规则是否可用 |
| 加法学反例 | 合法内容后追加字符 | 缺少锚点、包含式匹配 |
| 删法学反例 | 合法内容缺一段 | 可选结构过宽、量词次数偏小 |
| 换法学反例 | 替换为非法字符 | 字符类范围过宽、字符语义偏差 |
| 边界与超长 | 空串、极长输入 | 空匹配与性能退化 |
样本要跟业务规则一起确认预期,而不是跟着当前实现的结果走。否则测试只会固化现状,把现有缺陷一并保护起来。
涉及性能的模式,测试里要包含一条接近上线的长输入样本并记录耗时基线。回退型引擎在特定结构下的耗时增长不是线性的,靠肉眼审查发现不了。