ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Web测试与App测试的核心差异:从架构到专项测试全解析

Web测试与App测试的核心差异:从架构到专项测试全解析 Web测试和App测试的区别不是“浏览器和手机的差别”这么简单。我在团队里带过十几次回归最怕听到的一句话就是“这需求App测过就够了吧Web点点就行。”说这话的人往往还没真正经历过那种“App侧上线一周内连续爆出三个线上问题而Web侧同一套功能稳如老狗”的对比。后来我把两种测试拆开看发现它们虽然共享同一套业务逻辑、同一套后台接口但测试设计、执行策略、风险重点、工具链完全是两条线。如果你正准备从Web测试转做App测试或者团队里要同时维护两套产品的质量下面的差别值得你认真看一遍。1. 架构起点就不同浏览器里的页面和手机里的安装包差在哪儿1.1 运行环境DOM树 vs 原生容器H5混合Web测试面对的是一个相对“纯净”的执行环境页面从服务器拉下来浏览器负责解析HTML、CSS、JS最终渲染成DOM树测试脚本通过各种浏览器提供的接口去操作DOM。App测试面对的是“包、底层库、原生控件、WebView、小程序容器”多个层叠的世界一个App里可能同时存在原生页面和H5页面测试同一个功能可能要走三种不同的技术栈。这个差异会直接影响后面所有用例设计的走向。我最近接手的一个项目就是典型例子。某个详情页是原生实现的另一个频道页是WebView加载的H5支付流程里又嵌套了一层小程序容器。同一个登录态在原生层和H5层各存了一份token一旦两边同步逻辑出问题就会出现“原生端已登录H5页面还是访客状态”这种诡异现象——在纯Web项目里根本不存在因为你只有一个页面上下文登录态统一由Cookie管理。测试设计上Web只需要验证一个登录流程App却要拆出原生化登录、H5埋点上报、前后端token校验等好几条链路每一段都得单独设计用例。1.2 版本发布与更新一个改完刷新即生效一个永远要照顾“老版本”这是Web和App最本质的运营级差异也是很多测试排期被拖垮的根源。Web项目改一行代码部署上去用户刷新页面就拿到了新版本测试基本不用考虑版本兼容顶多注意下浏览器缓存。App则不同你永远不知道用户停在哪个版本上服务端必须同时兼容N个旧版本接口不能随便删参数字段也不能随便改名。我遇到过最典型的一次事故是服务端把一个老接口的返回字段从“类型A”改成“类型B”而线上还有一批老版本App没适配服务端又漏了旧版本兼容逻辑结果这批老用户启动就白屏问题反馈一片一片地进来。排查半天归根到底就是测试阶段只按“当前版本最新接口”设计了用例没有把“存量版本”纳入进来。所以在实际测试计划里Web通常只测当前版本和上一个版本的两档兼容App则要划出“当前版本、上一版本、最老支持版本”三个点并且维护一张“版本-接口-数据字典”的兼容矩阵尤其要关注覆盖安装时旧数据是否保留。1.3 数据存储与会话Cookie里的一个字段清空和本地数据库升级代价完全不同Web端的状态管理几乎都在Cookie、LocalStorage、SessionStorage这几个容器里测试时习惯性清空缓存、换个浏览器、开无痕窗口就能模拟“新用户”状态操作成本极低。App端的状态则散落在本地数据库、SharedPreferences、UserDefaults、钥匙串、沙盒文件系统里想要重置状态往往得卸载重装或者去开发者选项里清应用数据。这引出两类完全不同的测试场景一类是首次启动、二次启动、覆盖升级后的数据保留规则另一类是用户主动清缓存、清数据、卸载重装后的行为。Web测试很少会专门验证“用户把Cookie里的某个字段删了会怎样”但在App里“用户手动清掉应用数据”是一个真实高频行为用例表里必须单列一条。还有一点需要注意App的多进程、多WebView并存还会引入跨存储同步问题这和Web的单页多标签模型完全是两码事。2. 功能用例的分水岭刷新、升级、软键盘这些玩法两边根本不是一回事2.1 刷新、回退、前进Web的高频操作在App里变成了另一套组合浏览器的刷新按钮和地址栏天然存在用户习惯了一有事就按F5所以Web测试里“刷新后状态保持”“回退后表单不丢”“前进后退缓存”是必测项。App没有刷新按钮也没有可输入网址的地址栏但它的“刷新”行为并没有消失只是换了一种形态下拉刷新、页面重新加载、杀进程再打开、系统回收内存后恢复。每一种形态背后的生命周期都不同测试用例也要拆开写。我第一次带App项目时还是用Web那套逻辑去测一直找“右上角刷新按钮”。后来发现用户在弱网下拉了个列表列表没加载出来他直接把App划到后台过了二十分钟再切回来页面还在转圈还是已经超时切回来后再点一次重试会不会重复请求这些问题在Web里只要一个F5就能覆盖App却要把“前台切后台”“后台唤醒”“网络变化”“按钮点击”组合在一起测复杂度完全不是一个量级。2.2 安装、卸载、升级链路Web没有的边界App一天到晚都在踩Web测试完全没有“安装包”这个概念顶多验证一下不同浏览器或不同运行环境。App测试里安装、卸载、覆盖安装、升级、降级、清理缓存、清理数据、重置应用、应用迁移随便挑一个出来都是独立的测试模块。这里最容易翻车的是“覆盖安装数据保留”用户从商店下载新版本直接覆盖此时旧版本存着关键数据升级逻辑如果没做好兼容轻则登录态丢失被逼重新登录重则本地草稿、离线数据全部消失无法找回。我们团队就踩过一回。因为存储结构从一个数据库表拆成了两张表升级脚本漏了一行迁移字段的代码测试阶段又习惯性用“卸载重装”来模拟新版本环境完全没有覆盖“老数据在升级后是否正常”的场景结果上线后大面积反馈“升级后收藏列表空了”。从那以后覆盖安装的用例优先级被提到了和核心功能一样高并且卸载重装和覆盖安装必须分开两条链路测谁也别想替代谁。2.3 软键盘、横竖屏、分辨率、系统返回App操作方式的四座大山Web的交互方式相对单一鼠标有悬停、单击、右键、滚轮键盘有Tab、Enter、快捷键但在移动端你面对的是另一套交互体系手指触控、虚拟键盘、横竖屏旋转、通知栏下拉、全面屏手势。最典型的坑是“软键盘顶起”。测试一个评论输入框时键盘弹起来后提交按钮直接被挤出屏幕后来调整了布局的高度自适应逻辑才解决。这类问题Web端几乎无法复现因为浏览器对焦点滚动和移动端软键盘对“可视区域压缩”的机制完全是两套逻辑。所以做App功能用例设计时我习惯强制加三行键盘遮挡场景、横竖屏旋转场景、手势返回与系统返回场景并且每一条都用真机走一遍模拟器上很多手势细节是模拟不出来的。3. App规避不了的专项测试弱网、打断、权限弹窗与前后台切换3.1 弱网与网络切换Web想躲App躲不掉Web测试也会模拟弱网但大多数Web业务运行在相对稳定的环境里测试时开个浏览器限速工具、模拟高丢包其实已经算高要求了。App的使用场景是移动着的、随时在路上弱网测试绝不是可选项。我常用的方法是直接用手机配合网络调试工具把上行下行带宽分别压到几百K甚至几十K延迟加到几百毫秒再叠加丢包把核心链路完整跑一遍。重点观察三件事加载中有没有正确的loading或超时提示超时后用户点击重试会不会产生重复请求数据交互中网络突然断开页面上半截有数据、下半截空白的“半成功状态”怎么处理。其中最值得盯紧的是支付、提交订单这类一锤子买卖的操作网络断了不能出现“用户以为没下单结果是重复扣款”的情况。这种用例在Web里通常排得并不靠前在App里却是首要保障项。3.2 系统打断来电、短信、通知、闹钟这类“不速之客”浏览器窗口偶尔也会被系统弹窗打断但App完全没有“隔离区”的概念一个来电直接横在应用上面应用的整个生命周期瞬间变化。测试时要在核心流程中主动插入各种打断通话进行中、短信通知横幅、闹钟提醒、低电量提醒、耳机插拔、蓝牙断开、投屏切换、语音助手被唤起。这类系统和业务耦合的操作特别容易爆出严重缺陷。我记忆比较深的一次是登录流程里来了一条短信横幅验证码输入框被横幅遮住用户看不到输入内容只能盲输另一次是支付流程中途接了电话支付回调在App回到前台之后才到达页面一直停留在“支付中”状态必须杀掉进程重进才能恢复。这类场景做Web测试时根本不会有人主动构造但对App质量的伤害往往比复杂业务接口的bug更直接。确保状态能恢复、回调能续上、流程不重复提交才算是真正完成了打断测试。3.3 动态权限与隐私合规系统授权弹窗带来的用例链Web端涉及摄像头、麦克风时基本就是浏览器统一询问一次后续相对稳定移动端的权限体系复杂得多。Android的运行时权限、iOS的隐私弹窗链每次启动都要确认一组权限是否合理授予。拒绝、仅使用期间允许、永久拒绝、系统设置里关闭后重进每一条链路对应着完全不同的应用状态。最常见的线上问题是用户拒绝了定位权限应用启动就白屏或者所有依赖定位的功能集体异常代码里却没有给出任何降级提示。测试时如果只按“允许全部权限”来走主流程这个坑只会在真实用户手里炸开。另外还有隐私合规的要求首次启动要让用户看到隐私协议、权限用途说明关闭某项权限后的功能降级文案也要完整。Web测试完全不用考虑这套东西App测试每次发版前都要过一遍。3.4 前后台切换与进程被杀页面“留不留得住”决定体验下限Web页面关了就没了用户重新打开要重新加载App不一样用户会高频地切到桌面、再切回来手机内存紧张时应用还会被系统杀掉。测试要覆盖切后台多久再回来几秒、几分钟、过夜、期间有没有发生网络切换、回到前台时页面状态是否保留、数据是否刷新、登录态是否存活。我见过一个项目用户拍了几张照片填表单中间回微信看一眼回来表单数据全清了只能重拍用户直接在应用商店打了一星差评。这类场景Web测试完全覆盖不到因为浏览器标签页关闭后没有“后台存活”的概念而App工程师一不留神就会在处理生命周期时漏掉状态保存。前后台切换不回归一遍就等于把最常用到的手机操作习惯丢在了测试覆盖之外。4. 兼容性的重点完全不同Web盯浏览器矩阵App盯ROM与屏幕碎片化4.1 浏览器矩阵内核差异、版本差异、缩放比Web兼容性的核心是浏览器。不同浏览器、不同内核、不同版本、不同操作系统、不同DPI缩放对一个CSS样式的解析可能产生十几个差异点。实践里我为Web项目维护一张浏览器优先级矩阵把几个主流桌面浏览器的最新两个大版本、双核浏览器的兼容模式、系统默认浏览器、移动端主流浏览器列为必测项其余的后置成按需回归。矩阵里还会专门列上缩放要求100%缩放、125%缩放、200%缩放、自定义缩放下页面布局是否错位。办公场景里主流桌面系统的默认缩放是125%经常把页面布局弹乱浏览器自带的网页缩放和系统缩放叠加后表格、侧边栏、弹窗位置都会出现诡异的偏移。这类问题在App端就没这么明显因为移动端整体不依赖“系统桌面DPI缩放”这套机制。4.2 Android ROM碎片化厂商定制才是App兼容的主战场App兼容性最麻烦的不是屏幕尺寸而是系统层面的碎片化。手机厂商深度定制系统有些会阉割系统级服务组件有些会在后台限制应用自启、清理后台进程这些改动在通用模拟器上根本测不到。比如某些ROM默认禁止应用后台联网结果用户锁屏一段时间后消息推送收不到再比如某些新机型的系统级应用冻结让长期驻留后台的应用直接停止网络请求。测试时如果只用原生系统和高配真机这些问题基本不会暴露。我的团队策略是兼容性测试永远至少包含三台真实设备一台旗舰、一台中低端、一台小众的深度定制ROM系统版本覆盖Android和iOS高低两档。真机云测平台可以帮忙覆盖更多型号矩阵但真正有参考价值的反馈永远来自真机环境。模拟器适合跑回归脚本不适合做兼容性结论因为它的网络协议栈、系统策略、触控驱动和真机差距太明显。4.3 屏幕尺寸、刘海屏、全面屏和横竖屏旋转App界面的兼容不只是“把分辨率调一调”而是涉及屏幕上所有和UI相关的细节不同宽高比下的图片和按钮位置、状态栏高度差异、全面屏手势区与底部导航是否冲突、顶部的异形区域会不会遮挡标题、折叠屏展开时布局是否重新排布、横竖屏旋转动画是否卡顿。实测中最容易忽略的是“大屏模式”折叠屏和平板上应用如果没有做适配页面会把手机尺寸直接拉伸成一条很宽的“鱼”操作按钮挤在角落体验极差。Web端一般只需要保证响应式布局和几个典型视口尺寸这些移动端特有的屏幕变化决定了Web测试团队如果没有专门设备很难把App适配用例做完整。所以每次提兼容性需求我都会和设备负责人先把真机清单拉出来再把云测平台当补充两边一起跑。5. 自动化、性能与安全同一个“测试”名字工具链已经完全分家5.1 Web自动化定位元素靠DOM跑回归靠浏览器驱动Web自动化的技术路线比较成熟清晰基于WebDriver协议的工具操作浏览器元素常用框架还支持网络拦截、多标签页管理、移动端浏览器模拟。做Web自动化核心技能堆在元素定位、显式等待、用例断言和跨浏览器驱动管理页面刷新后重新查找元素、弹窗处理、上传下载路径都是日常优化点。由于浏览器调试协议天然支持捕获网络请求、拦截接口返回Web测试里模拟不同后端响应、校验埋点上报都是非常顺手的事。5.2 App自动化真机、模拟器、WebView上下文还有一堆系统弹窗App自动化的复杂度明显高一个档次。主流移动自动化框架扩展了WebDriver协议能力但真实使用中要处理的坑多很多控件树有时拿不到、动态权限弹窗拦截元素、真机厂商的调试桥不稳定、iOS端自动化还依赖系统辅助功能权限。再加上App里原生页面和H5页面并存脚本跑着跑着要切换上下文从原生控件切到WebView再切回来时机的稳定性要反复调试。我的建议是新项目不要一上来就追求全量自动化。先把纯原生的核心回归脚本跑通再逐步加H5侧和权限系统处理否则会被弹窗同步问题磨到怀疑人生。真机远程调试方案能弥补一部分稳定性问题但每个版本都要更新驱动和系统包这部分维护成本必须排进迭代计划别想着一次搭完一劳永逸。5.3 性能测试Web看加载速度指标App看CPU、内存、帧率与流量Web性能测试的关键词是白屏时间、首屏时间、核心页面加载耗时、最大内容绘制、资源总体积、接口耗时通常用性能实验室做基准对比或引入真实用户监控采集分位数。App性能测试的体系完全不同应用启动耗时、启动帧率、页面滑动帧率、崩溃率、ANR率、冷启动内存峰值、内存泄漏增长、后台驻留内存、流量消耗、耗电情况每一项都有独立的工具和方法。工具链也不一样。Android有系统级追踪、内存检测、卡顿检测工具iOS有性能分析工具第三方也有CPU、帧率、流量监控SDK。Web和App都会测“首屏加载”但两者的定义起点就不同——Web测的是输入网址、开始加载HTML到渲染完成App测的是点击图标到首屏可操作的耗时中间包含了进程创建、插件初始化、首帧渲染、SDK初始化。启动时长每多100毫秒用户流失率都会变化。所以一次客户端性能专项的排期通常比同体量的Web性能专项多三到四天而且必须准备不同档位的真机来对比中低端机的表现。5.4 安全测试的差异一个更像服务端防御一个更像本地应用攻防Web安全测试的重心在服务端和浏览器之间的信任边界输入校验、注入攻击、跨站脚本、跨站请求伪造、越权访问、文件上传漏洞、Cookie和Session安全很多风险可以用Web专用扫描器快速筛查。App安全测试除了要看服务端接口同样的漏洞之外还要多关心客户端本身安装包能否被反编译、重打包本地存储的密钥、token、用户数据是否明文是否对越狱和Root环境做了检测传输层有没有做证书校验第三方SDK有没有过度收集敏感信息。这些维度在Web测试里基本不存在但App一旦被逆向分析损失往往比几个服务端漏洞更直接。测试人员即使不专职做安全也至少有意识地检查一下关键接口的加密链路和本地敏感信息的存储方式否则发出去的每一个版本都是风险敞口。老实说把Web那套测试思维直接套到App上能覆盖掉一半以上的功能问题但剩下的那一半全是“App专属”的生死线版本兼容、弱网、系统打断、权限弹窗、后台存活、真机ROM适配。我现在接到需求习惯先问三个问题这个需求Web和App是否共用接口App端要不要兼容老版本用户最可能在什么样的网络和设备环境下使用问完这三个问题测试方案的框架基本就出来了。也想跟团队里刚接触App测试的Web测试同学说一句别急着写用例先把真机拿到手里装上一台最新版、一台老版本真正去点一遍“安装、升级、清数据、断网、切后台、接电话”这六个动作比看十篇方法论都管用。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进