测试流程与缺陷管理
软件测试的流程
一个完整、规范的测试流程不仅仅是在代码写完后“找bug”,而是一个贯穿整个软件开发生命周期的、系统性的质量保障活动。它通常包括以下几个核心阶段:
需求分析 -> 测试计划 -> 测试用例设计 -> 测试环境搭建 -> 测试执行 -> 测试评估与报告(缺陷报告 -> 测试报告)。
具体的详细解释可查看上一篇《软件测试基础理论》中的 测试生命周期,这里就不做过多概述了。
举例说明:以一个“用户登录”功能为例
假设我们要测试一个网站的用户登录功能。
- 需求分析与评审:
- 阅读PRD:登录需要用户名/密码,支持找回密码,登录成功后跳转到首页,失败有相应提示。
- 在评审会上提问:“用户名是否区分大小写?”、“密码是否有复杂度要求?”、“登录失败几次会锁定账户?”。
- 测试计划:
- 范围:本次迭代只测试登录主流程,不测试第三方登录。
- 策略:主要进行功能测试,辅以简单的界面和兼容性测试。
- 资源:测试人员A负责,工期2天。
- 测试设计与开发:
- 设计测试用例:
- 用例1(成功登录): 输入正确的用户名和密码 -> 预期结果:跳转到首页,显示欢迎信息。
- 用例2(用户名错误): 输入错误的用户名,正确的密码 -> 预期结果:提示“用户名或密码错误”。
- 用例3(密码错误): 输入正确的用户名,错误的密码 -> 预期结果:提示“用户名或密码错误”。
- 用例4(用户名为空): 用户名为空,点击登录 -> 预期结果:提示“请输入用户名”。
- 用例5(SQL注入): 用户名输入
or 1 = 1-> 预期结果:登录失败,不应出现数据库错误信息。 - 用例6(界面检查): 检查输入框的placeholder文字是否正确,按钮状态是否正常。
- 准备测试数据: 创建几个测试账号,如
test_user1 / password123。
- 设计测试用例:
- 测试环境搭建:
- 部署最新的代码到测试服务器,配置好数据库。
- 测试执行:
- 测试人员按照用例1到用例6的顺序执行测试。
- 在执行 用例5(SQL注入) 时,发现系统弹出了数据库的详细错误信息,而不是友好的提示语。这是一个严重的安全漏洞。
- 测试人员立即在缺陷管理工具(如Jira)中提交一个缺陷:
- 标题: 登录功能存在SQL注入漏洞
- 严重程度: 严重
- 优先级: 高
- 步骤: 1. 进入登录页。 2. 在用户名输入框输入
or 1 = 1。 3. 密码框任意输入。 4. 点击登录。 - 预期结果: 应提示“用户名或密码错误”。
- 实际结果: 页面显示了MySQL的异常堆栈信息。
- 缺陷跟踪与回归测试:
- 开发人员收到缺陷后,进行修复(使用参数化查询,避免SQL注入)。
- 修复完成后,将缺陷状态改为“已修复”,并指派回给测试人员A。
- 测试人员A 回归测试:再次执行用例5,同时为了确保修复没有破坏正常功能,也再次执行用例1(成功登录)和用例2/3(普通失败情况)。确认SQL注入漏洞已修复,且正常功能未受影响。
- 测试报告与总结:
- 所有测试用例执行完毕,严重缺陷已修复。
- 编写报告:本次登录功能测试共执行20个用例,通过19个,发现1个严重缺陷已修复。回归测试通过率100%。结论:登录功能质量符合上线标准。
- 复盘:在用例设计中加入了安全测试用例,效果很好,后续可继续加强。
总结
这个流程是一个理想化的“瀑布模型”下的流程。在现代敏捷开发中,这些阶段依然存在,但周期更短、迭代更快,测试活动会更早地介入(“测试左移”),并与开发紧密协作(如参与每日站会)。但无论流程如何演变,其核心思想不变:通过系统性的活动,尽早、尽多地发现缺陷,并提供质量评估,以保障软件产品的质量。
敏捷/DevOps模式下的测试流程
核心思想转变
在讨论具体流程前,首先要明白一个根本性的转变:
- 传统模式(如瀑布模型): 测试是一个独立的、后期的阶段。开发完成后,测试团队“抛过墙”一样接收产品进行测试。
- 敏捷/DevOps模式: 测试是贯穿整个软件生命周期、所有团队成员共同承担的 持续性活动。它的目标是尽早、频繁地提供质量反馈,而不是在最后“找bug”。
敏捷/DevOps模式下的流程详解
这个流程不是一个线性步骤,而是一个融入每一个开发环节的、持续循环的生态系统。我们可以从以下几个关键维度来理解它:
-
测试左移 - 质量内建
“测试左移”是指将测试活动尽可能地向开发流程的早期推移,在代码编写甚至设计阶段就开始考虑测试。- 具体活动:
- 需求分析阶段: 测试人员参与用户故事讨论,帮助澄清验收标准,并开始编写自动化测试用例(如ATDD)。
- 设计阶段: 测试人员和开发人员共同设计可测试的架构,并开始编写单元测试和集成测试。
- 开发阶段: 开发人员在编写功能代码的同时,必须编写单元测试。测试人员可能已经开始编写API或UI层的自动化测试脚本。
- 举例:
一个团队要开发一个“用户登录”功能。- 传统模式: 产品经理写下需求文档。开发完成后,测试人员根据文档编写测试用例并执行。
- 敏捷模式(测试左移):
- 在“用户故事”梳理会上,产品负责人、开发者和测试者共同讨论,并将验收标准明确为:
- 场景1: 输入正确的用户名和密码,应跳转到首页。
- 场景2: 输入错误的密码,应显示“密码错误”提示。
- 场景3: 用户名不存在,应显示“用户未注册”提示。
- 测试者可以立即将这些验收标准转化为可执行的自动化测试脚本(例如使用Cucumber等BDD工具)。这些脚本在功能开发完成前就已经准备好,一旦功能开发完成,可以立即运行进行验证。
- 在“用户故事”梳理会上,产品负责人、开发者和测试者共同讨论,并将验收标准明确为:
- 具体活动:
-
持续测试 - DevOps的核心
持续测试是DevOps的基石,它意味着每次代码变更都会自动触发一个完整的测试流水线,以快速获得质量反馈。- 具体活动与工具链:
- 开发者提交代码 到版本控制系统(如Git)。
- 持续集成(CI)服务器(如Jenkins, GitLab CI, GitHub Actions)被触发,拉取最新代码。
- 构建与单元测试: CI服务器运行构建脚本,并执行所有单元测试(使用JUnit, pytest等)。这是最快的一层反馈。
- 静态代码分析(使用SonarQube)可能同时进行,检查代码质量、安全漏洞和坏味道。
- 集成测试/API测试: 如果单元测试通过,会启动一个测试环境,部署应用,并运行集成测试和API测试(使用Postman, RestAssured)。
- UI自动化测试: 更耗时的UI自动化测试(使用Selenium, Cypress)可能会在后续阶段并行或选择性地运行。
- 性能与安全测试: 在流水线的特定阶段(如每日夜间构建),会自动运行自动化性能测试(使用JMeter)和安全扫描(使用OWASP ZAP)。
- 报告与反馈: 所有测试结果都会集中报告。如果任何一步失败,流水线会立即“熔断”,通知团队,阻止有缺陷的代码进入下一阶段。
- 举例:
一个开发者修复了一个“购物车计算总价”的bug。- 他提交代码到Git仓库。
- Jenkins检测到变更,开始执行CI流水线。
- 第一步: 运行500个单元测试,全部通过。
- 第二步: 部署到测试环境,运行200个API测试。其中一个测试失败,因为新代码影响了优惠券计算逻辑。
- 结果: Jenkins立即标记本次构建为失败,并发送邮件/钉钉通知给该开发者和团队。
- 行动: 开发者立刻收到反馈,在几分钟内就定位并修复了问题,而不是等到测试周期结束时才被发现。
- 具体活动与工具链:
-
测试右移 - 监控生产环境
“测试右移”是指将测试活动延伸到生产环境,通过监控真实用户的行为和数据来获取质量反馈。- 具体活动:
- 生产环境监控: 监控应用的性能指标(如响应时间、错误率、CPU使用率)。
- 业务指标监控: 监控关键业务指标(如订单成功率、用户注册转化率)是否异常。
- 混沌工程: 故意在生产或类生产环境中引入故障(如关闭某个服务),以验证系统的韧性。
- A/B测试: 将新功能面向部分用户发布,通过对比用户行为数据来决定功能的去留。
- 举例:
一个电商平台发布了一个新的推荐算法。- 传统模式: 在测试环境进行功能和非功能测试后,直接全量发布。
- DevOps模式(测试右移):
- 采用金丝雀发布,先将新算法部署到1%的服务器上,面向少量用户。
- 实时监控这1%用户会话的错误率和点击率。
- 发现错误率没有上升,但点击率比旧版本低了20%。
- 团队立即回滚新版本,避免了全量发布可能带来的业务损失。这种在真实场景中才能发现的“业务逻辑”或“用户体验”问题,是测试右移的核心价值。
- 具体活动:
-
测试类型与测试金字塔
在敏捷/DevOps中,测试活动遵循“测试金字塔”模型,以指导自动化测试的策略。- 底层(大量):单元测试 - 快速、隔离、成本低。由开发者编写和维护。(例如:测试一个计算税费的函数)
- 中层(中等):集成测试/API测试 - 验证服务/模块间的交互。比UI测试快且稳定。(例如:测试“创建订单”API是否成功调用了下单和扣库存服务)
- 顶层(少量):UI自动化测试 - 从用户界面验证端到端的业务流程。速度慢、脆弱、维护成本高。(例如:通过浏览器模拟用户完成从浏览商品到支付的完整流程)
目标: 追求金字塔下层的大量、快速测试,以保证底层质量;用顶层的少量测试覆盖最关键的用户旅程。
总结:一个完整的用户故事生命周期示例
故事: “作为一个用户,我希望能够重置我的密码。”
- 需求讨论(左移):
- 团队(含测试)共同定义验收标准:输入注册邮箱 > 收到重置链接 > 点击链接进入重置页面 > 设置新密码成功 > 能用新密码登录。
- 测试人员开始构思测试场景(邮箱格式错误、邮箱未注册、链接过期等)。
- 开发与测试实现(持续集成):
- 开发者A 编写后端发送邮件服务,并为其编写单元测试。
- 开发者B 编写前端重置密码页面,并编写组件单元测试。
- 测试者C 根据验收标准,编写API测试脚本(用于测试发送邮件、验证令牌、重置密码等接口)。
- 测试者C 编写一个关键的UI端到端测试脚本(模拟用户完成整个重置流程)。
- 代码提交与流水线(持续测试):
- A和B完成代码后,提交并推送。CI流水线启动。
- 所有单元测试通过。
- 应用被部署到集成测试环境。
- API测试和UI端到端测试自动运行,并全部通过。
- 构建成功,应用被自动部署到类生产环境,准备进行手动探索性测试。
- 发布与监控(右移):
- 功能通过功能开关发布,初始只对内部员工开放。
- 监控系统显示“密码重置请求”API的调用次数和错误率正常。
- 几天后,全量发布给所有用户。通过业务监控发现,密码重置的成功率很高,没有异常报警。
通过这个融合了敏捷(小步快跑、团队协作)和DevOps(自动化、持续反馈)的流程,团队以高质量、高效率的方式交付了用户价值。测试不再是瓶颈,而是加速器和质量保障者。
一句话总结
在敏捷/DevOps中,测试不再是开发完成后的一道独立工序,而是贯穿于整个软件生命周期的、高度自动化的持续反馈活动,其核心是“测试左移”到开发早期、“持续测试”于集成阶段、“测试右移”到生产环境。
如果需要一个极简版:
测试已融入开发的每一步,通过自动化实现持续的质量反馈。
缺陷的生命周期与管理流程
好的,我们来详细探讨软件测试中一个至关重要的概念——缺陷的生命周期与管理流程。这不仅仅是记录一个Bug,而是一个涉及多方协作、确保问题被有效跟踪和解决的完整过程。
一、 缺陷生命周期的详细阶段
缺陷(Bug)生命周期指的是一个缺陷从被创建、被跟踪、被处理直到被关闭的整个历程流转过程。它清晰地定义了一个Bug在它的“一生”中会经历哪些状态,以及这些状态之间如何转换。
核心角色
在了解状态之前,先明确参与其中的核心角色:
- 测试人员: 缺陷的发现者和报告者,负责后续的验证。
- 开发人员: 缺陷的修复者。
- 测试组长/项目经理: 有时负责分配缺陷或决定是否延期/拒绝修复。
- 产品经理: 当涉及需求争议时,作为决策者。
缺陷状态流转图
一个典型且相对完整的缺陷生命周期包含以下状态,其流转如下图所示:

核心状态:
-
新建/打开 (New/Open)
- 描述: 测试人员发现并提交一个缺陷,此时缺陷的初始状态。
- 责任人: 测试人员。
-
已分配 (Assigned)
- 描述: 测试组长或项目经理将新建的缺陷分配给相应的开发人员。
- 责任人: 测试组长/项目经理。
-
已打开/处理中 (In Progress)
- 描述: 开发人员开始分析并修复这个缺陷。
- 责任人: 开发人员。
-
已修复 (Fixed)
- 描述: 开发人员完成代码修改,认为缺陷已修复,并将缺陷状态置为此。随后将任务返还给测试人员。
- 责任人: 开发人员。
-
重新测试/待验证 (Retest/Pending Verification)
- 描述: 测试人员看到缺陷状态为“已修复”后,准备在下一轮测试中验证该缺陷。
- 责任人: 测试人员。
-
已关闭 (Closed)
- 描述: 测试人员验证后,确认缺陷已被成功修复,则关闭该缺陷。
- 责任人: 测试人员。
-
重新打开 (Reopened)
- 描述: 测试人员在验证时发现缺陷没有被彻底修复,问题依然存在。此时将缺陷状态从“已关闭”或“已修复”重新置为“重新打开”,并再次分配给开发人员。
- 责任人: 测试人员。
其他可能的状态:
- 拒绝 (Rejected)
- 描述: 开发人员认为这不是一个缺陷(例如,符合设计、操作不当、无法重现等)。此时需要测试人员和开发人员进行沟通确认。如果测试人员坚持,可以重新打开;如果确认是误报,则可以关闭。
- 延期 (Deferred)
- 描述: 确认是缺陷,但由于优先级低、影响范围小或当前版本时间紧张,决定在后续版本中修复。
二、 缺陷报告的核心字段(管理流程的体现)
一个高质量的缺陷报告是有效管理的基础。它必须包含以下关键信息:
1. 标题 (Title)
- 要求: 简洁、准确、一目了然。好的标题应该能让开发人员和其他成员快速理解问题的核心。
- 格式建议:
[模块名称] - [简要问题描述] - 好坏对比:
- 差: “登录有问题” (太模糊,不知道具体什么问题)
- 优: “[登录模块] - 使用错误密码登录时,提示信息不明确且未记录失败日志”
2. 步骤 (Steps to Reproduce)
- 要求: 清晰、详细、可复现。按照步骤操作,任何人都能重现这个缺陷。
- 写法: 使用序号,一步一步地描述操作过程。
- 示例:
- 打开应用首页。
- 点击‘登录’按钮。
- 在用户名输入框输入 “testuser”。
- 在密码输入框输入 “wrongpassword”。
- 再次点击‘登录’按钮。
3. 预期结果 (Expected Result)
- 要求: 根据需求或设计,描述在正常情况下,执行上述步骤后应该发生什么。
- 示例: 系统应显示清晰的错误提示:“用户名或密码错误”,并在应用日志中记录一次登录失败尝试。
4. 实际结果 (Actual Result)
- 要求: 客观地描述执行上述步骤后实际发生了什么。
- 示例: 页面跳转到了一个显示“500 Internal Server Error”的空白页面,且应用日志中无任何相关记录。
5. 严重级别 (Severity)
- 描述: 缺陷对软件功能的影响程度。从测试人员的角度评估。
- 常见等级:
- 致命 (Critical/Blocker): 导致系统崩溃、数据丢失、核心功能完全失效。
- 高 (High/Major): 主要功能点无法使用,但不会导致系统崩溃。例如,无法成功下单。
- 中 (Medium/Normal): 功能存在缺陷,但有变通方法。例如,提示信息错误、UI错位。
- 低 (Low/Minor/Trivial): 界面拼写错误、颜色不协调等不影响功能的问题。
6. 优先级 (Priority)
- 描述: 修复缺陷的紧急程度。通常由项目经理或产品经理从业务角度决定。
- 常见等级:
- 立即解决 (P1 - High): 必须立即修复,否则会阻塞开发或测试。
- 高优先级 (P2 - Medium): 应在当前版本中修复。
- 中优先级 (P3 - Low): 可以在时间允许时修复。
- 低优先级 (P4 - Lowest): 可能会修复,也可能不会。
严重级别 vs 优先级的关系:
- 通常,严重级别高的缺陷优先级也高。但并非总是如此。
- 举例: 一个应用启动画面上公司Logo颜色显示错误(严重级别-低),但明天是给大客户演示的日子(优先级-高)。一个导致数据计算轻微偏差的缺陷(严重级别-高),但只影响一个极少使用的功能(优先级-中)。
7. 附件 (Attachments)
- 描述: “一图胜千言”。提供直观的证据。
- 可包含内容:
- 截图/屏幕录像: 清晰地展示缺陷现象。
- 日志文件: 错误发生时的系统日志或应用日志。
- 测试数据: 用于重现问题的特定数据文件。
三、 综合举例说明
场景: 测试一个电子商务网站的“提交订单”功能。
缺陷报告示例:
- 标题:
[订单模块] - 商品库存不足时,仍可成功提交订单并生成待付款订单 - 严重级别: 高 (High) // 因为会导致超卖,影响商业信誉。
- 优先级: 高 (High) // 需要尽快修复,否则可能造成实际损失。
- 步骤 (Steps to Reproduce):
- 登录一个有效用户账号。
- 搜索商品 “iPhone 15”,该商品当前库存显示为1件。
- 将该商品加入购物车。
- 进入购物车,将商品数量修改为
2,页面提示“库存不足”。 - (关键步骤) 不刷新页面,快速将数量从
2改回1。 - 点击“立即下单”按钮。
- 在订单确认页,点击“提交订单”。
- 预期结果 (Expected Result):
- 系统应再次校验库存,由于库存不足(第4步后,可能另一个用户已买走最后一件),应阻止订单提交,并给用户明确提示:“商品库存不足,请重新确认”。
- 实际结果 (Actual Result):
- 系统成功生成了一个待付款订单,订单状态为“待支付”。用户可以进行付款操作,但这将导致超卖。
- 附件 (Attachments):
- 截图1: 显示购物车数量为2时,提示“库存不足”的页面。
- 截图2: 显示成功生成的待付款订单页面。
- 日志片段: 显示在提交订单时,后端服务没有正确地从数据库校验库存。
这个缺陷的生命周期可能是:
- 新建: 测试人员提交上述缺陷报告。
- 已分配: 测试组长将其分配给后端开发工程师张三。
- 处理中: 张三分析代码,发现是在高并发场景下,前端缓存了库存信息,后端在处理订单时缺乏“二次校验”机制。
- 已修复: 张三修复了代码,在提交订单前增加了数据库的实时库存校验,并将状态改为“已修复”。
- 重新测试: 测试人员在收到新版本后,验证这个缺陷。
- 验证通过 -> 已关闭: 测试人员按照原步骤测试,发现现在系统会正确提示“库存不足,订单提交失败”,于是关闭该缺陷。
如果测试人员验证时发现,虽然提示了库存不足,但页面却崩溃了,那么他会将缺陷 重新打开,并附加新的截图和日志,生命周期进入新一轮循环。
通过这样一套严谨的流程和清晰的报告,团队可以高效地跟踪和管理每一个缺陷,确保软件质量得到有效控制。
如何编写清晰、准确、可复现的缺陷报告
对于初学者来说,编写一份清晰、准确、可复现的缺陷报告是核心技能。这不仅是告诉开发人员“这里有问题”,更是为了帮助他们“快速定位并修复问题”。
核心目标:像“说明书”一样写缺陷报告
想象一下,你是在给一个从没接触过这个功能的开发人员写一份“问题说明书”。他要仅凭你的描述,就能在自己的电脑上完美地重现你遇到的问题。
分步指南与模板
第一步:写一个“一目了然”的标题
- 黄金法则:【在哪里】-【发生了什么】-【在什么条件下】(可选)
- 怎么做:
- 【在哪里】: 指明具体的模块、页面或功能。例如:
[用户登录]、[购物车页面]。 - 【发生了什么】: 用最精炼的语言描述问题的核心。避免使用“bug”、“不好用”等模糊词汇。
- 【在什么条件下】: 如果条件关键,就加上。例如:
[在iOS 16上]。
- 【在哪里】: 指明具体的模块、页面或功能。例如:
- 初学者常见错误与修正:
- 差: “登录不了” (太模糊)
- 中: “登录失败” (好一点,但不知道原因)
- 优:
[登录模块] - 输入正确用户名和密码后,点击登录按钮无响应 - 更优:
[支付页面] - 使用支付宝支付时,应用闪退
第二步:描述“精确到像素”的复现步骤
这是报告的灵魂,决定了开发人员能否重现问题。
- 黄金法则: 编号、按顺序、写清楚每一个操作和输入。
- 怎么做:
- 从最初始的状态开始(如:打开App,打开浏览器输入网址)。
- 一步一步地描述你的操作,就像在教一个新手一样。
- 明确指出你点击了什么、输入了什么数据。
- 如果涉及特定数据,直接写出来。
- 初学者常见错误与修正:
- 差: “随便操作几下就报错了。” (完全无用)
- 中: “在商品页面,点击购买,然后程序就崩溃了。” (缺少关键细节)
- 优:
- 打开App,进入首页。
- 在搜索框输入 “iPhone 15”,点击搜索按钮。
- 在搜索结果列表,点击第一个商品进入详情页。
- 点击页面下方的“立即购买”按钮。
- 观察到:App瞬间关闭,退回手机桌面。
第三步:定义“泾渭分明”的预期与实际结果
这部分清晰地展示了“什么应该发生”和“实际发生了什么”之间的冲突。
- 黄金法则: 预期结果基于需求,实际结果基于观察。两者要直接对应。
- 怎么做:
- 预期结果: 根据需求文档、设计稿或常识,描述在完美情况下,执行完上述步骤后应该看到什么。
- 实际结果: 客观地、不加修饰地描述你实际看到的现象。
- 示例:
- 复现步骤: (接上一步)...
- 预期结果: 应正常跳转到订单确认页面。
- 实际结果: App瞬间闪退,退回手机桌面。
第四步:提供“无可辩驳”的证据(附件)
- 黄金法则: “有图有真相”,有日志有根因。
- 怎么做:
- 截图/屏幕录像: 这是最最重要的附件!截下错误页面的全貌。如果问题动态,就用手机录屏。
- 日志: 如果系统有日志功能,在出现问题后立即保存日志文件。这对于闪退、性能问题至关重要。
- 错误信息: 完整地复制错误弹窗上的所有文字。
第五步:设定“合情合理”的严重级别和优先级
作为初学者,可以先从简单的判断开始:
- 严重级别(对系统的影响):
- 高: 软件崩溃、手机重启、数据丢失、核心功能完全不能用(如:无法下单)。
- 中: 功能有问题,但有替代方法(如:图片无法上传,但手动粘贴可以)。
- 低: 界面文字错误、颜色不对、错别字。
- 优先级(修复的紧急程度):
- 初学者可以暂不填写,或请教你的导师/组长。通常,严重级别高的问题,优先级也高。
初学者快速自查清单
在点击“提交”按钮前,问自己三个问题:
- 一个完全不了解情况的开发人员,能只看我的描述就重现问题吗? (检查步骤是否清晰、可复现)
- 我是否清晰地指出了“应该怎样”和“实际怎样”的差别? (检查预期和实际结果)
- 我提供的证据(截图/日志)是否足以证明这个问题的存在? (检查附件)
实战模板(填空即可)
标题: [模块名] - 简短的问题描述
- 复现步骤:
- ...
- ...
- ...
- 预期结果:
- ...
- 实际结果:
- ...
- 严重级别: [高/中/低]
- 测试环境: [例如: iPhone 15 Pro Max / iOS 17.4, App版本 v2.1.0]
- 附件: [截图、日志等]
总结
对初学者而言,“清晰、准确、可复现” 的核心在于 细节 和 同理心。多站在开发者的角度思考,为他们提供所有必要的“破案线索”,你就能从一名问题“发现者”,晋升为团队中不可或缺的质量“守护者”。
测试工程师的思维转变
思维转变是作为一个测试工程师最根本的素养,那么基于我的理解,让我们来深入探讨一下这两种思维的内涵。
- 从构建到破坏:开发是构建软件,测试是寻找软件中的问题,需要转变思维,学会从不同角度思考软件可能存在的问题。
- 用户视角:测试需要从用户的角度出发,考虑用户体验和软件的实际使用场景。
思维转变一:从“构建者”到“破坏者”(批判性思维)
1. 核心内涵
- 开发思维(构建): 关注于如何实现需求、让功能跑起来。思维模式是“如何让它工作?”(How to make it work?)。目标是创造,是让代码按预想路径执行。
- 测试思维(破坏): 关注于如何让功能失败、找出薄弱环节。思维模式是“如何让它失败?”(How to make it break?)。目标是质疑和验证,是探索代码所有未预想的路径。
这种转变并非出于恶意,而是以一种“友好的敌人”的姿态,在软件发布给真实用户之前,尽可能多地发现并排除潜在问题。
2. 如何实践这种思维?
- 挑战“理所当然”: 不要轻易相信“这里肯定没问题”。对于每一个输入框,不仅要考虑正确的输入,更要考虑错误的、边界的、异常的、畸形的输入。
- 举例: 一个年龄输入框,开发人员可能只考虑了输入18-60。而测试人员会想:输入0、负数、小数、1000、汉字、字母、特殊符号、超长字符串、SQL注入语句、甚至直接不输入(空值)会怎样?
- 寻找逻辑漏洞: 不仅要看代码是否执行了,更要看它在复杂交互和异常情况下是否依然健壮。
- 举例: 在电商网站下单时,网络突然中断,订单是处于什么状态?重复点击提交订单按钮,是会生成多个订单,还是有防重复提交机制?
- 逆向思维: 不仅关心“成功了会怎样”,更关心“失败了会怎样”。关注系统的错误处理和信息反馈。
- 举例: 用户登录失败时,系统的错误提示信息是否过于详细以至于泄露了敏感信息(例如,是提示“密码错误”而不是“用户名或密码错误”,从而让攻击者可以枚举用户名)?
思维转变二:从“技术视角”到“用户视角”(同理心思维)
1. 核心内涵
- 开发/技术思维: 关注技术实现、代码逻辑、数据库设计、API接口。可能会忽略一个按钮的颜色、位置、文案对普通用户的影响。
- 用户视角(测试思维): 关注软件是否易用、直观、高效、令人愉悦。测试人员是用户的代言人,需要代表那些不懂技术、只会按照直觉操作的最终用户。
2. 如何实践这种思维?
- 场景化思考: 不要孤立地测试功能,而是将功能放到真实的用户使用场景中去。
- 举例: 测试一个天气预报App。不能只测试API返回的数据是否正确。要想象用户场景:一个上班族早上匆忙出门前,打开App:
- 界面信息是否一目了然?
- 需要点击多少次才能看到今天整天的天气变化?
- 在户外强光下,屏幕内容是否清晰可见?
- 网络不好时,加载速度是否过慢,是否有友好的加载提示?
- 举例: 测试一个天气预报App。不能只测试API返回的数据是否正确。要想象用户场景:一个上班族早上匆忙出门前,打开App:
- 关注用户体验(UX): 关心所有影响用户感受的细节。
- 举例:
- 文案: 错误提示语是生硬的“操作失败,错误代码-500”,还是友好的“网络开小差了,请稍后再试”?
- 交互: 执行一个耗时操作(如上传文件)时,是否有进度条提示?还是让用户干等着?
- 流程: 一个新用户注册流程是否需要填写太多不必要的字段?流程是否可以更简化?
- 举例:
- 考虑用户多样性: 用户不只有一种。
- 举例:
- 新手用户: 引导是否清晰?会不会迷路?
- 残障人士: 是否支持屏幕阅读器?(无障碍测试)
- 不同设备/环境用户: 在老旧的低端手机上运行是否流畅?在网速慢的电梯/地铁里使用体验如何?
- 举例:
两种思维的融合:成为卓越的测试工程师
最优秀的测试人员,能够将这两种思维完美地结合在一起。
一个综合案例:测试一个“评论发表”功能
-
“破坏性思维”启动:
- 评论内容为空,直接点击提交。
- 输入超长评论(如10000字)。
- 在评论中输入HTML标签
<script>alert('xss')</script>。 - 快速连续点击提交按钮。
- 在提交过程中断网。
-
“用户视角”启动:
- 发表成功后,评论的显示格式是否正确?时间显示是否易读(如“2分钟前” vs “2024-05-31 14:05:01”)?
- 编辑或删除自己评论的入口是否清晰易找?
- 如果评论需要审核,是否明确告知了用户“评论已提交,正在审核中”?
- 从写完评论到找到提交按钮,视线是否需要大幅度移动?操作流程是否顺畅?
结论:
理解这两种思维转变,正是测试工作的精髓所在。
- “从构建到破坏” 确保了软件的健壮性和可靠性,好比是建筑的质量监理,负责找出结构安全隐患。
- “用户视角” 确保了软件的可用性和价值,好比是建筑的室内设计师和用户体验师,负责确保住进去的人感到舒适、方便。
培养并熟练运用这两种思维,你就能不仅仅是一个“找Bug的人”,而是一个真正的“质量守护者”和“用户代言人”,在软件团队中发挥不可替代的价值。
到这里,测试工程师所需要掌握的基础理论知识就结束了,稍后则是掌握测试工具的相关内容进行一一更新。喜欢的小伙伴动动你们的小手,帮忙点点支持。

浙公网安备 33010602011771号