- 软件测试生命周期是用于计划、设计、运行和结束测试的活动序列。
- 通用模型有六个阶段,从需求分析到测试结束。
- 进入和退出标准定义阶段何时开始以及何时结束。
- 敏捷团队保留相同的活动,但在每个冲刺中以小循环重复它们。
当错误到达生产环境时,原因通常不是有人忘记运行测试。问题在于,需求从未受到质疑,测试数据是错误的,或者没有人同意“完成”的含义。 软件测试生命周期通过为测试提供从第一个需求到最终报告的清晰结构来解决这些问题。
本指南解释了每个阶段,然后遵循所有阶段的一个说明性功能:登录页面在五次失败尝试后锁定帐户。消息来源对于阶段数量并不完全一致。您会看到有七个或八个模型,但它们大多以不同的方式分配相同的工作。我们使用广泛教授的六阶段版本。
什么是 STLC?
STLC 是一系列定义的测试活动,旨在确认软件满足其要求。每个阶段都有一个目标、输入和输出,因此测试是有计划和可追踪的,而不是最后临时凑合的。
好处是实用的。测试人员尽早参与,此时修复缺陷的成本较低。努力去承担最高的风险。当经理问“我们准备好发布了吗?”时,团队可以用证据来回答。
STLC 的六个阶段一览
| 阶段 | 主要目标 | 关键输出 |
|---|---|---|
| 1、需求分析 | 了解要测试什么 | 问题、可测试需求、RTM |
| 2. 测试计划 | 决定如何测试 | 测试计划、估算 |
| 3. 测试用例开发 | 设计测试 | 测试用例、脚本、测试数据 |
| 4. 环境设置 | 准备测试地点 | 环境准备就绪,烟雾测试结果 |
| 5. 测试执行 | 运行测试并记录缺陷 | 结果、错误报告 |
| 6. 测试结束 | 评估和学习 | 结案报告、经验教训 |
进入标准是阶段开始之前必须满足的条件。 退出条件是结束之前必须满足的条件。例如,它们可以阻止团队在损坏的构建上运行测试并浪费一天的时间。
第一阶段:需求分析
测试人员研究需求以找出哪些内容可以测试以及哪些内容尚不清楚。这通常是防止错误最便宜的地方,因为问题的成本远远低于生产修复的成本。
- 条目: 已提供需求文档或用户故事。
- 活动: 识别功能性和非功能性需求,提出问题,评估风险并决定哪些内容可以自动化。
- 退出: 回答开放性问题并启动需求可追溯性矩阵 (RTM)。
- 可交付成果: 可测试需求列表和 RTM。
登录示例。故事说“五次尝试失败后锁定帐户”。一个好的测试人员会问:五个在哪个时期?它是如何解锁的?成功登录会重置计数吗?显示什么消息?每个答案都成为可测试的东西。
第 2 阶段:测试计划
团队决定范围、方法、人员、工具、时间表和风险。测试负责人通常负责此阶段。
- 条目:分析了需求并进行了初步风险评估。
- 活动: 定义范围、估计工作量、选择工具、分配角色并为后续阶段设置退出标准。
- 退出:测试计划审核通过。
- 可交付成果: 测试计划和工作量估计。
登录示例。范围:网络和移动设备上的锁定规则、重置和错误消息。超出范围:单点登录,由另一个团队处理。最大的风险是锁定真正的用户,因此受到最多的关注。如果您不确定计划与策略有何不同,请阅读测试计划与测试策略。
第 3 阶段:测试用例开发
这是测试人员编写详细测试用例、自动化脚本和测试数据的地方。
- 条目: 批准的测试计划和稳定的要求。
- 活动:编写和审查测试用例、准备数据、编写自动检查脚本并更新 RTM。
- 退出:测试用例和数据已审核并准备就绪。
- 可交付成果: 测试用例、脚本和测试数据。
| 身份证号 | 场景 | 预期结果 |
|---|---|---|
| TC-01 | 尝试4次失败,则密码正确 | 登录成功,计数重置 |
| TC-02 | 5次失败的尝试 | 帐户锁定并出现清晰的消息 |
| TC-03 | 锁定帐户的正确密码 | 登录仍然被拒绝 |
| TC-04 | 同时在两个浏览器上尝试失败 | 计数是共享的并且保持准确 |
| TC-05 | 使用重置链接解锁 | 登录成功并且计数被清除 |
请注意,TC-01 和 TC-02 测试极限的任一侧,该极限直接来自边界值分析。有关编写这些测试用例的更多信息,请参阅如何编写测试用例。
第 4 阶段:测试环境设置
测试需要在现实的地方运行:正确的服务器、数据、帐户、浏览器和网络访问。此阶段通常与第 3 阶段并行运行,并且可能由开发人员或 DevOps 团队处理。
- 条目:测试计划、架构概述和环境要求。
- 活动: 设置硬件或容器、加载数据、配置访问并安装构建。
- 退出:环境已准备好并且烟雾测试通过。
- 交付成果:工作环境和烟雾测试结果。
登录示例。 登台获取处于已知状态的测试帐户,以及缩短的锁定计时器,因此测试人员无需等待。快速冒烟测试确认在完整运行开始之前登录已加载。容器有助于保持环境的一致性,如我们的 Docker Compose 教程 所示。
第五阶段:测试执行
测试人员运行计划的测试,比较实际结果和预期结果并报告缺陷。已修复的错误将被重新测试,相关区域将接受回归测试。
- 条目: 测试用例已准备就绪,环境正常运行并且构建已交付。
- 活动:运行测试、记录结果、记录缺陷、重新测试修复并更新 RTM。
- 退出: 运行计划的测试,修复或正式接受缺陷。
- 可交付成果: 测试结果和缺陷报告。
登录示例。 TC-04 失败:使用两个浏览器,计数器仅达到 4。测试人员用清晰的步骤和证据记录错误,如如何编写错误报告中所述。修复后,TC-04 将重新运行,相关登录检查将通过回归检查表。
提示: 使退出标准可衡量,并提前达成一致。 “所有关键测试均已通过,并且没有任何严重性错误”是无可争议的。 “测试看起来不错”不是一个标准。
第 6 阶段:测试结束
这个阶段通常被跳过,这是一种耻辱,因为这是团队改进的方式。团队评估周期、归档其工作并记录所学到的知识。
- 条目:执行已完成并且缺陷状态已知。
- 活动:检查退出标准,分析缺陷趋势,归档测试资产并进行回顾。
- 退出: 结案报告已签署。
- 可交付成果: 结束报告和经验教训。
登录示例。报告显示,一次修复后,所有五个案例都通过了。教训是,并发性只是在后期才进行测试,因此未来带有计数器的功能会在设计过程中添加该场景。
STLC 与 SDLC
SDLC(软件开发生命周期)涵盖了整个产品的构建。 STLC 是专注于测试的部分,并与其一起运行。
| 方面 | SDLC | STLC |
|---|---|---|
| 焦点 | 构建和交付软件 | 验证软件 |
| 领导者 | 整个产品团队 | 主要是QA和测试工程师 |
| 阶段 | 需求、设计、构建、测试、部署、维护 | 以上六个阶段 |
| 输出 | 一个工作产品 | 其品质的证据 |
SDLC 中的需求分析为 STLC 中的需求分析提供支持,而开发则将构建交付到测试执行中。测试不必等到编码结束。早开始就是人们所说的“左移”。
敏捷和 DevOps 中的 STLC
这些阶段听起来像是一个漫长的、单向的过程,但事实并非如此。在敏捷中,相同的活动会在每个冲刺中缩小并重复,通常需要几个小时而不是几周:
- 需求分析通过对用户故事的问题进行待办事项细化。
- 规划发生在冲刺规划中,用轻量级的注释代替长文档。
- 测试设计与编码同时进行,通常作为验收标准和自动化测试。
- 环境设置通过容器和基础设施即代码实现自动化。
- 执行在CI/CD管道中连续运行。
- 结束成为冲刺审查和回顾的一部分。
保留有用的内容,并根据风险调整文书工作。小型内部工具可能需要简短的清单,而银行系统出于监管原因可能需要正式签字。
常见错误
- 测试人员迟到。 在需求中发现的错误比发布后发现的错误要便宜得多。
- 模糊的退出标准。如果没有这些标准,最后期限就会为你做出决定。
- 在恶劣的环境中进行测试。 由于错误的数据或配置而导致的失败会浪费时间并削弱信任。
- 跳过关闭。团队然后在下一个周期中重复相同的错误。
- 过于严格地遵循它。 STLC 是一个指南。厚重的文档并不自动意味着更好的质量。
最后的话
软件测试生命周期只是对六个问题的严格回答:我们测试什么、如何测试、使用哪些案例、在哪里、发生了什么以及我们学到了什么?查看您的下一个功能,并检查您的团队通常会跳过哪些问题。弥补这一差距可能会给你带来最大的收获。
常见问题
STLC 的 6 个阶段是什么?
它们是需求分析、测试计划、测试用例开发、测试环境设置、测试执行和测试结束。一些模型将这些分解为更多步骤。
STLC 和 SDLC 有什么区别?
SDLC 涵盖构建整个产品,从需求到维护。 STLC 仅涵盖测试活动,并与开发一起运行。
进入和退出标准是什么?
进入标准是一个阶段开始之前所需的条件,例如稳定的构建。退出标准是完成它所需的条件,例如所有关键测试都通过。
什么是测试中的 RTM?
需求可追溯性矩阵将每个需求映射到其测试用例。它显示是否涵盖了每项要求,并帮助您评估变更的影响。
敏捷中是否使用了 STLC?
是的。敏捷团队执行相同的活动,但每个冲刺中的重复周期更短,并且自动化程度更高,文档更少。
继续学习
需要测试、WordPress 或 SEO 方面的帮助?
我们帮助团队交付更好的软件并发展他们的网站。告诉我们您正在做什么,我们将建议明确的下一步。
更多指南 测试、人工智能和现代开发
喜欢这篇文章吗?选择一个主题并直接跳至我们最新的教程。
人工智能幻觉解释:语言模型为何会产生幻觉以及如何减少它
人工智能幻觉解释:它们是什么,为什么语言模型产生它们,常见类型,如何通过基础和提示来减少它们,以及我们进行的简单检查。
阅读文章 →DevOps环境变量解释:.env 文件、秘密和配置正确完成
使用我们运行的 Python 示例解释环境变量:读取和设置它们、为什么每个值都是字符串、.env 文件、进程继承、秘密和验证。
阅读文章 →软件开发API 速率限制解释:算法、标头和处理 429 错误
API 速率限制通过我们运行的模拟进行了解释:令牌桶、固定窗口、滑动窗口、429 响应、速率限制标头、带回退的重试和测试限制。
阅读文章 →测试自动化Python 中的模拟:unittest.mock、补丁以及导致测试谎言的错误
使用unittest.mock 在Python 中进行模拟,经过测试:模拟和return_value、side_effect、修补使用名称的位置、spec 和autospec、模拟日期以及常见错误。
阅读文章 →软件测试代码覆盖率解释:行覆盖率与分支覆盖率以及 100% 的真正含义
用真实的coverage.py运行来解释代码覆盖率:行、分支和条件覆盖率,阅读报告,为什么100%覆盖率仍然会错过错误,以及合理的目标。
阅读文章 →数据库与 SQLSQL 中的 DELETE、TRUNCATE 和 DROP:差异、回滚以及何时使用它们
DELETE、TRUNCATE 和 DROP 通过经过测试的 SQL 进行了解释:各自删除什么、回滚、触发器、身份重置、速度,以及 PostgreSQL、MySQL、SQL Server 和 SQLite 有何不同。
阅读文章 →数据库与 SQLSQL 视图解释:创建、使用和避免陷阱(附示例)
SQL 视图通过我们运行的查询进行解释:创建视图、实时结果、隐藏列、性能、可更新和物化视图、破坏的依赖关系和最佳实践。
阅读文章 →软件开发TypeScript 接口与类型:真正的差异,使用编译器进行测试
TypeScript 接口与类型,使用真实编译器进行检查:两者都可以做什么,只有一个可以做什么,声明合并,扩展与交集以及要遵循的简单规则。
阅读文章 →软件开发Python *args 和 **kwargs 解释:灵活的函数和清晰的示例
Python *args 和 **kwargs 用我们运行的代码进行了解释:打包和解包、参数顺序、仅关键字和仅位置参数、装饰器和常见错误。
阅读文章 →软件开发Python Lambda 函数:语法、实际用途以及何时不使用它们
Python lambda 函数用我们运行的代码进行了解释:语法、使用键排序、映射和过滤器、闭包、后期绑定陷阱,以及何时普通 def 是更好的选择。
阅读文章 →人工智能什么是人工智能代理?它们是如何工作的,只需运行一个简单的代理循环
什么是人工智能代理?关于代理循环、工具、内存和护栏的简单指南,以及我们运行的一个小型 Python 循环、真正的风险以及何时简单的聊天机器人是更好的选择。
阅读文章 →DevOps监控与可观察性:真正的区别,包括日志、指标和跟踪
监控与可观察性解释:已知和未知的故障、日志、指标和跟踪、检查事件演练、黄金信号、OpenTelemetry 和有用的警报。
阅读文章 →DevOpsDocker Volumes 与 Bind Mounts:以正确的方式保留容器数据
Docker 卷与绑定挂载解释:为什么容器数据消失、命名卷、绑定挂载、tmpfs、Compose 示例、备份、权限以及何时使用它们。
阅读文章 →测试自动化TDD 与 BDD:主要区别、以两种方式构建的一个功能以及何时使用每种方式
TDD 与 BDD 的解释是通过一种双向构建的折扣功能:使用我们运行的代码进行红绿重构、Given-When-Then 场景、工具、权衡以及何时使用每种方案。
阅读文章 →软件测试用户验收测试 (UAT):流程、清单和真实示例
用户验收测试解释:谁运行它、它与 QA 有何不同、七步流程、UAT 测试用例模板、清单、签核标准和常见错误。
阅读文章 →数据库与 SQLSQL NULL 值解释:IS NULL、COALESCE、NULLIF 和要避免的陷阱
通过我们运行的查询解释了 SQL NULL 值:三值逻辑、IS NULL、COALESCE、NULLIF,聚合、连接和排序如何处理 NULL,以及它悄悄引起的错误。
阅读文章 →数据库与 SQLSQL CASE WHEN 语句:语法、实例和常见错误
SQL CASE WHEN 解释了我们运行的查询:简单和搜索表单、条件顺序、SUM 透视、COUNT 技巧、自定义排序、更新和要避免的 NULL 陷阱。
阅读文章 →软件开发什么是智威汤逊?通过工作示例解释 JSON Web 令牌
什么是智威汤逊? JSON Web Tokens 解释:这三个部分,在我们运行的代码中构建和篡改的令牌,JWT 与会话,存储,刷新令牌和安全错误。
阅读文章 →软件开发JavaScript 事件循环解释:调用堆栈、微任务和计时器以及示例
JavaScript 事件循环用我们运行的代码进行了解释:调用堆栈、任务和微任务队列、为什么 setTimeout 0 不是立即执行、阻塞、饥饿和面试测验。
阅读文章 →软件开发Python 生成器和 Yield 解释:通过真实示例节省内存
Python 生成器和yield 用我们运行的代码进行了解释:它们如何暂停和恢复、测量内存节省、管道、无限序列、yield from、发送和常见陷阱。
阅读文章 →人工智能什么是嵌入?向量和余弦相似度简单解释
什么是嵌入?关于向量、余弦相似度和语义搜索的简单语言指南,其中包含我们运行的一个小示例、常见用途、选择模型和已知限制。
阅读文章 →DevOps蓝绿部署与金丝雀部署:差异、权衡以及如何选择
蓝绿部署与金丝雀部署解释:每种部署的工作原理、成本、风险和回滚、我们测试的稳定用户分桶、数据库迁移、滚动更新以及如何选择。
阅读文章 →测试自动化不稳定的测试:造成这些问题的原因以及如何彻底解决它们
我们运行的演示解释了不稳定的测试:主要原因、如何确认和诊断、正确的时间修复、共享状态和日期以及隔离过程。
阅读文章 →软件测试负载测试与压力测试:差异、指标和 k6 示例
负载测试与压力测试的解释:各自证明什么、峰值和浸泡测试、重要的指标、为什么平均值会误导、k6 个示例以及如何计划测试。
阅读文章 →软件测试测试用例与测试场景:主要区别、示例以及何时使用它们
测试用例与测试场景的解释:清晰的定义、并排的表格、从场景到案例的密码重置功能、模板以及何时使用每个功能。
阅读文章 →数据库与 SQLSQL 查询优化:读取执行计划并修复慢速查询(带计时)
对一百万行进行 SQL 查询优化测试:读取执行计划、添加正确的索引、修复不可控制的过滤器、使用复合索引和键集分页。
阅读文章 →数据库与 SQLSQL UNION 与 UNION ALL:差异、示例和性能测试
SQL UNION 与 UNION ALL 通过我们运行的查询进行了解释:重复、都遵循的规则、真实的数据错误、测量的性能、INTERSECT 和 EXCEPT 以及何时使用它们。
阅读文章 →软件开发JavaScript Fetch API 教程:GET、POST、错误处理和超时
针对本地服务器测试的 JavaScript Fetch API 教程:GET 和 POST、为什么不抛出 404、可重用的帮助程序、查询字符串、超时、CORS 和常见错误。
阅读文章 →软件开发Python 文件处理:读取、写入、CSV、JSON 和 pathlib 以及示例
使用我们运行的代码解释了 Python 文件处理:打开模式、使用、读取大文件、CSV、JSON、pathlib、二进制文件、安全写入、错误处理和常见错误。
阅读文章 →软件开发Python 类和对象:带有实际示例的 OOP 教程
用我们运行的代码解释 Python 类和对象:__init__、方法、类与实例属性、继承、属性、dunder 方法、数据类和常见错误。
阅读文章 →人工智能什么是大语言模型?法学硕士如何运作,在没有炒作的情况下进行解释
什么是大语言模型?法学硕士用简单的语言解释:标记、嵌入、注意力、训练、温度和上下文窗口、一个微小的下一个单词演示和真正的限制。
阅读文章 →DevOps适合初学者的 Linux 命令:带有示例的基本终端指南
适合初学者的 Linux 命令,按任务分组:导航、文件、查看日志、grep、管道、权限、进程和档案,并附有实用的日志分析示例。
阅读文章 →测试自动化Selenium 与 Playwright:主要区别、代码比较以及选择
Selenium 与 Playwright 比较:架构、等待、浏览器和语言支持、调试、两种工具中的相同测试、迁移建议以及如何选择。
阅读文章 →软件测试等价划分:通过实例解释测试设计技术
等效分区解释:如何找到有效和无效分区,年龄、密码和优惠券的工作示例,我们运行的测试,以及为什么将其与边界配对。
阅读文章 →软件测试软件测试中的严重性与优先级:差异、矩阵和实例
软件测试中的严重性与优先级解释:清晰的定义、带有示例的四向矩阵、级别尺度、谁设置每个级别以及如何运行错误分类。
阅读文章 →数据库与 SQLSQL 子查询教程:类型、相关子查询和 EXISTS 以及示例
SQL 子查询教程,其中包含我们运行的查询:标量、IN、FROM 和 SELECT 子查询、相关子查询、EXISTS、NOT IN NULL 陷阱以及子查询与 JOIN 与 CTE。
阅读文章 →数据库与 SQLSQL 事务和 ACID 解释:COMMIT、ROLLBACK 和隔离级别
SQL 事务和 ACID 通过我们运行的银行转账进行了解释:COMMIT、ROLLBACK、保存点、锁、隔离级别、脏读、死锁和最佳实践。
阅读文章 →软件开发Git 命令备忘单:您实际使用的命令,以及示例
Git 命令备忘单按任务分组:设置、暂存、分支、远程、存储、历史记录和撤消错误,以及来自真实演示存储库的输出。
阅读文章 →软件开发JavaScript Promise 解释:then、catch、Promise.all 和常见错误
JavaScript 承诺用我们运行的代码进行了解释:状态、then 和 catch 链、错误处理、Promise.all、allSettled、race 和 any、事件循环和常见错误。
阅读文章 →软件开发Python 字典教程:方法、示例和常见模式
Python 字典教程,包含我们运行的代码:创建、读取和更新字典、关键方法、合并、理解、计数和分组模式以及常见错误。
阅读文章 →人工智能什么是 RAG?通过工作示例解释检索增强生成
什么是RAG?检索增强生成逐步解释:索引、分块、嵌入、检索、一个小型的 Python 工作示例、评估和常见故障。
阅读文章 →DevOpsTerraform 初学者教程:从第一个文件到模块的基础设施即代码
适合初学者的 Terraform 教程:从没有云帐户开始,学习初始化、计划和应用,然后是变量、输出、状态、模块和安全的团队工作流程。
阅读文章 →DevOpsDocker 与 Kubernetes:主要区别、它们如何协同工作以及您需要哪些
Docker 与 Kubernetes 的解释:各自的作用、同一个应用程序同时运行、Docker Compose 和 Swarm 的比较、dockershim 的变化以及如何决定您需要什么。
阅读文章 →测试自动化Pytest 初学者教程:夹具、参数化和真实示例
面向初学者的 pytest 教程,其中包含我们在 pytest 9.2 上运行的测试:断言、固定装置、参数化、conftest、标记、tmp_path、monkeypatch、有用的标志和 CI。
阅读文章 →软件测试软件测试生命周期 (STLC):6 个阶段、进入和退出标准、示例
软件测试生命周期解释:六个 STLC 阶段,包括进入和退出标准、可交付成果、有效的登录功能示例、STLC 与 SDLC 以及敏捷中的 STLC。
阅读文章 →软件开发Git merge 与 rebase 的区别:示例及如何选择
用真实的 log 输出、对比表、rebase 黄金法则和安全的团队工作流,讲清 Git merge 与 rebase 的区别。
阅读文章 →软件开发Python 列表推导式:语法、示例与何时避免使用
Python 列表推导式详解:语法、过滤、if-else、嵌套循环、实测耗时,以及何时普通 for 循环更合适。
阅读文章 →数据库与 SQLSQL JOIN 详解:附示例(INNER、LEFT、RIGHT、FULL)
通过示例表和查询,一步步讲解 SQL JOIN:INNER、LEFT、RIGHT、FULL、CROSS 和 SELF,并介绍常见错误与性能技巧。
阅读文章 →