项目需求#
Chia 的参考钱包把耕种(farming)工具、全节点和钱包整合在同一个安装包中,提供 Windows、macOS 和 Linux 版本。每个版本都会先以候选发布版本的形式推出,通常在大约两周内推出 2 到 4 个,每一个都必须在三个系统上都能正常运行。
Chia 的安全团队请我们测试这些候选版本。他们手上有一份约 80 项的手动测试清单,覆盖从安装、绘图(plotting)、矿池(pooling)到代币、NFT 和报价的各个环节。他们从中挑出了对首个版本最重要的 42 项,要求在 Debian Linux、Windows 11 和一台 Apple Silicon Mac 上的应用中运行。每次测试使用的都是 Chia 自家发布流水线生成的安装程序,也就是用户下载的同一批文件。
三个系统,每个候选版本#
每台机器都必须把 Chia 节点同步到 Chia 的测试网络 testnet11。三台机器都卡在了加载密钥环(keyring)这一步,而其中一个候选版本的 Windows 构建打不开窗口。Chia 团队给出了答案(见下文),三台机器很快都运行起来。Chia 向我们的钱包发送了测试代币和 NFT,我们又在命令行中铸造了更多 NFT,每个都绑定到一个去中心化身份。
我们的团队在 Chia 给定的 3 天内,把 2.4.3 的 3 个候选发布版本逐一在三个系统上跑完,并把每一项结果记录在 Chia 工程师可以查阅的表格中。失败项被提交到 Chia 的 GitHub,Chia 的工程师会为其打上标签,转给他们的 QA 团队,然后与我们逐一处理,索取日志,并在下一个候选版本上再次尝试。
我们的一些发现超出了那 42 项测试的范围。在 Linux 和 Mac 上的签名对话框中,被选来签署消息的身份溢出了它的文本框。Chia 的工程师在 2 天后给出了修复,并随 2.4.4 发布。当另一个钱包接受了一笔 NFT 报价时,发起这笔报价的钱包仍显示它处于等待状态;我们在 Chia 一个尚未关闭的 issue 中补充了复现步骤,2.4.4 将其列为已修复。到了 2.4.4,Chia 改为由我们团队的一名全职测试人员负责,这名测试人员以同样的方式跑完了该版本的 3 个候选发布版本,并在 Chia 新网站上线前检查了其中的失效链接。
难点:没有密码的钱包#
在发布测试期间,Chia 还请我们的团队测试它的下一代钱包。Cloud Wallet 运行在浏览器中,没有需要同步的节点。Chia 希望有更多自动化测试,以及一套能随其 QA 团队一同扩展的流程,并选定了 Playwright。
Cloud Wallet 中的每一次注册、登录和发送都需要用通行密钥批准。通行密钥的提示框属于操作系统和浏览器,而不属于页面,因此 Playwright 无法触及。界面之下是一条实时运行的区块链:新建一个保险库就是一笔必须得到确认的交易,一笔发送必须先进入内存池(mempool)再完成结算,而助记词只会出现一次。
Playwright 测试套件#
Saif Pasha 构建了一套 Playwright 测试套件,针对 Cloud Wallet 在 testnet11 上的开发版本,覆盖其后端和前端,我们的 QA 团队从旁协助。Chia 的产品团队把每项功能都写成了带验收标准的用户故事。测试就来自这些故事,从欢迎消息一直到通行密钥页面。
Saif 把测试账户的通行密钥存放在一个密码管理器扩展程序中,并把这个扩展程序加载到 Playwright 控制的浏览器里。扩展程序在浏览器内部响应钱包的通行密钥请求,测试可以在那里点击它。测试会登录并创建一个保险库,复制助记词再粘贴回去以确认,然后重命名并删除这个保险库。它还会带手续费发送测试用 XCH,用通行密钥批准这笔发送,然后跟踪它从未签名到进入内存池、再到完成结算的全过程。地址簿、代币和设置也各有专门的测试流程。
首次完整运行全部通过。随后,Chia 的产品团队要求把套件放进 Chia 自己的 GitHub,在那里它遵循公司的提交规范,使用签名提交,并在主仓库的 CI/CD 流水线中运行。我们的 QA 团队在每次 Cloud Wallet 发布时都会同步更新它。
成果#
Chia 发布参考钱包 2.4.3 以及之后的 2.4.4 时,每一个候选发布版本都已在 Linux、macOS 和 Windows 上测试过,我们团队发现的缺陷也都已提交到 Chia 的 GitHub。它的 Cloud Wallet 在 Chia 自己的 GitHub 中有一套 Playwright 测试套件,对其进行端到端测试:用真实的通行密钥登录,并在 testnet11 上转移真实的测试资金。
Chia 为 Cloud Wallet 发布前测试周提名的测试人员中,有一位是我们团队的 QA 工程师。Chia 的新钱包经过端到端测试(包括通行密钥)后面向公众发布。
