登录框输入超长字符串,试用页面直接返回500。试用这不是试用后端的问题——前端没做长度校验,请求发出去就炸了。试用我见过太多测试用例只写“输入正确用户名密码,试用点击登录,试用验证跳转成功”,试用然后呢?试用边界值呢?异常流呢?这种用例跑一百遍也发现不了上面那个bug。
Web测试用例跟App测试用例最大的试用差别在于环境不可控。用户可能用Chrome 118,试用也可能用某个国产浏览器套壳的试用IE内核。你的试用用例里写“验证页面布局正常”,太虚了。试用得写清楚:在1366×768分辨率下,试用Chrome最新版,试用导航栏不换行、按钮不重叠。这才是可执行的用例。
去年帮一个电商团队看测试用例。商品详情页有个“加入购物车”按钮,用例写的是“点击按钮,验证商品出现在购物车列表”。测试环境跑通了,上线后客服炸了——iOS Safari上点击按钮没反应。原因是那个按钮绑定了click事件,但在iOS上得用touchstart或者加cursor:pointer。用例里没写浏览器类型和版本,测试同学默认在Windows Chrome上跑,漏了。
所以写Web用例,第一行就该注明环境矩阵。不是写“主流浏览器”,而是列出来:Chrome 120、Firefox 121、Safari 17、Edge 120。移动端加iOS Safari和Android Chrome。别嫌麻烦,漏一个就是线上事故。
拿注册页举例。用户名输入框,常规用例覆盖:空、纯空格、1个字符、最大长度、最大长度+1、特殊字符、中英文混合、emoji。密码框加一条:复制粘贴是否生效。验证码加一条:刷新后旧验证码是否失效。这些不是拍脑袋想的,是踩坑踩出来的。
有个细节容易被忽略:输入框的maxlength属性。前端加了maxlength="20",但用户用开发者工具改掉这个属性,后端还校验吗?用例里得加一条“绕过前端限制提交超长数据”。我测过三个项目,两个后端都没做二次校验。
功能用例关注用户看到什么,接口用例关注数据怎么流转。比如“加入购物车”这个功能,功能用例验证按钮状态、购物车角标数字、列表展示。接口用例直接发HTTP请求,验证库存扣减、购物车表插入记录、返回的JSON字段是否完整。
分开写的好处是定位快。线上出问题,先跑接口用例。接口通了,问题在前端;接口挂了,后端背锅。混在一起写,排查时像大海捞针。
全量跑兼容性矩阵太耗时。我的习惯是:功能用例在Chrome上全量跑,其他浏览器只跑核心路径。核心路径怎么定?用户从进站到完成目标动作的最短路径。电商就是“搜索→详情→加购→下单→支付”,五步。每步挑两三个关键用例,在Safari、Firefox、Edge上过一遍。能覆盖80%的兼容性问题。
响应式布局单独测。用Chrome DevTools的设备模拟不够准,真机借几台:iPhone 12、小米13、iPad Air。重点看横向滚动条、字体大小、点击区域重叠。我见过一个日期选择器在iPhone SE上弹出来直接超出屏幕,用户点不到“确定”。
产品改个按钮文案,用例里“点击‘立即购买’按钮”就得改成“点击‘马上抢购’按钮”。不改?下次执行时测试同学找不到按钮,要么跳过,要么报bug。我现在的做法是用元素定位代替文案描述,比如“点击#buy-btn”,文案变了定位不变。但这也只是缓解,页面重构时该改还得改。
每周花半小时清理过期用例。三个月没执行过的、对应功能已下线的、重复覆盖的,直接删。留着只会增加维护成本,不会增加测试覆盖率。
写用例这件事,核心就一句:把自己当成最笨的用户,用最脏的数据,在最破的环境里操作。能过,才算过。