跳过主要内容

质量保证流程:安全的移动端发布

构建一个质量保证流程,能够及早发现问题,快速修复,避免因应用商店延迟而无法及时恢复。

质量保证流程:安全的移动端发布

即使CI流程通过,仍然可能发布一个有缺陷的应用。构建成功,QA人员签发,发布出去,用户第一时间遇到一个不返回的权限提示,一个过时的JavaScript包,或者一个只在某个Android皮肤上出现的崩溃。质量保证流程的指南通常会忽略这一部分,而移动端团队通常会在实践中学习到这一点。

实用 质量保证流程 是一种闭合循环,而不是一个仅在有人报告缺陷时结束的检查清单。它从需求和测试设计开始,但只有当发现的结果反馈到发布决策、监控、回滚和下一轮测试时,它才会变得有用。如果您正在部署CapacitorJS或Electron应用程序,那么这个循环就更重要,因为一个坏的Web包可以一次性影响所有用户,而原生审查仍然会延缓永久性修复。

目录

现代质量保证过程实际上涵盖了什么

现代 质量保证过程 是一个封闭的环节,具有明确的控制点。实践顺序是 需求分析、测试规划、测试设计和案例开发、环境设置、执行、缺陷跟踪、重测试和回归、发布验证和测试关闭. 最重要的控制点仍然是那些乏味的 从需求到测试的可追踪性 和一个正式 缺陷筛选和验证循环, 因为修复不算是有效的,直到它们被验证为有效之前关闭,正如TestSigma的 QA过程指南.

一个图表,展示了一个持续质量保证循环,包括四个迭代步骤:计划、测试、发布和学习。

循环不在发布时停止

好的QA不仅仅是发布候选人绿色时结束。它继续通过生产验证、支持信号、实时更新恢复和下一个冲刺的测试设计。很多团队会因为把缺陷当作票据而失去,这意味着需求、测试或部署防护措施需要改变。

有用的思考方式是把QA当作管理系统,而不是评分卡。 质量保证过程步骤 指南指出,很多程序忽略了客户反馈循环和跨渠道评估,这个缺失对应用团队来说也很重要。如果支持团队在发布后持续看到同样的反馈,说明过程没有学习,只是测量了。

在添加工具之前,需要测量什么

在购买更多工具之前,需要清晰地确定团队将使用的信号来决定是否安全发布。通常需要定义发布门槛、每个门槛的负责人以及如果漏过去的回滚标准。

一个实用的起始集是简单的:

  • 需求覆盖, 表示每个用户可见的规则至少有一个测试.
  • 缺陷严重性和归属, 以便团队知道什么阻止发布以及谁解决它.
  • 回归范围, 以便修复不重新打开邻近流程中的旧问题.
  • 发布后信号, 以便生产反馈改变下一个测试周期而不是存储在仪表板上.

对于试图在邻近操作流程中减少手动重复工作的团队, 劳动力成本减少指南 是一个有用的例子,说明如何通过结构化审查和明确的交接来减少浪费的努力. QA 工作方式相同,当循环是明确的,人们停止猜测.

如果您的当前过程只告诉您什么失败,而不是什么下一个变化,它是不完整的. 这就是测试程序和实际质量系统之间的区别. 对于一个适合这种思维方式的发布管理角度,这个内部指南是 release management process 与此类似的闭环方法相得益彰。

定义目标、范围和可测试的验收标准

QA会变得更加锐利,当产品语言转化为可测试的语言时。一个要求“让结帐过程快速”是无法清晰地验证的,而“在提供商返回成功并且用户关闭应用之前显示支付确认屏幕”则是可测试的、可追踪的,并且对工程和支持都有用。这种可追踪性是闭环模型中的一个核心控制点,早先的部分中提到过。

以测试者可以执行的方式写验收标准

对于一个CapacitorJS应用,考虑一下支付流程。如果应用使用第三方支付sheet,验收标准应该涵盖支付sheet成功、失败、超时或被dismiss的各个情况。如果流程依赖于相机权限、位置权限或推送通知-consent,每个branch都需要自己的可见结果,因为权限提示在iOS和Android上可能表现不同。

一个轻量级的模板效果很好:

  • 假设 用户已登录。
  • 用户点击支付按钮。
  • 然后 应用呈现支付 UI 并确认成功或显示可恢复的错误状态。
  • 并且 事件可以追溯到一个发布票据,因此 QA 可以将失败映射回一个要求。

重点不是要使每个句子都正式。重点是确保人类可以在之后不必争论意图时判断特性是否通过。这种情况下,内部检查表在 验证Capacitor应用更新 中变得有用,因为更新验证通常会暴露缺失的验收标准。

根据风险来限定发布范围,而不是根据乐观心态

限定发布范围更容易辩护,而不是模糊的。高风险的界面应该有更广泛的覆盖范围,而低风险的副本更改或孤立的 UI 调整可以在依赖关系表面较小的情况下使用更轻松的检查。实际上,这意味着标记任何与认证、支付、权限、离线行为或原生桥接有关的内容需要更深入的审查。

实用规则: 如果一个特性可以以阻止核心使用的方式失败,它需要明确的验收标准和至少一个非单元验证路径。

不能在单元或集成测试中很好地执行的特性 shouldn’t 被忽视。它们需要另一个层次,通常是手动通过、设备特定检查或发布阶段验证步骤。尤其是对于依赖于 OS 级别对话、文件访问或浏览器怪癖的 Electron 应用,它们的组件测试不会忠实地模拟这些行为。

如果你能准确掌握范围,QA就不再像最后的争论一样。团队知道需要证明什么,什么可以通过抽样,什么需要人工检查,因为自动化边界在此结束。

选择合适的自动化和手动测试的比例

自动化得到关注,因为它可以扩展,但它只能捕捉到它可以模拟的内容。手动测试被视为慢,但它往往是捕捉视觉漂移、设备特定问题或工作流奇怪性质的唯一方法,这些问题会在人类使用应用程序时出现。一个平衡的 质量保证过程 需要两者,并且比例应该根据风险而不是意识形态来确定。

每个层次都擅长什么

单元和集成测试在逻辑是确定性的情况下最强大。在CapacitorJS或Electron堆栈中,这意味着使用Jest进行商业逻辑、状态减少器、辅助函数和组件行为的测试,集成测试用于API边界、更新解析和权限处理Branch。Cypress适合于您希望浏览器驱动的端到端覆盖Web层的情况,而Detox-style流程在您需要设备级别的移动交互并且可以承担维护成本的情况下很重要。

手动测试在哪里有意义。探索性会话捕捉到奇怪的导航路径、暗色模式不匹配、在小设备上键盘重叠、或在某个OS版本上关闭的过早模态。它也很重要的可访问性,因为屏幕阅读器顺序、焦点陷阱和对比度问题通常更容易通过尝试应用程序而不是单独依赖静态检查来发现。

如果您想更广泛地了解自动化类别和权衡的话 Appjet.ai的测试工具分解 是标准化他们的堆栈的团队的有用比较点。对于那些需要定义边界通常在哪里的人来说 自动化测试概述 帮助定义

自动化测试与手动测试的区别

场景 最适合 原因
仅在共享模块中执行的纯业务逻辑 自动化 __CAPGO_KEEP_0__
__CAPGO_KEEP_0__ __CAPGO_KEEP_0__ __CAPGO_KEEP_0__
__CAPGO_KEEP_0__ __CAPGO_KEEP_0__ __CAPGO_KEEP_0__
__CAPGO_KEEP_0__ __CAPGO_KEEP_0__ __CAPGO_KEEP_0__
__CAPGO_KEEP_0__ __CAPGO_KEEP_0__ 时间、重试和状态恢复需要可重复的覆盖
新特性标志的beta反馈 手动 真实世界的行为往往揭示测试漏掉的缺口

外部beta测试者

外部beta测试者在内部团队有太多共享背景时很有用。他们不会重现你的假设,这就是点。他们特别适合于触及登陆、首次运行权限或依赖于不熟悉用户行为的流程的发布候选者。

陷阱是过度关注两边。全部自动化的测试计划忽略了人类细微差别。全部手动的测试计划变得昂贵、不一致且在截止日期紧张时容易忽略。正确的答案通常是稳定的自动化基础加上在世界上最容易破坏的表面上有意的人类覆盖。

将QA集成到CI/CD管道中

CI/CD应该强制质量,而不是仅仅移动工件。管道在每个阶段都有一个单独的任务时,才能发挥最佳作用,因为混合关注点使失败更难理解并且更慢修复。一个好的 质量保证过程 在阻止坏code的早期将检查放在它们的位置,然后将同样的工件保存下来以便它向发布移动。

一个图表,展示了从code提交到部署的五步CI/CD管道,集成了质量保证

优先使用廉价的检查

每次提交时,运行快速且确定性的检查。检查代码格式、类型、单元测试和集成测试应该在构建原生二进制文件之前失败。这可以降低噪音并使下一个阶段——构建——值得花费计算资源。

在原生code发生变化后,应该使用签名的iOS和Android二进制文件。即使只在Capacitor应用的Web层发生变化,也需要管道构建Web包、验证并打包以便安全地推送。关键是 artifact标识,通过测试的包应该是达到测试环境或生产环境的同一个包。

推送 artifact,而不是环境

环境推送而不推送 artifact 是团队会产生漂移的原因。您希望在内部QA、测试环境和生产环境之间尽可能地推送相同的包,因为否则您是在测试一个东西并推送另一个东西。这种情况同样适用于 Electron 应用,打包和签名应该是发布门控的一部分,而不是发布后附加的内容。

实践规则: 如果一个构建无法从提交到签名的 artifact 到部署版本进行追踪,那么您的管道就缺乏了 QA 所需的证据链。

对于Capacitor团队,实时更新工具可以减少验证和发布之间的差距。经过测试的Web包可以直接推送到测试环境而不需要重建原生二进制文件,这使得原生 shell 没有变化时的迭代速度大大提高。 持续集成配置 这里的指南是相关的,因为CI应该知道如何自动将验证的包发布到正确的频道。

简而言之,CI CD 不应该问,“构建是否通过?”而应该问,“这个确切的工件是否通过了正确的检查,在正确的环境中,是否在用户面前有了正确的门槛?”

添加晚期集成检查

只有当外部系统参与进来时,才会出现一些故障。特别是对于认证提供商、支付网关、推送令牌或短信验证流程,一个针对性的端到端测试有所帮助。如果您需要更广泛的参考点来了解平台工作流程中的集成测试覆盖范围, 短信激活集成测试指南 是一个有用的提醒,外部依赖项应该得到明确的验证,而不是寄希望于它们。

当管道以这种方式构建时,QA 就不再是一个单独的仪式。它成为交付本身的一部分。

无需猜测的阶段发布、雪崩发布和分阶段发布

阶段发布、雪崩发布和分阶段发布并非可互换的。它们解决不同的问题,团队会因为使用其中一个而混淆它们而陷入困境。一个健康的 质量保证过程 将它们视为单独的发布策略,具有单独的爆炸半径和单独的决策点。

A各种软件发布策略的比较表格,包括预发布、金丝雀发布和分段发布。

每个发布阶段的作用是什么

预发布 是生产环境前的最后一个完整的高保真检查点。它应该尽可能地模拟生产环境,使团队能够在真实条件下验证构建、数据流和发布包。

金丝雀发布 用于从小规模的真实用户中学习。它暴露了设备特定的和网络特定的问题,因为预发布环境往往会错过这些问题,因为世界比任何预发布环境都复杂。

分段发布 逐渐扩大曝光范围,直到第一批信号看起来健康。它是扩大爆炸半径的最安全方式,因为你不在单个发布决策上押注整个用户基数。

如何Capgo样式的频道映射到发布策略

对于实时更新工具,频道设计很重要。一个频道可以服务于内部QA,另一个频道可以针对beta试验,第三个频道可以持有第一个生产波次,第四个频道可以纯粹用于紧急回滚。这种分离给了工程和支持团队一种隔离风险的方式,而不必等待新的商店提交。

这个也是目标设备分配的作用。 如果某个特定用户或设备需要调试,一个通道可以仅为此目的设置,保持其余的基础版本在已知良好的版本上。 Capgo 支持这种针对性的质量保证流程,对于 Capacitor 应用程序,这是有用的,当 bug 很难复制并且您需要观察一个设备而不改变其他人发布的状态时。

毕业标准应该明确

一个构建应该只有在证据表明它可以移动时才前进。 通常这意味着早期阶段通过了其定义的检查,没有新崩溃模式出现,支持队列中没有同样的抱怨。 如果信号不明确,应该在构建处于当前状态。

一个简单的促进规则有助于:

  • 内部QA到staging仅在精确的工件通过烟雾测试和关键用户流程后
  • staging到canary仅在全真实环境与预期行为匹配后
  • canary到分阶段发布仅在早期用户表现稳定且支持可以用简单的术语解释发布后
  • 分阶段发布到全生产仅在生产可观察性保持清洁足够长时间以便您的团队信任趋势后

消除猜测的部分。推广变成了基于证据的决策,而不是进展的庆祝。

可观察性和指标,能够在用户反馈之前捕捉到问题

发布后,QA 不会消失。它的形状会改变。生产可观察性是质量保证过程的部分,它告诉你发布是否按照测试的方式运行,用户是否遇到实验室环境中未见过的故障。对于移动和跨平台应用来说,这意味着一起查看设备信号、更新健康和错误模式。 质量保证过程 观察反映用户痛苦的信号

最有用的指标是那些与实际故障相关的指标。无故障会话、JavaScript 错误率、网络故障率、更新采用率和更新故障率各自告诉了一个不同的故事。如果应用缺少其中一个信号,支持团队就得在工程团队之前听到问题。

对于一个 __CAPGO_KEEP_0__ 或 Electron 应用来说,设备日志很重要,因为同一个发布在不同操作系统版本、设备形状或更新状态下可能表现出不同的行为。一个实时更新平台可以通过设备来暴露采用和故障数据,这给了工程团队一个机会来看是否需要回滚,还是问题局限在一个小部分。

For a Capacitor or Electron app, per-device logs matter because the same release can behave differently across OS versions, form factors, or update states. A live-update platform can expose adoption and failure data by device, which gives engineering a way to see whether a rollback is needed or whether the issue is isolated to a small slice.

质量保证流程

当没有人负责响应时,仪表板会失败。每个指标都需要一个负责人、一个警报条件和一个标准的下一步措施。如果更新失败的次数突然增加,需要有人决定是否应该暂停渠道、回滚捆绑包或发布新修复版。

A实用设置如下:

  • 故障和错误监控, 以快速检测应用程序不稳定。
  • 更新采用率跟踪, 以查看用户是否正在接收修复的捆绑包。
  • 失败率警报, 以在支持问题积压之前捕捉坏的捆绑包。
  • 设备级别的钻取, 以便团队可以将广泛的故障与平台特定的噪音区分开来。

仪表板只有在它改变决策时才有用,否则它就是一个带有更多标签的截图。

生产信号反馈到下一个发布

最好的QA团队将发布后数据转换为新测试。如果某个设备类别无法应用更新,需要为该路径添加一个验证用例。如果网络重试在某个平台上表现不佳,需要将失败模式纳入下一次测试计划。这样,观察性就变成了质量的输入,而不是运维侧边栏。

发布工具成为QA的一部分,而不是仅仅是部署。团队可以看到哪些设备更新了,哪些设备失败了,以及哪个版本的包在线,这样他们就可以在用户开始向支持部门发送大量反馈之前做出反应。Capgo的每设备日志和频道守卫适合那些需要在发布后保持发布过程可解释的团队。

事件恢复、回滚和学习正确的教训

发布时出现问题的那一刻是质量保证过程的关键时刻。团队可以有强大的规划、合理的测试覆盖率和干净的管道,但如果无法快速恢复或从错误中学习,就会失去所有价值。因此,事件响应应纳入QA,而不是放在旁边。

来自https://capgo.app的截图

首先进行分类,第二次进行说明

当发布出现问题时,首要任务是确认范围。它是否仅限于设备子集,仅限于一个版本,还是影响整个受众?一旦确定了这一点,团队就可以选择回滚、暂停频道或进行手术式修复。

对于实时更新平台,JavaScript 或 CSS 的更改通常可以在几分钟内回滚,而不必等待 App Store 或 Play Store 的审查。这很重要,因为差异化的坏体验和受控事件之间的差异往往取决于团队能够快速停止传播的速度。 事件响应指南 写事件回顾以改变行为

事件后文件需要更多的根原因。它应该记录观察到的内容、可用的信号、第一个错误的假设以及早期捕捉问题的方法。如果相同类别的缺陷可能再次发生,文件应该产生一个接受标准的变化、一个新测试用例或一个CI门控。

有用的回顾输出包括:

修正的接受标准

  • 如果原始要求太模糊。 新回归测试
  • 如果失败是技术上可以预防的。 发布保护栏
  • 如果问题应该在测试环境中停留更长时间。 incident response guide
  • A support note, 如果客户端团队需要下次更好的脚本。

实践规则: 如果后勤报告没有改变门户、测试或发布规则,那么它很可能只是文档。

这就是成熟的QA和发布表演的区别。发布失败,团队控制了它,过程在弱点的地方变得更加严格。


Capgo 帮助团队通过实时更新、目标频道和发布者在设备级别看到错误时的可见性来缩短这个循环。如果您正在尝试为 CapacitorJS 或 Electron 应用程序构建一个更安全的 质量保证过程 请访问 Capgo 并了解如何将实时更新发布、回滚和可观察性融入同一个运营模型。

实时更新Capacitor应用

当web层bug在live状态时,通过Capgo将修复推送给用户,而不是等待几天的app store批准。用户在后台接收更新,而native变化仍然在正常的审查路径中。

来自马丁的人性化支持

立即开始

最新博客文章

Capgo为您提供创建真正专业的移动应用所需的最佳见解。