你修改了一行代码,信心满满地提交审核。第二天用户反馈:某个角落的按钮点不动了。你纳闷,明明没动那个地方。
这是软件开发中的常态——改好一个问题,引出另一个问题。随着功能增多,每次发布前手工把所有流程点一遍,会消耗大量时间。对于个人开发者或小团队来说,这尤其痛苦。
自动化测试就是解决这个问题的:让程序自己跑一遍你预设的流程,检查有没有出问题。
想象你有一个机器人,它可以按照你写的脚本,自动打开小程序、点击按钮、输入文字、滑动页面,然后检查结果是否和预期一致。
一个简单的测试脚本可能是这样的:
打开小程序,首页是否正常加载
点击“登录”按钮,是否跳转到授权页
输入搜索词“咖啡”,搜索结果中是否包含“咖啡”二字
每改一次代码,就让机器人跑一遍这些脚本。只要几秒钟,你就知道核心功能有没有被破坏。这在行业里叫回归测试。
微信官方和社区提供了几种方案,按学习成本从低到高排列。
微信开发者工具里内置了一个叫“自动化测试”的面板。你可以在界面上录制操作——点击、输入、滑动——工具会自动生成测试脚本代码。
操作步骤:
打开开发者工具,点击“自动化测试”图标
点击“录制”,开始操作小程序
停止录制,工具会生成一段JavaScript代码
之后每次需要测试时,点击“运行”即可
适合场景:非技术人员或刚接触测试的开发者,快速验证简单流程。
局限性:只支持模拟操作,不能做复杂的断言(比如判断某个数据是否正确),脚本维护起来也比较麻烦。
微信官方提供了一个Node.js库,可以在命令行或CI环境中运行。你可以写一个独立的测试脚本,控制真机或模拟器上的小程序。
示例代码:
const automator = require('miniprogram-automator') automator.launch({ projectPath: 'path/to/your/project' }).then(async miniProgram => { const page = await miniProgram.navigateTo('/pages/index/index') // 点击按钮 await page.callMethod('onTapLogin') // 等待弹窗出现 const modal = await page.waitFor('page', { timeout: 3000 }) // 验证弹窗文字 const text = await modal.text() console.assert(text.includes('登录成功'), '登录失败') await miniProgram.close() })
这个方案更灵活,适合集成到持续集成流程中——每次代码提交到Git仓库时,自动触发测试。
如果不想自己维护测试环境,可以使用第三方服务,如腾讯云测、Testin等。它们提供真实手机设备(而不是模拟器),覆盖iOS和安卓的各种机型。
你上传小程序代码包,选择要测试的型号(比如iPhone 14、小米13),服务端会自动运行你预设的脚本并生成报告,包括截图和日志。
这些服务通常是付费的,但对于需要兼容多种机型的正式项目来说,属于必要投入。
不需要把所有操作都自动化测试。有一个经典原则叫“测试金字塔”:大部分测试应该是单元测试(测试单个函数或组件),少部分是集成测试(测试多个模块配合),更少部分是端到端测试(测试完整用户流程)。
对于小程序开发者来说,优先自动化以下三类:
核心路径:用户最常用的2-3个流程,比如“打开小程序-登录-完成关键操作”。这些一旦出问题会影响大部分用户。
高危区域:你曾经修过复杂Bug的地方,或者代码改动频繁的页面。这类地方最容易再次出问题。
跨平台兼容:同一套代码在iOS和安卓上表现可能不同。用多个真机运行相同脚本,对比结果。
自动化测试不是万能的,新手容易陷入几个误区。
第一个误区:追求100%覆盖。测试代码也需要维护。覆盖越细,写测试的时间越长。对于个人项目,覆盖核心流程就足够了。
第二个误区:测试写得比业务代码还复杂。如果你为了测试一个简单的按钮,写了30行配置代码,可能得不偿失。简单场景用手工测试更快。
第三个误区:只在开发者工具里跑测试。开发者工具和真机有差异,比如某些动画效果在真机上耗时会更长,可能导致等待超时。至少准备一两台真实手机定期运行测试。
如果你从未做过自动化测试,不需要一步到位。
第一周:打开开发者工具的自动化录制功能,录一个最简单的登录流程。跑通一次就行。
第二周:学会写一个miniprogram-automator脚本,能够自动打开首页并截图。
第三周:把这个脚本托管到Git仓库,配置一个Git钩子,每次push时自动运行。
到了这个程度,你的小程序就已经比大多数个人项目更规范了。每次修改代码后,花几秒钟跑一下测试,晚上可以睡得更踏实。