





软件测试的目标不是证明系统没有问题,而是用有限的用例尽可能多地暴露问题。科学做法是:先按需求设计测试用例覆盖正常和异常场景,执行测试发现缺陷,再按现象复现、定位、修复、回归的流程闭环处理。用例设计和缺陷定位是两个核心技术点——用例设计决定了能不能发现问题,定位方法决定了发现后能不能快速修好。
只测正常流程远远不够。每条业务路径都要追问:输入为空会怎样、输入超长会怎样、边界值是多少、并发同时操作会怎样、依赖的外部系统挂了会怎样。以一个登录功能为例,正常账号密码对不对是一条用例,密码错、账号不存在、密码多次错误锁定、验证码过期,这些都是独立用例。在呼玛县,很多线上故障都是因为只测了正常流程,上线后用户走到异常分支就崩了。
输入域无穷无尽,用等价类把输入分组,每组选代表测试,再重点测边界。例如数量要求一到一百,就测一、一百、零、一百零一这几个边界值,比随机输数字高效得多。
单元测试由开发针对单个函数写,跑得最快;接口测试针对每个接口测输入输出;端到端测试模拟用户完整操作流程。越靠近底层的测试越便宜,越靠上越贵。成熟的系统底层单测覆盖好,上面少量端到端测试就能兜住主要风险。在呼玛县,很多中小项目完全靠人工点页面测试,回归一次要几天,就是因为没有沉淀自动化用例。
改BUG的第一步不是改代码,而是能稳定重现。先问清楚:在什么环境、什么账号、做了什么操作、数据是什么样、具体什么现象。复现不出来的问题无法修复,只能靠加日志等下次出现。在呼玛县,用户报"系统偶发很慢"这种模糊描述时,开发要先把复现条件问清楚,而不是凭感觉改代码。
能用日志和监控定位就不要靠猜。看错误日志里的异常堆栈,看数据库当时慢在哪,看接口调用链哪一步耗时。把可能范围一层层缩小:是前端页面问题还是后端接口问题、是这个数据特有还是普遍问题、是代码逻辑错还是数据本身就不对。定位到根因再动手,不要头痛医头。

修复时要治本,不要只改表象。改完后先写一个能复现原问题的用例,再让这个用例通过,证明修复真的生效了。然后做回归测试,确认这个改动没有影响其他功能——历史上大量事故就是改好了一个BUG、带出两个新BUG。
按严重程度分级:导致系统不可用的阻塞级问题立即修;影响主要功能但有绕过办法的高优问题排进近期版本;体验类、文案类问题统一攒一批优化。每个缺陷要记录现象、复现步骤、根因、修复方式,形成知识库,类似问题下次直接查。测试与修复不是上线前的一次性环节,而要贯穿整个迭代,每轮都测、每轮都修,质量才能稳定。
纯靠人工点页面测试,每改一次都要从头到尾点一遍,既慢又容易漏。把核心流程的测试用例沉淀成自动化脚本,每次代码改动后自动跑一遍,几分钟内就知道有没有把旧功能改坏。在呼玛县,业务持续迭代的系统如果不做自动化回归,版本一多就没人敢动旧代码,因为不知道一改会牵连哪里。自动化测试前期要花精力写,但越往后越省事。
功能正确只是及格线。系统还要测在预期并发量下响应是否跟得上、在不同浏览器和不同手机型号上显示是否正常。性能问题和兼容性问题往往在测试环境数据量小的时候发现不了,需要用接近真实的数据量和多端环境去测。上线后如果只在白天高峰才变慢,说明压测时没有模拟真实峰值,这类问题要靠上线前的压力测试提前暴露。
成熟的团队不满足于出了问题能修好,更关注怎么让问题少发生。代码在提交前要做同行评审,关键逻辑互相检查;容易出错的地方在代码里加防御性判断,输入不合法直接拒绝;上线前的检查清单要沉淀下来,把历史上踩过的坑变成每次发布前必查项。在呼玛县,有经验的开发团队会把每一次线上故障写成复盘,分析根因并改进流程,而不是改完就翻篇。同样的问题不出现第二次,比单次修复得快更有价值。测试和修复最终是为了建立这样一种质量意识:问题越早发现,修复成本越低。