ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

软件测试核心任务与测试用例设计:从手工测试到自动化实践

软件测试核心任务与测试用例设计:从手工测试到自动化实践 1. 软件测试到底在测什么很多打算转行做软件测试的人第一反应是“这不就是找bug吗”。我不止一次在培训课和面试现场听到这种回答每次都忍不住摇头。如果测试只是找bug那开发自测就够了公司何必单独设一个岗位测试的核心任务其实是“验证软件是否满足预期需求”bug只是验证过程中暴露出来的问题之一。换句话说测试是在用一套可重复、可度量的方法回答两个问题软件做对了没有软件做出来是不是用户要的我刚入行那会儿负责过一个后台管理系统开发说功能做完了我随手点了几个按钮确实没什么问题就准备提测通过。结果同事拿着需求文档过来问我“未登录状态下访问统计页面应该跳转登录页你测了吗”“删除角色后已打开的角色列表页面会不会报错”“同一个账号在别处登录这边要不要被顶下线”。这些问题我一个都没答上来。那一刻我才意识到测试不是“随便点点”而是要把所有可能发生的情况都列出来再逐条验证。这里还要区分两个概念验证和确认。验证是“做得对不对”比如登录密码加密传输、金额精度保留两位这些是否和需求文档一致确认是“东西对不对”比如用户真正需要“一键导出全年报表”而你只做了按月导出尽管每个月导得都对但整体功能并没有满足真实诉求。所以一份完整的测试工作既要覆盖需求里的显性规则也要去思考那些没说出口的隐藏期望比如并发场景会不会卡死、弱网情况下会不会重复扣款、异常操作时提示是否友好。这也是为什么在公司里测试和开发的关系更像“一起写题、一起改答案”而不是对立的挑刺。好的测试人员拿到需求后会先想业务逻辑再想技术实现最后才动手写用例。你可以把软件测试理解成质检员但不是只检查成品有没有划痕的质检员而是从原材料、加工流程、出厂环境、用户使用习惯都过一遍的质检员。这么理解之后下面这些东西就都好说了。2. 测试分层与测试类型先搭一张地图再动手2.1 从单元测试到验收测试四个层级怎么分工软件测试最基础的框架是测试金字塔从下往上依次是单元测试、集成测试、系统测试、验收测试。这个金字塔不只是为了好看它直接决定了测试的成本和效率。单元测试针对最小代码单元通常是函数或方法。比如一个计算订单金额的函数你直接给它传商品单价、数量和折扣看它返回的总金额对不对。开发人员平时自己写的那一部分单元测试就属于这类。集成测试解决的是“模块和模块之间能不能对上”的问题。典型场景是前端调用后端接口后端访问数据库其中任意一端的字段改名数据流就会断。系统测试则站在整体功能层面模拟用户完整走一遍业务流程从打开页面、填表、提交到查看结果确认整体符合需求。最后的验收测试由业务方或客户执行也可能由测试人员代表用户执行主要判断产品是否达到上线标准。新手容易陷入一个误区觉得单元测试是开发的事测试人员只要做系统测试就行。实际上如果测试人员能看懂代码并参与单元测试用例的评审对后期的系统测试帮助极大。我见过一个线上事故两个微服务之间的时间字段一个用“yyyy-MM-dd HH:mm:ss”另一个用时间戳毫秒值联调时谁都没注意等到统计报表当天数据为空才被发现。如果你在集成测试阶段就有意识地比对接口字段类型这种低级但致命的bug根本走不到生产环境。2.2 功能、回归、性能、安全、兼容性到底要测哪些测试类型可以按很多维度划分但从日常项目来看最常用的是以下几种功能测试验证每个需求点是否被正确实现。回归测试验证修改或新增功能之后原来正常的功能有没有被改坏。性能测试验证系统在预期负载下响应时间、吞吐量、资源占用是否达标。安全测试验证是否存在未授权访问、数据泄露、SQL注入等风险。兼容性测试验证软件在不同浏览器、操作系统、设备尺寸下的表现。易用性测试验证一个没看过说明书的人是否能顺利完成任务。这里最容易被新人理解为“只有功能测试才重要”其实回归测试才是日常工作量的大头。举一个真实例子某电商项目在迭代“满减活动”时开发只改了一个优惠券模块的代码结果把整单折扣计算逻辑影响了导致所有非活动订单都默认打了九五折。功能测试时新增需求是过了但回归测试不够充分上线后客诉直接爆炸。从那以后我们每个版本都必须拉一条核心回归用例集哪怕这个版本只改了一行文案也要跑一遍下单主流程。兼容性测试也有类似的问题。很多人以为兼容性只要把Chrome和Firefox各开一遍就行但移动端会牵扯真机型号、系统版本、网络制式的排列组合至少要先按用户设备占比排个优先级。比如你的产品主要用户是苹果手机那iOS的真机覆盖权重就应该远大于安卓模拟器。2.3 根据风险定等级别把所有bug一视同仁测试类型确定之后还要对缺陷进行等级划分。通常分为四级致命、严重、一般、轻微。致命是指系统崩溃、数据丢失、核心功能不可用必须阻断发布严重是主要功能存在逻辑错误但有临时规避手段一般是普通功能异常不影响主流程轻微是样式、提示文字、操作不便等体验问题。这个分级不光是给开发看的优先级也直接影响测试你自己分配精力的顺序。我曾经带过一个刚入行的测试他抓着一个“登录按钮颜色偏浅”的轻微bug不放写了一大段复现步骤却没注意到下单接口在并发200时已经超时。这就是典型的“没分清主次”。测试的价值不是追求bug数量而是对产品质量做出整体判断然后把精力和资源投入到最危险、最核心的地方。3. 测试用例设计与测试流程把“凭感觉”变成“有套路”3.1 一个合格测试用例的八个要素很多人以为测试用例就是“输入一些数据看看结果对不对”其实一份完整的测试用例至少要包含以下要素用例编号便于追溯和统计所属模块说明是登录、支付还是订单测试标题用一句话描述验证目的前置条件比如已登录、账号余额足够、网络正常测试步骤一步步可执行的操作测试数据输入的具体值预期结果明确写清楚期望的系统反馈实际结果和状态执行后回填。这里有一个长期被忽略的关键点预期结果一定要具体可判定。你写“页面正常显示”这不算合格你写“页面显示订单号、支付金额、支付时间且金额与订单详情页一致”这才算能执行的用例。否则不同测试人员执行同一份用例可能得出完全不同的结论。3.2 等价类、边界值、判定表、场景法四类设计技巧等价类划分把所有输入数据按是否“等效”分成若干集合每个集合取一个代表值进行测试。比如手机号输入框合法数据是11位数字非法数据是空值、非数字、位数不足等每类测一个就可以不用穷举几亿种组合。边界值分析bug最容易出现在临界点比如“6到10个字符”这个规则5、6、10、11这几个边界值比中间的7、8、9更有测试价值。按边界值设计用例同样的功能往往能用最少用例发现最多问题。判定表适合规则多且相互组合的场景。比如运费计算规则不同地区、不同重量、是否会员会产生多种运费结果用判定表把条件和动作列出来就不会漏掉组合。场景法从用户真实使用路径出发把一个完整操作链拆成一连串步骤。比如“用户搜索商品→查看详情→加入购物车→结算→支付→收到订单通知”每一步都要覆盖成功和失败两个分支。新人最容易掉进“想到哪个点测哪个点”的陷阱。拿到需求后先画业务流程再按流程把每一个分支拆出来最后给每个分支补充等价类和边界值用例这样设计出来的用例一般来说覆盖率都比较理想。如果你能在一个新项目里把用例做成交互式需求追踪矩阵需求变更时能快速定位哪些用例要改那基本就是中高级测试的思维了。3.3 测试计划里的排期、人力与退出标准测试计划不是用来应付领导的文档它决定了后续一个月大家怎么干活。我的习惯是先回答四个问题测什么范围、怎么测策略、谁来测分工、测到什么程度可以放行退出标准。早期做计划我经常踩一个坑把测试结束时间定成和提测时间只差两三天结果需求一变更就全线崩盘只好疯狂加班补回归。后来我总结了一个相对靠谱的比例设计用例占计划总时间的30%到40%执行占30%缺陷回归和报告输出占20%留10%到20%处理突发情况。如果项目并行严重需要自动化辅助回归还要额外预留脚本维护的时间。当然这些比例不是死的敏捷项目可能更多是迭代式计划但“留缓冲”这条原则永远适用。退出标准也要提前定否则“测试通过”就是个模糊概念。我的习惯是以“致命和严重级别的缺陷清零一般缺陷存量不超过N个且全部有规避方案核心回归用例通过率100%”作为准入门槛然后由产品和测试共同拍板是否可以发布。这样做的好处是上线与否不是某个人拍脑袋而是有数据支撑的集体决策。4. 缺陷管理与回归测试把问题盯到彻底关掉4.1 一条缺陷生命周期的完整链路测试发现bug后不只是提交一条记录那么简单。一个缺陷通常要经历提交、确认、修复、验证、关闭或者被拒绝、延期、重新打开等状态。这个状态流转背后是对责任的确认和风险的评估。提交缺陷时开发最怕看到的是“登录报错”这种描述。正确的格式是环境说明测试环境还是预发环境、数据准备哪个账号、哪条订单、详细步骤、实际结果、预期结果、日志或截图、严重级别、关联需求或用例编号。信息越完整开发定位越快整个项目的修复成本就越低。这就像给修车师傅描述故障你说“车开起来嗡嗡响”师傅只能自己猜你说“车速到80公里每小时方向盘抖动空挡滑行也有声音”师傅马上能缩小排查范围。4.2 为什么开发说修复了测试还一定要回归在这里多说一句开发经常在缺陷后面回复“已修复”。这时候测试不能盲目信这句话更不能直接关闭缺陷。你要做的是回归验证按原步骤再执行一次确认原问题已消失同时检查修复是否引入了新问题。我遇到过一个典型情况开发为了修复“金额精度不足”把计算逻辑里浮点数改成了字符串运算原问题确实解决了却导致优惠券无法叠加使用。这在新手眼里可能觉得是另一个缺陷但本质上是同一个修复动作引起的连锁反应属于回归不充分。所以成熟的测试团队都会维护一套“核心回归用例集”每次版本迭代无论大小先把核心用例飞快过一遍。这套用例集不需要很多可能两三百条但必须覆盖支付、登录、下单、消息通知等关键链路保证不管开发改了什么主干流程都是稳的。5. 自动化软件测试从接口到UI怎么选型才不白费功夫5.1 为什么很多团队先做接口测试自动化自动化测试听起来很高级但它的本质是用程序代替人工执行重复性工作。UI自动化最贴近用户视角也最容易让新人兴奋但其实UI自动化投入产出比往往是最低的。页面元素稍微改个class名脚本就废了换一套皮肤全套用例可能都得重写。相比之下接口自动化稳定得多因为接口契约变化频率远低于页面改动而且接口层一个断言能覆盖数据正确性比在页面上等元素加载再断言靠谱得多。我推荐新手接触自动化时先过一过Postman或Apifox把接口测明白再用Python写脚本封装接口请求。等你把接口层的自动化跑顺了再考虑是否上UI自动化。尤其是面试的时候HR和面试官问“你会哪些自动化”你说“我用pytestrequests做了几十条接口用例每天定时跑失败自动告警”比说“我录制过几个Selenium脚本”要有说服力得多。5.2 用Python搭建一套最基础的接口自动化用例这里给一个可以直接抄作业的简单示例底层是requests库断言用pytest结构足够清晰适合拿来做练习项目。import requests import pytest BASE_URL https://api.example.com def test_login_success(): payload { username: test_user, password: correct_password, remember_me: False } resp requests.post(f{BASE_URL}/api/v1/login, jsonpayload) assert resp.status_code 200 assert resp.json()[code] 0 assert resp.json()[data][token]这段代码看着简单但背后有几件事要说明白第一断言不能只断言200还要断言业务码和关键数据字段否则接口返回一个200的错误响应你也发现不了第二密码这类数据不要硬编码在脚本里至少放到环境变量或配置文件中第三接口用例要跟手工测试用例一样写明前置条件和预期结果而不是“跑通就算过”。实际项目中自动化用例会被组织成目录结构conftest.py里放fixturecases目录存放测试模块report目录存放测试报告和日志。还需要在CI里配置定时任务比如每晚凌晨2点跑全量接口用例早上9点出报告。这样人工只需处理失败用例真正让回归变成常态化而不是发布会前的临时加班。5.3 性能测试安全测试该用哪些工具性能测试领域JMeter仍然是应用最广的工具之一。它的核心思路是创建线程组模拟用户、用取样器发起请求、用监听器收集响应时间与错误率。我建议新手至少搞清楚三个概念并发用户数、QPS、响应时间。它们不是一个东西。1000个并发用户如果每个用户每秒只发一个请求那QPS就是1000左右如果每个用户连续快速点击QPS可能远高于1000。性能测试的目标是找到系统的瓶颈而不是追求“压到多高”所以测试前要和生产业务量做对比设定一个合理的预期值。安全测试方面新手可以先用AppScan或Burp Suite做基础扫描重点看SQL注入、XSS、越权这类常见漏洞。但这些工具都只是辅助真正的安全测试要结合业务逻辑比如“用户A能否通过修改ID查看用户B的订单”。这类越权问题工具往往扫不出来必须靠测试人员针对业务接口做专门的枚举测试。6. 特定场景实测经验物联网和银行软件测试怎么测6.1 物联网设备软件测试不仅要测App还要测设备端和协议最近很多人在问物联网设备的软件测试怎么做。物联网项目通常是“设备端云端App端”三段式结构任何一环出问题用户体验都会崩。我参与过一个智能门锁项目印象最深的是设备在弱网环境下的表现——手机关了Wi-Fi切到4G门锁指令下发延迟从几百毫秒变成几秒App上一直转圈用户反复点击“开锁”后台收到十几条相同指令。这种问题在单纯App功能测试里根本发现不了必须搭建模拟弱网环境比如在测试路由器上配置丢包与延迟或者用网络损伤仪模拟2G/3G网络。物联网测试还有两个独特关注点协议测试和OTA升级测试。设备与云端之间走的是MQTT、CoAP等协议常见问题包括消息乱序、重连后状态不同步、上下线报文丢失。OTA升级则要关注升级失败后的回滚机制以及升级过程中断电是否会导致设备变砖。做这些测试时最有效的办法是准备一张“设备状态迁移表”把设备从待机、配网、在线、离线、故障等状态的全部变化路径列出来再一条条验证。UI自动化那一套在这里基本无效因为设备端不是页面驱动的。6.2 银行软件测试严谨流程和数据准确性排在第一位银行软件的测试要求和普通互联网项目差异很大。面试官问“银行软件测试怎么做”时本质上是在考察你对严谨流程和数据敏感度的理解。银行的用例必须严格对应每一个业务规则比如贷款利率计算、结息日处理、冲正交易、到期扣款失败重试。这些规则基本都是不模糊的不存在“感觉差不多能用”的说法。银行测试特别重视权限场景。普通用户、柜台操作员、复核员、管理员能看到和操作的数据范围完全不同越权测试是必测点。比如柜员A能否查到不属于自己网点的客户资料复核员能否重空凭证这些用例要细化到按钮和字段级别。另外一个重点是大数据量的批处理测试比如日终跑批、批量结息、批量发短信这类场景通常在凌晨执行测试时要关注批处理的耗时、报表数据一致性、以及中途异常中断的可恢复性。解释一下就是银行系统的稳定性不是“点起来不报错”的稳定而是“每一分钱都要对得上账”的稳定。6.3 从需求出发逆推硬件和金融场景下的用例不管是物联网还是银行你会发现真正有价值的测试思路都来自业务本身。接手一个陌生领域的软件测试时我的习惯是三步走第一步画出完整的业务流程把涉及的外部系统全部标出来第二步找出业务链路里最关键的节点比如支付通知回调、设备主动上报、余额变更、操作留痕第三步围绕关键节点做异常场景枚举包括超时、重复消息、对方系统宕机、数据格式不合法。这三步做完用例覆盖基本不会差到哪里去。7. 面试、简历与AI辅助软件测试新人最该补的功课7.1 简历上怎么写软件测试项目隔三差五就有人问我软件测试简历怎么写才能过筛。我的建议是不要堆“熟练掌握功能测试”这种空话而是要写清三个维度项目背景、你负责的模块、量化的结果。比如“在某电商后台管理系统测试项目中独立负责订单模块和优惠券模块设计用例126条发现有效缺陷31个其中严重以上缺陷8个回归通过率100%”。数字带来的信息量远大于形容词。自动化能力可以写在技能栏但面试官一定会追问所以面试前至少准备一个自己真正跑过的项目用什么语言、什么框架、断言了什么、报告怎么出的。哪怕你只是把3个接口用例跑通了只要你把原理讲清楚也比一个写了十页简历却说不清requests库怎么用的人可信得多。7.2 常见面试题背后的真实考点软件测试面试题看起来五花八门其实翻来覆去就那几个维度测试理论、场景设计、工具使用、环境搭建、项目经验。给你一个白痴式但强烈的建议多准备几个“如果你测微信扫码登录你会怎么测”这类开放题。这类题不会考标准答案而是看你的思考是否按“功能逻辑—异常场景—安全风险—兼容性—性能”展开。个人自我介绍也在面试中占据很重要的位置。银行测试的面试尤其重视自我介绍因为面试官想从中看出来你是否稳重、条理是否清晰。我的模板是姓名、当前职级、最近一家公司负责的项目领域、自己主要负责的模块、用过什么工具、最近在学什么新东西全程控制在两分钟以内。重点突出和岗位匹配的内容比如面银行就说数据准确性和流程管控面互联网电商就说高并发和快速迭代。7.3 用AI工具辅助测试用例设计最后提一句现在很流行的AI辅助软件测试。在输入需求文档或接口说明后让AI先生成一份基线测试用例再由测试人员逐条筛选、补充异常场景可以明显提高用例设计效率。不过AI给出的用例往往偏通用比如“验证必填项是否校验”缺少对业务规则的深层理解。所以AI可以当助手但最终的质量把关仍然靠人的思考。尤其涉及资损、安全、合规方面的测试点绝不能只依赖AI的生成结果。8. 最后说几句我的真实体会做了这么多年测试从手工点点点到搭建自动化回归体系我最深的感触是软件测试的门槛不在工具和代码而在思维习惯。能不能把一个需求拆成可验证的场景能不能在所有人都说“没问题”的时候多问一句“并发的时候呢”“断网的时候呢”才是初级和资深的分水岭。如果你现在正准备入行我不建议你一上来就扎进各种自动化框架里。先把等价类、边界值、场景法这些基础用熟把一条用例从设计、执行、提交缺陷到回归关闭的完整链路走几遍你自然会知道瓶颈在哪里。之后无论是补Python、学pytest还是去研究JMeter和Burp Suite都会变得顺理成章。每个行业对测试的要求都不完全一样物联网重协议和状态银行重数据与合规互联网重效率和迭代。但底层的东西是相通的带着风险意识去测试带着证据去沟通。把这条路走通软件测试这份工作就真的很意思——每天都在用逻辑和细节保护产品不被一个又一个不起眼的“如果”击穿。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进