用户验收测试 (UAT):流程、清单和真实示例

  1. 首页
  2. 博客
  3. 软件测试

软件测试

用户验收测试 (UAT):流程、清单和真实示例

软件可以通过所有测试,但仍然无法满足需要它的人的需求。 UAT 是其解决实际业务问题的最终检查。了解谁应该运行它、如何规划它以及何时结束。

阅读约 9 分钟
用户验收测试 (UAT):流程、清单和真实示例

要点速览

  • 用户验收测试 使用真实场景检查软件是否满足实际业务需求。
  • 它由业务用户或客户运行,而不是由构建软件的团队运行。
  • QA 问“它是否按规定工作?”,而 UAT 问“它是否解决了问题?”。
  • 在 UAT 开始之前就进入标准、退出标准以及谁签字达成一致。

团队一旦交付了通过所有技术测试的费用系统。第一天,财务团队发现无法处理多币种索赔,而这占据了他们工作的很大一部分。没有什么东西“坏了”,但它无法使用。 用户验收测试的存在就是为了在发布之前准确地捕捉到这种差距。

本指南介绍了 UAT 与其他测试的不同之处、如何逐步运行它以及如何决定何时准备发布。上面的场景和下面的示例是说明性的,应该调整该过程以适合您的项目。

什么是UAT?

UAT 通常是发布前的最后测试阶段,目标用户确认软件可以在现实条件下完成其工作。它也称为最终用户测试或验收测试。它是在开发和系统测试之后发布的,此时产品预计会稳定。

其目的不是找到每一个错误。到这个阶段,其中大部分应该已经消失了。目的是验证:我们构建了正确的东西吗?测试人员验证产品是否符合规格。 UAT 验证规范和产品确实满足需求。

UAT 与 QA 测试

方面 质量保证或系统测试 UAT
主要问题 它是否按规定工作? 是否满足业务需求?
表演者: 测试员和 QA 工程师 企业用户或客户
时机 开发期间和开发后 就在发布之前
基于 要求和设计 真实的业务工作流程
焦点 缺陷、边缘情况、集成 可用性和适合目的
技术知识 经常高 不需要
结果 错误报告 接受或拒绝

UAT 不会取代其他测试。如果用户不断遇到基本错误,则构建尚未准备好,并且您正在浪费他们有限的时间。这些问题属于早期测试级别和回归测试。

谁运行 UAT?

角色 责任
最终用户 运行场景并提供反馈
产品负责人或业务分析师 定义范围并编写或审查场景
UAT 协调员或 QA 负责人 计划会议、支持测试人员、跟踪问题
开发商 修复问题并回答技术问题
商业赞助商 做出最终签字决定

选择真正从事当前工作的测试人员。经验丰富的索赔处理人员会发现经理或代理人永远不会发现的问题。包括一系列的经验,因为新员工经常会透露一些令人困惑的步骤,而专家却没有注意到这些步骤。并确保他们的经理为此腾出时间,因为 UAT 无法在满负荷工作的情况下取得成功。

UAT 的类型

类型 它检查什么 示例
业务受理 满足业务目标 工作人员从头到尾完成真实的索赔
阿尔法测试 在受控环境中进行内部测试 员工先于外部用户尝试新应用
贝塔测试 真实条件下的真实客户 有限的公开预览
合同验收 符合商定的合同条款 客户验证交付的系统
监管验收 符合法律或合规规则 检查医疗保健或银行规则
运营验收 准备在生产中运行 备份、监控和支持流程

UAT 七步流程

1. 定义范围和目标

决定什么是被接受的,什么是超出范围的,以及什么是重要的业务成果。例如:“财务人员可以以任何支持的货币提交、批准和支付费用报销。”

2. 同意验收标准

用通俗易懂的语言写下成功的样子,最好是在项目开始时而不是启动前一周。模糊的标准会导致后来的争论。

3. 选择并介绍测试人员

选择真实的用户,解释目的,向他们展示如何记录反馈,并明确他们正在测试软件而不是自己被测试。许多人担心会出现问题。

4.准备环境和数据

UAT 环境应尽可能接近生产环境。使用真实的数据,设置正确的用户角色,并检查电子邮件等集成。如果复制生产数据,请先屏蔽个人信息。运行快速冒烟测试,这样测试人员就不会发现损坏的构建。

5. 编写场景

这些基于真实的工作流程而不是单个按钮。他们应该像工作一样阅读,而不是像软件一样阅读。我们的测试用例与测试场景指南解释了您需要多少详细信息。

6. 运行测试并收集反馈

与可以提供帮助的人进行会议。将问题收集到一处,并附上屏幕截图。也留出一些时间进行自由探索,因为人们会尝试脚本从未预料到的事情。 探索性测试为此提供了有用的技术。

7. 修复、重新测试并签核

对反馈进行分类,修复重要问题,并让相同的用户确认修复。然后记录正式决定。

UAT测试用例

UAT 测试用例对于非技术人员来说应该很容易遵循。以下是费用系统的示例:

ID:        UAT-012
Scenario:  Submit a foreign currency expense claim
User role: Sales employee
Before:    Logged in, with a USD receipt ready

Steps:
  1. Create a new expense claim
  2. Enter a client dinner of 80 USD and attach the receipt
  3. Submit the claim for approval

Expected:  The amount is converted to INR at the current rate
           The manager receives an approval request
           The claim shows as "Awaiting approval"

Result:    Pass / Fail
Comments:
Tester / Date:

请注意,它描述的是真实任务,而不是技术细节,并且它留有评论的空间。这些评论常常被证明是最有价值的部分,例如“这有效,但我永远找不到那个按钮”。

提示: 观察至少一名用户亲自或通过电话执行此操作。人们经常围绕令人困惑的软件进行工作,但从不报告它。看到他们犹豫不决,比“通过”更能说明问题。

进入和退出标准

进入标准(准备开始) 退出标准(准备完成)
系统测试完成 所有关键场景均已运行
没有公开的严重或严重错误 没有公开的严重错误
环境和数据准备就绪 已达到约定的通过率
审查场景 剩下的问题有商定的计划
测试人员已收到简报并且可以使用 商业赞助商已签字

这些适合更广泛的软件测试生命周期。提前与利益相关者设定数字。 “我们会在感觉合适的时候做出决定”往往会导致在最后期限的推动下匆忙答应。

处理反馈

UAT 反馈是多种因素的混合体,并非全部都是错误。将其分类:

类型 示例 平常动作
缺陷 总数计算错误 根据严重程度修复
错过要求 不支持多币种 在发布前修复,或重新规划
可用性问题 用户找不到提交按钮 通常值得修复
变更请求 “它也可以导出为 PDF 吗?” 添加到待办事项中
培训问题 该功能有效,但被误解 更新指南

使用明确的规则来确定阻止发布的内容,如严重性与优先级中所述。并对每个项目做出回应,包括您拒绝的项目。如果反馈似乎消失了,人们就会停止提供反馈。我们关于如何编写错误报告的指南可以帮助测试人员清楚地描述问题。

UAT清单

UAT之前

  • 范围和验收标准以书面形式商定
  • 系统和回归测试完成
  • 选择测试人员,向他们介绍情况并给予时间
  • 环境、账目、真实数据都准备好了
  • 副本中的个人数据已被屏蔽
  • 场景由业务部门审核
  • 设置一个记录问题的地方
  • 签署所有者已被命名

在UAT期间

  • 有可用的支持联系人
  • 每天都会对问题进行分类
  • 与利益相关者分享进展
  • 以受控方式部署和重新测试修复

UAT之后

  • 退出标准已检查
  • 已知问题已记录在案,并与所有者一起记录
  • 记录正式签核
  • 更新了培训和发行说明
  • 举行了简短的回顾展

敏捷团队中的 UAT

传统的 UAT 是在最后的一个大阶段,出现意外的代价是昂贵的。敏捷团队缩短了这个循环。产品负责人在冲刺期间根据验收标准审查每个故事,用户在冲刺审查中看到工作软件。许多团队仍在主要版本发布之前运行集中的 UAT,特别是在多个功能合并到一个工作流程中的情况下。

随着频繁的发布,功能标志和金丝雀部署等技术让真正的用户逐渐尝试新的工作。请注意,这些补充了验收测试,但它们不会自动取代它,特别是在需要正式记录的受监管行业中。

常见错误

  • 将其视为形式。 没有实际用途的签核不能保护任何人。
  • 使用了错误的测试人员。 开发人员和 QA 对系统的了解太多,无法代表用户。
  • 从不稳定的构建开始。测试人员很快失去信任和兴趣。
  • 把它留到最后一刻。这样就没有时间来修复你所学到的东西。
  • 使用不切实际的数据。测试数据很少有实际工作中出现的混乱情况。
  • 让范围扩大。 将新想法视为变更请求,除非它们是真正的阻碍者。

最后的话

UAT 是您在发布之前了解该软件是否真正对使用它的人有帮助的最后机会。从项目一开始就进行规划,招募真正的用户,并就成功的样子达成一致。对于您的下一个版本,请尝试一个简单的更改:在真实场景中与一名用户坐在一起,在他们工作时什么也不说。

常见问题

简而言之,什么是用户验收测试?

这是最后的检查,真实用户在发布之前通过实际任务尝试软件,以确认它满足他们的需求。

谁负责UAT?

业务用户或客户运行测试。产品负责人或 QA 负责人通常会进行协调,而业务发起人通常会做出最终的签署决定。

UAT和系统测试有什么区别?

系统测试检查软件是否按规定工作,并由测试人员完成。 UAT检查它是否满足业务需求,并且是由用户完成的。

UAT什么时候发生?

通常在系统测试之后和生产发布之前,一旦软件稳定。敏捷团队还可以在每个冲刺中运行较小的验收检查。

UAT可以自动化吗?

其中一部分,例如对业务工作流程的重复检查。然而,判断软件是否有用、是否适合用途仍然需要真人。

继续学习

与Stack Quora合作

需要测试、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%覆盖率仍然会错过错误,以及合理的目标。

阅读文章 →
数据库与 SQL

SQL 中的 DELETE、TRUNCATE 和 DROP:差异、回滚以及何时使用它们

DELETE、TRUNCATE 和 DROP 通过经过测试的 SQL 进行了解释:各自删除什么、回滚、触发器、身份重置、速度,以及 PostgreSQL、MySQL、SQL Server 和 SQLite 有何不同。

阅读文章 →
数据库与 SQL

SQL 视图解释:创建、使用和避免陷阱(附示例)

SQL 视图通过我们运行的查询进行解释:创建视图、实时结果、隐藏列、性能、可更新和物化视图、破坏的依赖关系和最佳实践。

阅读文章 →
软件开发

TypeScript 接口与类型:真正的差异,使用编译器进行测试

TypeScript 接口与类型,使用真实编译器进行检查:两者都可以做什么,只有一个可以做什么,声明合并,扩展与交集以及要遵循的简单规则。

阅读文章 →
软件开发

Python *args 和 **kwargs 解释:灵活的函数和清晰的示例

Python *args 和 **kwargs 用我们运行的代码进行了解释:打包和解包、参数顺序、仅关键字和仅位置参数、装饰器和常见错误。

阅读文章 →
软件开发

Python Lambda 函数:语法、实际用途以及何时不使用它们

Python lambda 函数用我们运行的代码进行了解释:语法、使用键排序、映射和过滤器、闭包、后期绑定陷阱,以及何时普通 def 是更好的选择。

阅读文章 →
人工智能

什么是人工智能代理?它们是如何工作的,只需运行一个简单的代理循环

什么是人工智能代理?关于代理循环、工具、内存和护栏的简单指南,以及我们运行的一个小型 Python 循环、真正的风险以及何时简单的聊天机器人是更好的选择。

阅读文章 →
DevOps

监控与可观察性:真正的区别,包括日志、指标和跟踪

监控与可观察性解释:已知和未知的故障、日志、指标和跟踪、检查事件演练、黄金信号、OpenTelemetry 和有用的警报。

阅读文章 →
DevOps

Docker Volumes 与 Bind Mounts:以正确的方式保留容器数据

Docker 卷与绑定挂载解释:为什么容器数据消失、命名卷、绑定挂载、tmpfs、Compose 示例、备份、权限以及何时使用它们。

阅读文章 →
测试自动化

TDD 与 BDD:主要区别、以两种方式构建的一个功能以及何时使用每种方式

TDD 与 BDD 的解释是通过一种双向构建的折扣功能:使用我们运行的代码进行红绿重构、Given-When-Then 场景、工具、权衡以及何时使用每种方案。

阅读文章 →
软件测试

用户验收测试 (UAT):流程、清单和真实示例

用户验收测试解释:谁运行它、它与 QA 有何不同、七步流程、UAT 测试用例模板、清单、签核标准和常见错误。

阅读文章 →
数据库与 SQL

SQL NULL 值解释:IS NULL、COALESCE、NULLIF 和要避免的陷阱

通过我们运行的查询解释了 SQL NULL 值:三值逻辑、IS NULL、COALESCE、NULLIF,聚合、连接和排序如何处理 NULL,以及它悄悄引起的错误。

阅读文章 →
数据库与 SQL

SQL 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 个示例以及如何计划测试。

阅读文章 →
软件测试

测试用例与测试场景:主要区别、示例以及何时使用它们

测试用例与测试场景的解释:清晰的定义、并排的表格、从场景到案例的密码重置功能、模板以及何时使用每个功能。

阅读文章 →
数据库与 SQL

SQL 查询优化:读取执行计划并修复慢速查询(带计时)

对一百万行进行 SQL 查询优化测试:读取执行计划、添加正确的索引、修复不可控制的过滤器、使用复合索引和键集分页。

阅读文章 →
数据库与 SQL

SQL 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 比较:架构、等待、浏览器和语言支持、调试、两种工具中的相同测试、迁移建议以及如何选择。

阅读文章 →
软件测试

等价划分:通过实例解释测试设计技术

等效分区解释:如何找到有效和无效分区,年龄、密码和优惠券的工作示例,我们运行的测试,以及为什么将其与边界配对。

阅读文章 →
软件测试

软件测试中的严重性与优先级:差异、矩阵和实例

软件测试中的严重性与优先级解释:清晰的定义、带有示例的四向矩阵、级别尺度、谁设置每个级别以及如何运行错误分类。

阅读文章 →
数据库与 SQL

SQL 子查询教程:类型、相关子查询和 EXISTS 以及示例

SQL 子查询教程,其中包含我们运行的查询:标量、IN、FROM 和 SELECT 子查询、相关子查询、EXISTS、NOT IN NULL 陷阱以及子查询与 JOIN 与 CTE。

阅读文章 →
数据库与 SQL

SQL 事务和 ACID 解释:COMMIT、ROLLBACK 和隔离级别

SQL 事务和 ACID 通过我们运行的银行转账进行了解释:COMMIT、ROLLBACK、保存点、锁、隔离级别、脏读、死锁和最佳实践。

阅读文章 →
软件开发

Git merge 与 rebase 的区别:示例及如何选择

用真实的 log 输出、对比表、rebase 黄金法则和安全的团队工作流,讲清 Git merge 与 rebase 的区别。

阅读文章 →
软件开发

Python 列表推导式:语法、示例与何时避免使用

Python 列表推导式详解:语法、过滤、if-else、嵌套循环、实测耗时,以及何时普通 for 循环更合适。

阅读文章 →
数据库与 SQL

SQL JOIN 详解:附示例(INNER、LEFT、RIGHT、FULL)

通过示例表和查询,一步步讲解 SQL JOIN:INNER、LEFT、RIGHT、FULL、CROSS 和 SELF,并介绍常见错误与性能技巧。

阅读文章 →