菜单

国家选择字段测试:下拉、搜索与排序

国家选择看着是最简单的一个表单控件,实际最容易出问题:下拉太长、搜索对不上别名、排序前后不一致、默认值悄悄替用户做了选择。本文给出这套控件的测试切面。

发布于

  • 表单控件
  • 搜索匹配

国家选择字段测试常常被压缩成「点开下拉,能选中就行」。但这个控件其实是整条数据链路的第一道闸门:选错了国家,后面所有的格式判断、校验规则与提示文案都会建立在错的依据上。这一篇按下拉、搜索、排序三个切面,把它的测试点摊开。

国家选择字段为什么比看上去更难测

它看起来只是一份列表,但列表里的每一项都带着隐式信息:显示用的是本地化名称还是通用名,排序按什么排,哪些项在默认视图里被折叠起来。

它同时出现在很多地方:注册、结算、开票、寄送、证件信息。同一个控件在不同页面上的必填性与默认值往往不同,而这些差异通常没有被写下来。

它还有一层时间维度:国家和地区的名称会变,编码会被替换或停用,昨天正确的列表今天可能就少了一项、多了一项,而用户的历史选择还留在库里。

这三点决定了它不能只测一次,而要按入口、按时间、按数据来源分别测。

另外,这类控件的缺陷往往不是「坏掉」,而是「看起来正常但结果不对」:用户顺利选完了,只是选中的不是他以为的那一项。所以测试记录里除了通过与否,还应该留下实际选中的值,否则这种缺陷会被一路放过。

下拉形态:长列表怎么组织

下拉的形态决定了用户能不能找到目标,测试要覆盖结构而不只是内容。

  • 分组:按地区分组的列表要验证组内完整、组间不重不漏,处在边界上的国家和地区不会被漏掉。
  • 置顶:常用国家和地区置顶时,要验证置顶项在搜索命中的情况下不会重复出现两次。
  • 折叠:只显示一部分再展开的设计,要验证展开后的总数与全量一致。
  • 键盘操作:上下键、按首字符跳转、回车选中,这几种操作在分组结构下最容易失效。
  • 移动端:长列表在小屏上的滚动与搜索框吸顶是另一套行为,需要单独走一遍。

国家和地区整体是怎么按地区组织与划分的,国家和地区列表给出了这套分组结构的样子;具体站点的控件行为要按各自的设计稿验证,不要直接照搬别处的分组顺序。

搜索匹配要覆盖哪些输入?

搜索是国家选择控件里最容易埋雷的地方,因为它要面对用户真实的输入习惯。

要覆盖的输入类型至少有这几类。

  • 通用名与本地化名称:用户可能输入通用的中文名称,也可能输入该国自己的写法。
  • 常见别名与缩写:口语化的简称、历史上的旧名,都可能被输入。
  • 带空格与不带空格的写法:某些名称含有空格或连字符,两种输入都要能命中。
  • 部分匹配:只输入前几个字符时,是先给出候选还是直接判定无结果,需要明确定义。
  • 字宽与大小写:数字与字母的宽度不一致、字母大小写不同,都不应直接判失败。

还要定义「什么时候算没有结果」。是列表为空并给出提示,还是保留一个可提交的兜底项?这两种设计对下游数据的影响完全不同。

电话区号与属地之间的匹配是同一类问题的另一个切面,跨主题里的讨论见电话区号与属地匹配。

排序与默认值藏了哪些假设?

排序看起来是纯展示问题,其实会把产品假设固化下来。

按名称排序、按通用名排序、按编码排序,三种顺序在用户眼里是不同的可用性体验。测试时要验证同一套顺序在列表、搜索结果、已选回显与导出文件里都一致——不一致是这类控件最常见的缺陷类型。

默认值更危险。一个预选好的国家会让用户直接跳过这个字段,于是一批数据的国别实际上是系统猜的,而不是用户选的。要明确:哪些入口允许预选、依据是什么、用户改动之后会不会被后续步骤覆盖回去。

排序还要考虑组内的稳定性。同一个地区内的国家和地区之间,顺序在两次发布之间不该无缘无故改变,否则用户的肌肉记忆会失效,每次都要重新找一遍。

空值、其他与特殊项怎么处理?

这一栏经常混进几种不属于国家的选项,需要单独测。

「其他」「未确定」这类兜底项,要定义它能不能被提交、提交之后下游怎么处理,以及它会不会和真实的编码撞上。

空值要和「没填」区分开:用户主动清空、表单初始化未选、数据迁移丢失,这三者在下游的语义可以完全不同,但界面上看起来都是空的。

停用项要单独验证:已经停用的国家和地区仍然被历史数据引用着,回显时不能变成空白或报错,同时不应再出现在新的选择列表里。

在多个国家和地区之间迁移业务的场景下,这些选项的语义会更容易出问题,因为一笔业务里的国别角色本来就不止一个,见跨境地址场景。

给开发者:把这个字段当数据入口而不是装饰

实现上最有效的一条建议是:把这个控件当成数据入口,而不是一个可以随便替换的下拉。

它输出的值应该是稳定的编码,而不是本地化名称。名称会变,编码相对稳定,用它作为主键可以让列表更新时下游不受影响。

它应该有一个明确的「未选择」状态,并且在任何时刻都能区分「用户没选」和「用户选了别的」。这两者混在一起,后面所有的判断都会建立在猜测之上。

它的候选来源应当是单一真源,界面、接口与导出用同一份,避免三处各维护一套。国家和语言两侧各自的选择见国家与语言的区别,两侧分开之后,这个字段的边界也会更清楚。

最后,给这个控件留一条可观测的路径:选了什么、什么时候改的、从哪个入口进来。出问题时,这几个信息比一份复现步骤有用得多。

下一步

把三条切面各走一遍:结构上验证分组与置顶,输入上验证别名与部分匹配,状态上验证空值与停用项。每条都记下实际结果,而不是只记一个「通过」。

控件本身稳定之后,再把这套用例接到列表数据更新的时候重跑,因为这一类缺陷往往不是写坏的,而是数据换过之后才浮出来的。

文中列举的下拉项、搜索别名与用户输入都是为演示测试切面而编造的示例数据,不是任何真实产品的选项集,也不来自任何真实用户提交记录。

继续阅读

各国地址与身份数据格式相关文章