- 测试场景是要验证的内容的一行语句。
- 测试用例给出了步骤、数据和预期结果,显示了如何验证它。
- 一种场景通常会产生多个测试用例。
- 将细节与风险相匹配:快速团队的简单场景,关键或受监管工作的完整案例。
新测试人员经常听到这两个术语,就好像它们的意思是相同的一样。他们没有。 测试用例与测试场景之间的区别主要在于细节程度,理解它可以帮助您在开始测试之前决定要写多少内容。
本指南对每一项进行了解释,然后通过单个密码重置功能,从要求到场景再到完整的测试用例。该特征及其规则是一个发明的例子。团队和工具之间的术语也略有不同,因此请就这些词在您自己的团队中的含义达成一致。
简短的回答
测试场景描述了要检查的情况,例如“验证用户是否可以重置忘记的密码”。它通常是一行,将细节留给测试人员。
测试用例准确地说明了如何检查该情况下的一个条件:先决条件、步骤、测试数据和预期结果。跟随它的两个测试人员应该得出相同的结论。
考虑计划一次旅行。该场景是“从浦那到德里的旅行”。测试用例是完整的行程,包括航班号、出发时间以及每个阶段要做什么。
测试用例与测试场景并排
| 方面 | 测试场景 | 测试用例 |
|---|---|---|
| 问题已回答 | 我们应该测试什么? | 我们究竟如何测试它? |
| 详情 | 高水平 | 低水平和具体 |
| 典型长度 | 一条线 | 几个字段和步骤 |
| 源自 | 需求、用户故事 | 测试场景 |
| 包括测试数据吗? | 很少 | 是的 |
| 包括预期结果? | 隐含的 | 是的,明确地 |
| 是时候写了 | 分钟 | 更长 |
| 维护保养 | 低 | 更高,因为细节发生了变化 |
| 测试人员的自由 | 高 | 低 |
| 最适合 | 覆盖范围概览,快速团队 | 关键流程、审计、移交 |
什么是测试场景?
测试场景是对用户可能执行的操作或系统必须处理的情况的简要描述。它关注的是外部重要的事情,通常直接来自需求或用户故事。
场景很有价值,因为它们很快。您可以在编写三个详细案例所需的时间内列出三十个案例,这使得它们成为与产品负责人一起审查覆盖范围的好方法:“我们考虑到了所有事情吗?”非技术读者可以毫无困难地遵循一系列场景。
什么是测试用例?
测试用例是一组特定的条件和步骤,用于确定某件事是否有效。一个典型的测试用例包含:
- 唯一的 ID 和清晰的 标题
- 先决条件,意味着开始之前必须满足的条件
- 编号为的步骤
- 具体测试数据
- 预期结果
- 实际结果和状态,运行时填写
当一致性很重要时,测试用例就会大放异彩。新的团队成员可以运行它们,可以在版本之间比较结果,并且您可以记录已验证的内容。我们将在指南中更深入地介绍如何编写测试用例。
一个功能,从头到尾
第一步:需求
忘记密码的用户可以通过电子邮件请求重置链接。该链接有效一次,30 分钟后失效。新密码的长度必须至少为 8 个字符。
第 2 步:测试场景
| 身份证号 | 测试场景 |
|---|---|
| TS-01 | 验证注册用户是否可以使用通过电子邮件发送的链接重置密码 |
| TS-02 | 验证电子邮件未注册时的行为 |
| TS-03 | 验证过期链接无法使用 |
| TS-04 | 验证链接不能使用两次 |
| TS-05 | 验证新密码规则是否得到执行 |
看看 TS-02。该要求从未说明未知电子邮件会发生什么,而编写场景暴露了这一差距。页面是否应该显示该地址未注册?为了安全起见,通常不应该这样做,因为这会让攻击者发现有效的帐户。尽早发现这些问题是编写场景的最大好处之一。
第 3 步:测试用例
现在我们仅将 TS-05 扩展到测试用例中。一种场景变成多种场景:
| 身份证号 | 标题 | 测试数据 | 预期结果 |
|---|---|---|---|
| TC-051 | 接受正好 8 个字符的密码 | abcd1234 |
密码更改,并出现确认信息 |
| TC-052 | 拒绝 7 个字符的密码 | abcd123 |
错误:至少需要 8 个字符 |
| TC-053 | 拒绝空密码 | (blank) | 错误:需要密码 |
| TC-054 | 拒绝不匹配的确认 | abcd1234, abcd9999 |
错误:密码不匹配 |
这些值不是随机的。 TC-051 和 TC-052 位于极限的两侧,使用边界值分析,其他来自等价划分。
测试用例模板
这是 TC-052 的全文。如果您的团队还没有标准,请复制此布局:
ID: TC-052
Title: Reset rejects a password of 7 characters
Scenario: TS-05 New password rules are enforced
Priority: High
Preconditions: Account asha@example.com exists
A valid, unused reset link has been requested
Test data: New password: abcd123
Steps:
1. Open the reset link from the email
2. Enter abcd123 in New password
3. Enter abcd123 in Confirm password
4. Click Reset password
Expected: Error "Password must be at least 8 characters"
Password is unchanged, and the link stays valid
Actual: (filled in during the run)
Status: (Pass / Fail / Blocked)
请注意,预期结果检查的内容不只是错误消息。它还确认旧密码仍然有效并且链接仍然可用。弱测试用例通常会停留在屏幕上可见的内容上。
提示: 在每个测试用例中测试一个条件。如果一个涵盖五件事的案件失败了,你将不知道哪一件失败了。简短、重点突出的案例以后也更容易实现自动化。
它们在更大的图景中的位置
| 级别 | 答案 | 示例 |
|---|---|---|
| 测试策略 | 我们的一般做法是什么? | 自动回归,探索新功能 |
| 测试计划 | 我们将为这个版本做什么? | 帐户功能,于 3 月 3 日至 7 日进行测试 |
| 测试场景 | 我们要检查什么? | 强制执行密码规则 |
| 测试用例 | 我们将如何检查它? | TC-052及其步骤 |
| 测试脚本 | 机器将如何检查它? | TC-052 的自动代码 |
传统上,场景和案例是在软件测试生命周期的测试设计阶段编写的。
何时使用每个
在以下情况下,场景通常就足够了:
- 团队规模较小,经验丰富,并且非常了解产品。
- 时间很短,或者需求经常变化。
- 特点是风险低。
- 您希望与利益相关者一起快速审查覆盖范围。
- 您正在指导探索性测试。
在以下情况下,详细的测试用例值得付出努力:
- 失败的代价将是高昂的,就像支付、安全或健康数据一样。
- 监管机构或审计人员需要测试内容的证据。
- 新的或外包的测试人员必须运行测试。
- 结果必须准确重复,就像在回归套件中一样。
- 这些步骤将成为自动化测试。
大多数成熟的团队都会使用两者。他们列出了所有情况的情况,并只针对最高风险编写完整的案例。无需像银行转账一样记录低风险设置页面的每一步。
场景、案例和自动化
编写良好的测试用例几乎直接映射到自动化测试。前提条件成为设置,步骤成为行动,预期结果成为断言。行为驱动的开发框架甚至使用“场景”一词来表示其可执行规范:
Scenario: Reset rejects a short password
Given I have opened a valid reset link
When I submit the new password "abcd123"
Then I see "Password must be at least 8 characters"
And my password is unchanged
令人困惑的是,BDD 所谓的场景更接近于测试用例,因为它具有特定的数据和结果。这是就条款达成一致的一个很好的提醒。要自动执行这些检查,请参阅我们的 Playwright 教程 或 pytest 教程。
是什么让他们优秀
| 一个好的场景 | 一个好的测试用例 |
|---|---|
| 描述用户目标或情况 | 测试一种特定条件 |
| 返回需求的链接 | 有精确的预期结果 |
| 涵盖失败和成功 | 列出其前提条件和数据 |
| 没有不必要的细节 | 可以由新人运行 |
| 适合一条线 | 不依赖于其他测试 |
常见错误
- 只写快乐的路径。 大多数错误都存在于错误条件下,因此请包括应该失败的内容。
- 使用模糊的预期结果。“它应该正常工作”让任何测试人员都可以决定任何事情。
- 完整记录所有内容。 数千个无人维护的案例比一组有用的案例更糟糕。
- 跳过场景。直接跳到案例可能会忘记整个区域。
- 让案例变得陈旧。当产品发生变化时,旧案例会误导人们。定期查看它们。
- 将步骤与脆弱的细节联系起来。“单击顶部的蓝色按钮”会破坏任何重新设计。
最后的话
场景为您提供广度,测试用例为您提供深度。从下一个功能的场景开始,并与开发人员和产品所有者一起审查它们。然后仅将有风险的案例扩展为完整案例。你会更早地发现空白,并将写作时间花在重要的地方。
常见问题
测试用例和测试场景之间的主要区别是什么?
测试场景是对测试内容的高级说明。测试用例给出了如何测试的具体步骤、数据和预期结果。
测试场景和测试用例哪个先出现?
通常是场景。场景来自需求,然后根据需要更多细节的场景编写测试用例。
一个场景有多少个测试用例?
没有固定的数字。这取决于所涉及的规则和风险,典型的场景可能有多种,包括成功、失败和边界。
敏捷团队需要详细的测试用例吗?
并非总是如此。许多依赖于场景、验收标准和自动化,并且仅针对关键流程或合规性需求保留详细案例。
测试脚本与测试用例相同吗?
不完全是。测试用例描述了要检查的内容,而测试脚本通常是自动执行这些检查的代码,尽管有些团队宽松地使用这些术语。
继续学习
需要测试、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 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,并介绍常见错误与性能技巧。
阅读文章 →