表单测试挂掉时,第一反应通常是去看校验代码,怀疑规则写错了或者规则库过期了。但在相当多的例子里,代码没问题,是喂进去的数据本身自相矛盾:城市和省份不匹配、邮编位数不符合该国规则、手机号前缀和号段对不上。校验函数只是忠实地把这份数据拒绝了。
报错指向的字段往往不是问题所在
一个具体的形态是这样的:接口返回「省市区不匹配」,于是你去调省市区联动,调了半天没效果。真正的原因是测试数据里城市写的是广州、省份写的是四川,任何正确的联动逻辑都会拒绝它。
另一类症状是同一个用例在本地过、在流水线挂:本地用的是手改过的一条记录,流水线用的是生成脚本现造的记录,两者只差一个字段。
还有一种更隐蔽的情况:校验通过了,但下游统计按地区聚合时数字对不上。这说明数据没到自相矛盾的程度,只是不自洽,比如邮编属于某个城市,而行政区字段填的是邻省。
字段为什么会变得不自洽?
根因几乎总是同一个:字段是分别生成的。用通用库造数据时,城市从一个池子里抽、行政区从另一个池子里抽、邮编在第三个池子里随机拼字符,三个池子之间没有关联。生成脚本本身没有错,它只是不知道这些字段在你的业务里是相互约束的。这也正是测试数据生成方法对比里强调「按内部约束选方案」的原因。
第二类根因是手工编辑。为了构造某个边界场景,有人把固定装置里的城市改成了偏远地区,却忘了同步改邮编和区号。这类改动在代码评审里很难被发现,因为改动看起来完全正常,改动本身也合理。
第三类根因是数据合并。把两个来源的数据按行号拼起来,或者先随机生成再按某一列排序,字段之间的对应关系就断了。这类问题最难查,因为每一列单看都是合法的。
四类最常见的字段冲突
第一类是行政区与城市。省、州、都道府县与市、区、町村是父子关系。冲突有两种表现形式:城市不属于该行政区,或者城市名在该国根本不存在。前者来自分别抽取,后者常见于把某个国家的地名误用到了另一个国家。
第二类是邮编与城市。各国邮编规则差异很大,有的固定位数纯数字,有的含字母,有的在位数上有区间而不是定长。用随机数拼出一个位数正确的邮编,看起来没问题,但它对应的实际区域可能横跨好几个行政区。只要业务里有按邮编反查地区的逻辑,这种数据一定会暴露。
第三类是手机号与号段。手机号的前几位往往对应运营商或号段区间。随机生成的号码容易落在未分配区间,或者长度正确但前缀无效。这类数据在只做长度校验的系统里能通过,在接了号码归属校验的系统里会被拒。如果还要测国际号码,还要处理国家代码、国内主干前缀是否省略,以及号码本身的位数,可以对照国际地址和电话格式里的清单。
第四类是证件号与出生日期、性别。很多国家的证件号码里编码了出生日期,部分地区还编码了性别。如果姓名、出生日期和证件号是分别生成的,就会出现证件号里的生日是三月、出生日期字段写的是八月这类组合。校验严格的地区会直接拒绝,而校验宽松的地区会把它放进数据库,等到对账时才发现。
| 冲突类型 | 单独看是否合法 | 多久会被发现 |
|---|---|---|
| 行政区与城市 | 都合法 | 触发联动校验时 |
| 邮编与城市 | 都合法 | 按邮编反查地区时 |
| 手机号与号段 | 都合法 | 接入归属查询后 |
| 证件号与出生日期 | 都合法 | 对账或严格校验时 |
怎么检测才不依赖业务知识?
检测不需要业务知识,纯格式层面就能筛掉大部分问题。可行做法是拿一批数据逐行跑一遍跨字段检查:
- 城市是否属于它所在的一级行政区;
- 邮编的位数与字符集是否符合该国规则;
- 手机号去掉国家代码后的位数是否合法,前缀是否在已分配区间内;
- 证件号的校验位是否通过,号码内编码的日期是否与出生日期字段一致。
这四类检查覆盖了绝大多数「说不清哪里不对但接口就是报错」的情况。生成时用什么规则,就去验什么规则,两边用同一套算法,结果才有可比性。用校验工具把同一批数据反向过一遍是最省事的入口。
怎么从根上修掉这类问题?
治标的办法是遇到失败就手改那一条,但这样每次造数据都会重新踩一遍。
治本的办法是让有约束关系的字段来自同一个数据源:一条记录里同时带着行政区、城市和邮编,而不是三个字段各自独立生成。本站的身份信息生成器与地址生成工具就是按这个思路组织的,改一条记录里的城市,行政区与邮编会跟着一起变。
如果无法改数据源,就退一步在生成之后加一道自检,把不自洽的行直接丢掉并记录数量,至少不让它流进测试用例。丢弃率本身也是一个有用的信号:如果丢弃率很高,说明生成规则和业务规则已经严重脱节,该回去修源头而不是继续过滤。
常见问题
为什么本地过、流水线挂,而代码没改?
多数是测试数据不确定:本地用的是手工维护的固定装置,流水线用的是现场生成的随机数据。两者的字段来源不同,覆盖到的组合也不同。排查时先确认两边用的是不是同一份数据,再怀疑代码。把生成结果落盘再引用,这类问题基本会消失。
校验通过就等于数据自洽吗?
不等于。很多表单只做格式校验,位数对、字符集对就算过。字段之间的对应关系通常不在这类校验的范围内,尤其是「城市属于哪个省」这种需要外部数据的判断。想确认自洽,需要单独安排跨字段检查。
用真实数据能避免这个问题吗?
真实的生产数据天然自洽,因为它是真实世界的产物。但它带来脱敏和访问权限两个新问题,而且样本分布不均匀,某些边界组合可能一条都没有。更实际的做法是把真实数据当作发现边界情况的样本,再把这些情况写进合成数据的规则里。
哪些地区的证件号值得优先测?
先测证件号带校验位的地区。这些号码里编码了校验信息,一旦字段是拼出来的,校验位几乎必然对不上,问题会立刻暴露而不是潜伏到线上。只有格式要求、没有公开校验算法的地区,则需要靠位数、分组和字符集来判断。
本文只讨论测试数据的构造与检查方法,不涉及任何具体国家或地区现行证件的签发规则与法律效力;文中的城市、省份与号码组合均为说明用途的虚构示例,不得用于真实单据、申报或核验场景。