资讯详情

资讯详情

软件测试到底测什么?从用例设计到缺陷管理的完整实战

写这份实验报告之前我一直在想一个问题软件测试到底测的是什么很多人觉得测试就是“点点点”把功能都点一遍没问题就交付。但真正做完一轮系统测试之后你会发现测试的本质是“用成本可控的方式把软件质量风险暴露出来”。一次完整的测试实验不只是找几个bug那么简单它涉及测试策略的制定、用例设计的方法、缺陷管理的流程、自动化工具的选型以及最后报告怎么呈现结论。这篇内容是我基于某高校“软件工程导论”课程中的“软件测试”实验环节整理出来的被测对象是一个模拟的图书管理系统项目我在这里称它为模拟项目X。整个实验从需求分析开始到测试用例设计、执行、缺陷提交、回归验证再到最终报告撰写完整走了一遍。我会把每一步的思路、选型理由、踩过的坑、以及最后沉淀下来的模板和技巧都写出来希望对正在做课程实验或第一次接触系统测试的同学有帮助也希望已经入行的测试新手能从中找到一些能直接落地的做法。1. 实验目标与测试范围1.1 搞清楚“测什么”比“怎么测”更重要拿到实验任务的时候大部分人的第一反应是打开系统、随便点点、找几个明显的报错。这样做出来的报告通常很浅缺陷数量少而且很多都是低级别问题老师一眼就能看出来你没按流程走。我这次的思路是先做测试范围分析。被测系统是一个模拟的图书管理后台功能大致包含用户注册登录、图书查询、借阅、归还、预约、借阅记录统计、管理员图书上新。单看功能点涉及的角色有普通用户和管理员两种数据流向不算复杂但有状态流转可借、已借出、已预约、逾期、归还、续借这就有测试设计的发挥空间了。我把测试范围拆成两层第一层是功能正确性验证第二层是异常流程和边界条件验证。第一层是“系统该做的事”第二层是“系统不该做的事也要测”比如超期未还是一个状态借阅数量超过上限就是一个边界。实验报告里这部分要写清楚“测试项”和“不做测试的项”。我明确排除了界面美观度、视觉配色和性能压力测试当时没有合适的压测环境但是把并发登录和并发借阅这种和业务强相关的场景保留了下来用自动化工具做了轻度验证。1.2 制定测试策略黑盒为主白盒为辅这个项目没有要求做代码级单元测试所以我选择“黑盒测试为主、白盒方法支持用例设计”的组合策略。黑盒测试看的是输入输出对不对输入一个不存在的图书编号系统应该给提示而不是抛异常输入一个已经被借走的书借阅按钮应该是置灰的。这些都不需要看代码但能覆盖到绝大多数用户会遇到的真实场景。白盒方法我用在“借阅流程”这个核心链路上。虽然不要求看代码但我会参考接口文档和分支逻辑把判断条件的每一个分支都测到。比如借阅时系统会依次判断用户是否存在、图书是否存在、图书状态是否可借、用户是否有未归还书、借阅数量是否超上限。这五个条件全部满足才允许借出其中任意一个不满足都要给出明确提示这就是一个典型的判定条件测试用例设计点用判定表法来组织最高效。判定表的好处是不会漏组合。五个条件两两组合有很多种我抽了有代表性的分支来测避免全排列导致用例爆炸。2. 测试用例设计与用例设计方法落地2.1 等价类划分把无限输入变成有限集合测试用例设计是这份实验报告里最有含金量的部分。很多人写用例就是“输入一个正常数据看是否成功”这不能叫用例设计只能叫冒烟测试。我用得最多的是等价类划分。拿“用户注册”模块举例用户名输入项的理论取值是无限的但我可以把它划分为有效等价类和无效等价类。有效等价类包括正常长度的中英文用户名、含数字的用户名、边界长度比如3个字符或者20个字符无效等价类包括为空、超长、含特殊字符、仅空格。这样每个等价类抽一个代表值来测既能覆盖大部分情况又能控制用例数量。我当时在设计“图书ISBN编号”的用例时也是先划分类别。一个合法ISBN是13位数字那我就把“13位纯数字”作为有效等价类把“12位”“14位”“含字母”“含横线”“为空”作为无效等价类。每个类别一个用例看起来简单但真拿去执行还真发现了一个问题系统对“ISBN全数字但校验位错误”的情况完全没有提示这就是测试设计暴露出来的真实缺陷。2.2 边界值分析最隐蔽的bug往往藏在边界上边界值分析是和等价类配合使用的专门测边界附近的取值。我举一个实际的例子需求规定“普通用户同时可借阅图书数量上限为5本”。那测试用例就至少要有借第5本边界点、借第6本边界外一点、以及借第0本空状态。这里我额外加了一个“借完5本后归还1本再借1本”的状态恢复验证目的是确认额度释放逻辑而不只是看数字增减。边界值在实验报告中最容易出效果因为这类用例很直观地体现了“你有测试思维”。我建议你在自己的实验里至少找三个边界场景来写比如日期边界还书日当天是否算逾期、数量边界、长度边界写进报告里会让整个用例设计部分显得非常扎实。2.3 场景法从用户操作流里提取用例对于借阅、归还这种多步骤流程我用场景法设计用例。场景法核心是识别基本流和备选流。基本流是“正常走通流程”备选流是“某一步出错了怎么处理”。以借阅为例基本流是用户登录 → 搜索图书 → 点击借阅 → 确认借阅 → 借阅成功。备选流有很多搜索无结果、图书已借出、用户未登录就点击借阅、用户余额状态异常、连续借阅超过上限。每一个备选流都要对应一个或一组测试用例。我在此处特别做了一个“未登录状态点击借阅”的用例。很多系统的真实bug就在这里未登录点击借阅页面跳转登录页是正常表现但我实际测到的情况是登录成功后直接回到了首页而不是继续之前的借阅流程用户需要重新搜索图书。这是体验问题但也属于缺陷的一种——它违反了“操作连续性”的隐式需求。2.4 测试用例文档的规范写法实验报告中测试用例文档我推荐用表格组织字段至少包含用例编号、测试模块、用例标题、前置条件、测试步骤、输入数据、预期结果、优先级、实际结果。我在写的时候给每条用例加了“用例设计方法”这个字段等价类、边界值、场景法、判定表这个字段在报告评阅时特别加分因为能直接看出你不是瞎写的。我的用例总数控制在60条左右没有追求数量每一类功能都有核心用例覆盖并且每条用例都和需求追踪矩阵里的一项或几项需求建立了映射。这一点也在报告里详细说明了能体现“需求驱动测试”的思路。3. 测试执行过程与缺陷管理3.1 搭建测试环境与准备测试数据测试执行前有两件必须做的事环境准备和数据准备。环境方面我没有用生产环境而是搭了一个独立的测试环境数据都是模拟数据。这样做的好处是执行过程中可以随意造脏数据、重复执行用例不用担心污染真实数据。如果你是在课程实验环境里做也尽量申请一个单独的测试库或者至少把测试数据放在独立的用户下。数据准备方面我准备了一套覆盖各种状态的图书数据正常可借图书、已借出图书、已预约图书、已下架图书、逾期未归还图书、无库存图书。用户数据也分了普通用户、管理员、新注册无借阅记录用户、有逾期记录用户。这套数据本身就是一个测试资产执行用例时不需要临时造数效率高很多。3.2 测试执行中的标注与留痕执行测试用例时我会在用例管理表格里逐条标记通过、失败、阻塞。还有一类叫“不适用”。不适用不是说用例写错了而是该功能在当前版本未实现或被移除需要和需求方确认。这个状态很多初学者不知道容易出现误报或者漏报。执行过程中凡是发现不通过第一件事不是改数据重新跑而是先原样保留现场。截屏、记录当时的操作步骤、请求参数、响应结果这些都是调试和复现缺陷的关键线索。我在报告中就附了几张关键缺陷的截图和操作路径记录让老师或评审人员能快速理解这个bug是怎么触发的。3.3 缺陷报告写清楚“是什么”和“怎么复现”写缺陷报告是我觉得这份实验报告中最能拉开差距的部分之一。一个高质量缺陷单至少要包含七个要素缺陷编号、缺陷标题、所属模块、复现步骤、期望结果、实际结果、严重级别。我最想强调“复现步骤”和“严重级别”。复现步骤要精确到每一步操作包括前置条件比如“登录用户已借阅3本图书当前可借额度为2本”输入什么数据点击什么按钮实际看到什么。大量初学者写的复现步骤是“打开系统试试发现报错”这种描述无法复现缺陷价值直接归零。严重级别我分成四个等级致命级系统崩溃、主流程走不通、严重级核心功能错误、数据计算错误、一般级功能可用但结果不理想、提示级界面文案不规范、交互歧义。我统计了一下这次实验发现的缺陷分布是致命0个、严重3个、一般7个、提示5个。真实系统很少出现大量崩溃级问题但一般级和提示级的问题在报告里同样值得写这代表你对用户体验有一定敏感度。3.4 回归测试策略修改后的验证怎么做开发人员修复缺陷后不能只验证“这个bug修没修好”还要验证“修改有没有影响其他功能”。这就是回归测试。我在实验里执行了两轮回归测试。第一轮回归范围是所有和借阅相关的用例因为开发修复的是借阅数量计算逻辑影响面集中在借阅模块。第二轮回归是全部用例因为临近提交需要确认整个系统处于稳定状态。回归测试中发现了一个新问题修复“借阅数量超限”后之前正常的“管理员代借”流程反而报错了。这说明修改代码时没有评估到关联逻辑回归测试的价值在这一刻体现得特别明显。4. 自动化测试与性能测试初探4.1 工具选型为什么选Selenium而不是更重的框架实验只要求功能测试我一开始就在想有没有必要引入自动化。考虑到系统是Web应用而且核心流程登录、查询、借阅比较固定适合做回归性自动化我最终选择了Selenium WebDriver配合Python来写脚本原因有三个第一是学习成本低脚本写起来直观第二是社区资料多遇到问题很容易找到套路第三是生成的报告容易展示可以在实验报告里贴出脚本关键代码和执行日志。我没有选择更重的自动化测试框架比如集成了数据驱动、关键字驱动的大型框架因为对课程实验来说那套东西搭建成本大于收益。选工具不是越复杂越好而是刚好适配当前需求和团队能力。4.2 自动化脚本实现登录和借阅主流程我写自动化脚本时先做了一个最关键的选择不追求把全部用例自动化只把稳定、可重复执行的主流程脚本化。登录脚本是最典型的。我用WebDriver定位用户名输入框、密码输入框、登录按钮输入测试账号信息点击登录然后断言页面是否出现用户昵称。如果断言不通过就截图保存。这一步需要处理好等待机制我使用的是显式等待等待登录按钮可点击再等待用户信息区域出现而不是盲目用固定休眠时间。固定休眠非常容易在页面加载慢时产生假失败。借阅流程的自动化脚本稍微复杂一点步骤是搜索图书 → 点击借阅 → 确认弹窗 → 校验结果。这里踩了一个坑确认弹窗有一段加载动画如果用立即点击的方式脚本偶尔会失败。后来我加了一个“等待元素可见”的处理脚本稳定多了。这背后暴露的本质问题是前端交互时序自动化测试反而推动了前端团队对弹窗加载态的关注。4.3 轻量级性能测试用模拟并发验证系统的抗压底线性能压测不是这个实验的硬性要求但我还是用JMeter做了三个场景的轻量验证50个用户同时登录、100个用户并发查询图书、30个用户同时提交借阅请求。为什么要做这个因为功能正确只是第一步系统能不能撑住多人同时使用是另一个维度的问题。课程实验阶段不要求系统具备很强的并发能力但做一个轻量压测能提前暴露严重的性能隐患。测量指标主要集中在三个平均响应时间、错误率、吞吐量。我测得的结果显示100个并发查询时平均响应时间从50用户的300毫秒上升到了大约1.2秒错误率从0上升到约3%。响应时间变长是正常的但错误率到3%意味着有请求直接失败了。后来检查原因是数据库连接池配置过小连接被耗尽时新请求拿不到数据库连接。这个发现让我印象很深功能测试完全正常的情况下并发一高问题就出来了。这个部分写进实验报告会让报告的整体深度提升一个档次。5. 测试中的常见问题与排查技巧5.1 偶现缺陷怎么处理现实中有一个很常见的现象测试执行时发现了一个问题截图保存了但再按相同步骤操作它又不出现了。这类偶现缺陷最让人头疼也是最容易在报告中糊弄过去的部分。我的建议是不要改状态为通过应该记录为“偶现问题”并继续关注。处理偶现缺陷我推荐一个方法连续重复执行同一用例N次来复现概率。如果复现不了就记录环境信息、操作时序和当时的前置数据状态。很多偶现问题其实是时序问题比如两个请求并发时状态没有同步前一个请求还没处理完后一个请求就把状态覆盖掉了。我在这份实验里就遇到一个“借阅成功但列表不刷新”的现象。第一次测出来时我以为是自己操作太快导致界面没刷新后来在回归时连续复现了两次仔细检查后发现是前端数据缓存策略问题列表数据请求被本地缓存命中后台已经更新前端展示的是旧数据。这类问题不做重复验证是发现不了真实原因的。5.2 测试数据和真实业务数据不一致测试数据准备得不好测试结果就可能失真。我在实验中发现一个场景测试数据里所有图书的库存数量都只有1本导致几乎所有借阅用例都因为“库存不足”走不到正常流程一度怀疑系统逻辑有bug。后来把数据调整为不同的库存等级问题立刻消失。建议测试数据尽量覆盖多层级正常数据、边界数据、脏数据、空数据。尤其是空数据比如没有任何借阅记录的新用户去查看“当前借阅”页面系统是否给出友好空态提示这也是体验要求的承接点。很多真实系统在空数据时直接白屏或报错属于常见且严重的缺陷。5.3 用例执行顺序影响缺陷复现用例执行的顺序有时会对结果产生影响尤其是涉及数据状态覆盖的场景。比如先执行“归还图书”再执行“重新借阅同一本书”和反过来执行结果可能完全不同。解决办法是为每条用例定义清楚前置条件和数据要求执行时严格重置环境。我在实验中的做法是每执行完一个功能模块的用例后对测试数据进行一次快照还原。这个操作一开始觉得多余后来发现它能省掉大量的“状态串了”的排查时间。写报告时我也把这个规则写进了“测试执行策略”属于很加分的细节。6. 测试报告撰写与实验总结6.1 报告结构让评审一眼看懂质量结论实验报告的最终呈现直接决定了这次测试工作的价值能不能被看到。报告一定要有这几个部分测试概述、测试环境说明、测试范围与策略、用例执行统计、缺陷分析、剩余风险、测试结论。我写报告时把缺陷分析做得比较细按模块和严重级别做了交叉统计。比如我测出的15个缺陷里借阅模块占了7个用户管理占了3个图书查询占了2个其他模块3个。这种分布说明借阅模块的复杂度最高代码质量风险也最大在结论里我会建议优先加强这个模块的代码评审和单元测试。缺陷趋势分析里我统计了“每天新增缺陷数”和“修复率”。第一轮测试发现12个开发修复后回归发现了3个旧缺陷修复引入的新问题。这说明版本质量在波动适合建议在下一次迭代中加强开发自测。简单一条趋势分析就能把项目的真实质量走势讲清楚。6.2 测试结论怎么写不夸大、不藏掖报告结论不能简单地写“测试全部通过”。我在报告里明确写了核心功能流程基本可用未发现致命级缺陷但存在3个严重级缺陷已修复现版本建议做进一步验证后试运行。同时我也把“未覆盖的范围”写清楚比如移动端兼容性未验证、大数据量下的搜索性能未验证。敢于写“未覆盖范围我认为这是从业者最基本也是最重要的一项品质。6.3 我自己的几点体会做完整个测试实验我最强烈的感受就是测试不是一个“找茬”的角色而是项目质量的守门员。测试做得好的标准不在于你发现了多少个bug而在于你是否有足够多的信息去判断“现在能不能上线”。还有一个小技巧想分享给大家测试过程中一定要养成随手记录的习惯。不仅仅是记录bug还可以记录每一轮测试用了多长时间、哪些用例经常失败、哪些模块被测得最少。这些记录最后都是报告的素材。别等到写报告的时候再凭记忆回顾你的记忆没你想的那么可靠。如果这篇内容对你有帮助不妨从设计测试用例开始动手。拿到任何系统先不急着点点点先花半小时画一张功能清单再把每个功能拆成可验证的用例你会发现测试的条理性完全不同。这套方法无论你以后做功能测试、自动化测试还是测试开发都是一样的底层逻辑。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →