1. 测试对象的基础差异
Web、小程序和App作为三种不同的应用形态,其技术架构的差异直接决定了测试策略的不同。Web应用运行在浏览器环境中,基于HTTP/HTTPS协议与服务器通信,本质上是一种远程渲染的瘦客户端。小程序则介于Web和原生App之间,它虽然依赖宿主环境(如微信、支付宝等超级App),但具备调用部分系统API的能力。原生App则是直接安装在操作系统上的独立应用,能充分利用设备硬件能力。
从技术栈来看:
- Web:HTML/CSS/JavaScript三件套,跨平台特性明显
- 小程序:各平台自有技术规范(微信WXML/WXSS、支付宝AXML等)
- App:iOS用Swift/Obj-C,Android用Kotlin/Java,跨平台方案用Flutter/React Native
这种底层差异导致测试时需要关注的重点完全不同。比如Web测试要特别关注不同浏览器内核的渲染差异,小程序要验证宿主API的调用权限,而App则需测试硬件交互的稳定性。
2. 环境准备与测试工具链
搭建测试环境是三类测试的第一个分水岭。Web测试环境最简单,只需准备不同版本的浏览器(Chrome、Firefox、Safari等)即可。但要注意浏览器驱动的版本匹配问题——我曾遇到过Chromedriver版本比浏览器低导致元素定位全部失效的案例,解决方案是使用nvm管理多版本Node环境。
小程序测试需要:
- 各平台开发者工具(微信开发者工具需开启真机调试模式)
- 特殊代理工具(如Charles抓包需要配置SSL证书)
- 多账号体系(测试不同用户角色权限)
App测试的环境最复杂:
- 需要物理设备云(AWS Device Farm、Firebase Test Lab)
- 模拟器集群管理(Android Studio AVD需要开启硬件加速)
- 特有的工具链(ADB命令、iOS的instruments)
- 企业证书签名问题(测试版分发需要处理UDID白名单)
推荐工具组合:
# Web测试 npm install -g playwright playwright install # 小程序 微信开发者工具 + miniprogram-automator # App测试 appium + WebDriverAgent + appium-doctor3. 功能测试的侧重点差异
虽然三类测试都要验证业务逻辑,但具体实施大不相同。Web测试最关注:
- 表单提交的边界值处理(特别是文件上传)
- AJAX请求的竞态条件
- Cookie/Session的管理机制
- 前端路由的History API兼容性
小程序特有的测试点包括:
- 宿主环境API的mock(如wx.login的模拟授权)
- 分包加载的流量控制
- 模板消息的触发条件
- 扫码功能的测试桩实现
App测试独有的深水区:
- 后台进程保活机制(Android的WorkManager)
- 离线缓存策略(SQLite的版本迁移)
- 硬件交互(GPS精度、陀螺仪采样率)
- 通知栏点击后的应用状态恢复
一个典型的踩坑案例:测试电商App的购物车功能时,Web端只需验证HTTP接口返回,而App端还要考虑进程被系统回收后,如何恢复之前的购物车状态。
4. 兼容性测试的实施策略
兼容性测试是三类应用差异最大的领域。Web的兼容性矩阵包括:
- 浏览器类型及版本(IE的死亡对测试人员其实是种解脱)
- 操作系统(Mac/Win/Linux的字体渲染差异)
- 分辨率(需要测试1366×768这种"落后"尺寸)
小程序兼容性要点:
- 基础库版本(wx.getSystemInfo返回的SDKVersion)
- 宿主App版本(微信7.0.20前后的API权限变化)
- 手机系统WebView内核(特别是Android各厂商的定制ROM)
App兼容性最复杂:
- Android需要覆盖ARM/x86架构
- iOS要考虑Notch屏的SafeArea
- 系统权限弹窗的触发时机(第一次使用时请求vs安装时请求)
建议的测试优先级:
| 应用类型 | 必须覆盖 | 可选覆盖 | |----------|-----------------------------------|-------------------------| | Web | Chrome最新3版+Firefox+Edge+Safari | 360浏览器等国产套壳 | | 小程序 | 微信最新2版+基础库2.x/3.x | 支付宝/百度小程序 | | App | iOS最新2版+Android 10/11/12 | 折叠屏/平板设备 |5. 性能测试的关键指标
Web性能测试主要关注:
- 首屏加载时间(Lighthouse评分)
- TTI(可交互时间)
- 内存泄漏检测(Chrome DevTools的Heap Snapshot)
小程序性能的特殊性:
- 启动耗时(冷启动/热启动)
- 包体积监控(主包不能超过2MB)
- setData调用频率(微信开发者工具的Trace面板)
App性能测试的硬指标:
- ANR率(Android)和卡顿率(iOS)
- 电量消耗(Battery Historian工具)
- 内存占用(Android的dumpsys meminfo)
实测案例:某资讯类App列表页在快速滑动时,Web版只需监控FPS,而原生App还要检测Jank帧数和GPU过度绘制问题。
6. 安全测试的攻防重点
Web安全测试传统项目:
- XSS注入(特别是富文本编辑器场景)
- CSRF Token校验
- CORS配置错误
- 敏感信息泄露(如.git目录暴露)
小程序特有的安全隐患:
- 过度的wx.request域名白名单
- 未加密的本地存储(同步存储敏感数据)
- 过期的加密算法(还在用AES-ECB模式)
App安全的高危点:
- 反编译风险(ProGuard配置不当)
- 中间人攻击(证书固定实现缺陷)
- 动态调试防御(Frida检测机制)
- 敏感权限滥用(READ_PHONE_STATE)
有个经典漏洞:某金融类App用SharedPreferences存储用户token,被root设备直接读取。解决方案是改用Android的Keystore系统。
7. 自动化测试的实现难点
Web自动化最成熟:
- 元素定位主要用CSS Selector/XPath
- 等待策略推荐WebDriverWait+expected_conditions
- 容易实现可视化回归测试(如Applitools)
小程序自动化坑点:
- 控件层级结构特殊(原生组件与WebView混合)
- 需要处理弹窗拦截(如微信授权弹窗)
- 无法直接操作DOM(只能通过API调用)
App自动化的深坑:
- 混合应用要处理WebView上下文切换
- iOS的Predicate String定位语法晦涩
- Android的UIAutomator2对动态ID支持差
建议的自动化架构:
# 基类设计示例 class BaseTest: def setup(self): if self.platform == "web": self.driver = ChromeDriver() elif self.platform == "miniprogram": self.driver = MiniProgramLauncher() else: self.driver = AppiumDriver() # 具体测试继承实现 class LoginTest(BaseTest): def test_failed_login(self): # 各平台统一测试用例 self.assertErrorMessage("Invalid credential")8. 持续集成中的实践差异
Web测试在CI中最简单:
- 可直接用GitHub Actions的ubuntu-latest镜像
- 并行测试靠Selenium Grid
- 截图对比用pixelmatch库
小程序CI的障碍:
- 需要处理登录态(测试账号二维码问题)
- 上传体验版有每日次数限制
- 依赖微信开发者工具的CLI模式
App的CI复杂度最高:
- 需要Mac机器打包iOS应用
- 签名证书管理(fastlane match方案)
- 真机测试设备调度(AWS Device Farm API)
一个实用的技巧:在Jenkins pipeline中,Android构建用Docker容器处理,iOS构建单独分配Mac mini节点,通过SSH触发构建任务。
9. 用户行为模拟的差异性
Web用户行为特征:
- 多标签页来回切换
- 浏览器前进/后退导航
- 表单填写时的复制粘贴操作
小程序特有行为:
- 下拉刷新与上拉加载更多
- 扫码后跳转到特定页面
- 分享卡片点击回流场景
App用户典型操作:
- 手势操作(双指缩放、长按拖拽)
- 中断测试(来电、通知打断)
- 跨应用跳转(Deep Link验证)
在测试新闻类应用时,Web版要模拟用户打开多个新闻标签页,而App版则需要测试点击推送通知后能否正确跳转到详情页。
10. 数据统计与质量监控
Web的监控重点:
- 页面PV/UV统计准确性
- 用户点击热力图分析
- 错误日志的sourceMap解析
小程序数据特殊性:
- 需要区分场景值(scene参数)
- 监控模板消息的送达率
- 检测违规的DOM操作告警
App的质量看板:
- 崩溃率(区分ANR和Native Crash)
- 启动耗时百分位统计
- OOM异常的内存快照
某社交App的教训:没有监控小程序端的getUserInfo调用失败率,导致登录转化率下降一周后才被发现。后来建立了实时报警机制,任何API成功率低于95%立即触发告警。