ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Web测试与App测试的核心差异:从用例设计到自动化

Web测试与App测试的核心差异:从用例设计到自动化 我最早做Web端测试后来接手一个App项目头两周就被打懵了。按理说都是“点一点、验证结果、找bug”可真换了平台才发现光“点击一个按钮”这件事背后的逻辑就能差出十万八千里。很多人会把“Web测试和App测试的区别”理解成“换了个设备跑一遍”但实际上这两者从产品形态、技术栈、用例设计到自动化和排查逻辑几乎都是两套体系。这篇文章就是想把这些差异掰开揉碎了讲清楚为什么Web端那套经验在App上会失灵App端哪些能力必须严格测以及规范下来之后回头看那些“看起来一样的测试用例”到底各自在验证什么。1. 先搞清楚一个问题你测的到底是浏览器还是客户端1.1 一个让很多测试同事翻车的真实场景有一次后端做了一遍接口调整把某个字段的返回结构改了。Web端当天发完版前后端一起联调测试环境一刷新浏览器里一切正常线上发布也没出问题——因为Web资源的更新是跟着服务端走的用户下次访问拿到的是新代码。但App端完全不是这么回事。用户手机里装的还是旧版包里面是旧接口逻辑后端提前把旧字段下线不等App发新版全量用户就开始报错、白屏、闪退。那天我们紧急回滚后端接口客服那边已经收到了几百个投诉。这就是Web和App测试之间最大的认知鸿沟Web模型是“客户端拿命令”App模型是“客户端自带程序”。前者你改了服务器全世界都跟着变后者客户端代码装了就是装了服务端改不了也管不到所有变化都得等到用户下一次升级。1.2 从交付形态看本质差异把这些差异整理出来等于给测试策略划了一条分界线维度Web端App端代码在哪运行浏览器下载资源后运行代码和服务端一同发布代码打包在安装包里提前分发到用户设备更新方式刷新页面就能拿到新版本必须发版、过审、用户手动或自动升级环境依赖浏览器内核、操作系统版本、网络设备型号、OS版本、屏幕、内存、存储、传感器、网络弱网处理一般只在页面加载阶段依赖网络每个接口都可能涉及弱网、断网重连、切换网络系统权限浏览器有提示权限但约束非常多可以调用摄像头、相册、定位、通讯录、通知、剪贴板等后台状态切Tab、最小化、恢复更多是页面生命周期应用可能被系统回收、杀进程、恢复时做状态重建如果你测的产品两端都有这条表基本能当“策略底稿”用。每次排计划的时候拿它过一遍哪些地方按Web思路处理哪些地方必须按App思路单独设计会清晰很多。1.3 为什么“产品形态”决定测试上限很多用例在Web端怎么测都对但移植到App端就露馅关键不在操作步骤而在你没搞清楚产品在不同平台的“真实角色”。举个最简单的例子。一个登录功能Web端的核心是输入框校验、验证码、跳转、cookie/session状态。App端的核心则多了好几个token是否安全存储、应用被杀掉之后登录态能不能恢复、从其他App跳回来之后会不会被系统重建Activity、授权弹窗是否和输入框错位遮挡、弱网时登录超时后能做几次重试……所以我说产品形态决定测试上限意思是如果你只按Web那套功能流程去测App顶多算“把页面点完了”真正让App用户崩溃的问题——权限冲突、后台杀进程、缓存失效、弱网重连——你一个都发现不了。后面几节就专门展开这些话。2. 用例设计上的关键差异不要只停在“点按钮”2.1 功能测试的侧重点完全不同Web端的功能测试天然围绕着“路径状态”展开。用户打开浏览器输入网址页面加载点击按钮发起请求后端返回前端渲染。你要测的核心是页面能不能正常展示、交互逻辑对不对、接口返回异常时页面怎么兜底。整条链路里浏览器的环境相对统一页面之间的跳转路径也比较线性。App端的功能测试则更像在测一个“有脾气的小型操作系统”。除了界面点击你还要面对冷启动、热启动、前后台切换、来电中断、闹钟弹窗、横竖屏旋转、深链跳转、分享到其他App再返回、App被系统回收后恢复页面……这些在Web端你基本不用操心但在App端每一样都能单独拉出一个测试设计专题。我印象最深的是有一次做Android选座界面明明手工走流程没问题但用户一锁屏再解锁整个选座状态直接被系统重建之前选好的座位全丢了。Web端“锁屏再打开”只是一个普通浏览器切换App端却是Activity生命周期里的正常重载流程。这种差异不体现在需求文档里但对测试结果的影响极其致命。2.2 App专属的专项测试是“必答题”不是“选做题”Web测试不测弱网最多就是断网看一下白屏提示。App测试不一样移动网络的复杂性是常态Wi-Fi和4G/5G切换时正在进行的请求会不会失败、页面会不会卡死网络从弱信号恢复之后App有没有自动重试断网状态下缓存页面还能不能浏览已提交的数据会不会丢大图、视频资源加载到一半网络断了再次联网之后能不能续传。再往下App的专项还有一批Web端根本不存在“同名测试项”的东西内存泄漏页面反复进入退出Memory持续上涨、ANR主线程卡顿系统直接弹“无响应”框、崩溃率监控、耗电量、启动耗时、安装包体积以及关键的一类——前后台切换时进程被系统杀掉后数据能不能恢复。这些专项不要求每个功能回归都做全但在需求评审或者版本计划时至少要针对风险点做轮巡。否则等线上出现“杀后台就闪退”、“Wi-Fi切到4G直接崩”、“内存涨到系统把App干掉”这些问题再补测就已经来不及了。2.3 兼容性测试浏览器之战 vs 设备碎片化Web端页面兼容性测试核心是浏览器内核差异。Chrome、Firefox、Safari、Edge再加上不同OS版本上的WebView。优先级排序通常是用户量最大的浏览器型号 目标用户群体常用浏览器 业务页面有没有用到特性和H5新API。你只需要在关键页面做跨浏览器验证配合少量响应式断点检查差不多能覆盖主流场景。App端就不一样了兼容性是一个“几何级”组合矩阵iOS和Android两大阵营不同版本不同屏幕尺寸不同分辨率不同内存不同品牌ROM小米、华为、OPPO、vivo的权限策略都不一致。你现在去市场上随便找一台Android中低端机跟旗舰机的行为差异就能让测试工程师怀疑人生。比如同样的React Native页面在iOS真机上渲染一切正常在Android低配机上可能直接卡到白屏同样是定位权限iOS弹窗一次Android某些ROM会默认拒绝同样是WebView各ROM自带浏览器内核版本可能差一个“时代”。最稳妥的做法是真机矩阵只保留高优设备但一定要保证覆盖“低内存老系统主流国产ROM”这一个组合它出问题的概率高得惊人。2.4 界面适配响应式断点和“马赛克设备”是两回事很多Web测试习惯了自己调“窗口拉窄、看看换行”这种简单检查放到App端得重新学习。App的适配不只是“屏幕宽一点窄一点”那么简单它要管的是安全区刘海、挖孔、灵动岛、系统字体缩放、深色模式、横竖屏、跨屏设备折叠屏、平板。过去Web页面在iPhone下也考虑刘海但那个是浏览器自带的内容会被安全区自动顶开而App原生布局要写代码处理Home Indicator、状态栏遮挡。另外“系统字体缩放”这个坑也很典型。用户把系统字体调到超大字号很多App页面布局直接错乱按钮被挤出屏幕弹窗确认按钮找不着。这在Web端很少发生因为Web页面用rem和视口单位相对灵活但原生App对固定layout的依赖比你想的强得多。每次发版之前我一定会在“超大字体最小字体”下把核心页面过一遍别当成偶发性问题。3. 自动化测试同样叫“跑用例”落地方案差了一代3.1 Web自动化成熟且稳定几乎没有不吵的环境问题Web端自动化主流方案基本是Selenium或Playwright。你用CSS、XPath去定位元素浏览器驱动一装脚本跑起来非常顺。环境差异顶多是版本兼容或者iframe层级问题但整体上浏览器给自动化工具提供了标准而稳定的入口DOM树是公开的、元素可以稳定查询、页面加载有明确等待机制。所以我一直觉得Web自动化是学习自动化测试“最舒服的起点”。写脚本的时候你不用担心设备并发、安装包、权限弹窗也不用管屏幕锁定和后台进程用例写起来像在普通代码里做断言出错了看日志一眼就能定位。3.2 App自动化涉及的是“真机/模拟器框架设备管理”的大拼图App自动化绕不开三个大件框架、设备管理、运行环境。主流方案是Appium跨iOS/Android、XCUITest、Espresso以及新一些的Maestro。但真正的复杂度不只是选框架而是这套链条有多长你要准备模拟器、真机、或移动设备云iOS要用WebDriverAgent来做连接和控制依赖Xcode和签名配置Android要通过adb连接设备还要处理不同品牌的USB调试开关差异定位元素不再只有CSS/XPath还有resource-id、accessibility id、iOS的accessibility label每次用例跑完设备上会残留App安装包、缓存、登录态清理起来要比浏览器彻底得多。更难受的一个点自动化脚本在模拟器上跑得风生水起一上真机就“动态权限弹窗”全乱了。因为真机会弹出系统权限对话框你的脚本如果没有处理这个流程下一步点击直接失效。Web自动化里哪有这种“操作系统级”的阻断3.3 并行执行和CI集成的复杂度也不在同一个量级Web自动化上CI很容易容器里直接启动浏览器多个Worker并行跑甚至用Selenium Grid或者Playwright自带的并行机制几分钟就能把浏览器矩阵拉起来。App自动化想做到类似效果得先搭建设备中心用Appium的并行能力同时操作多台设备再把回归用例拆到不同真机/模拟器上还要处理设备之间资源竞争。虽然现在有很多移动设备云平台帮忙做真机分发但内部团队想低成本搭建一套稳定并行执行体系投入的维护成本远高于Web端。我见过一些团队Web自动化做得热火朝天一到App自动化就偃旗息鼓根本原因不是能力不够而是没预料到“设备管理”这个隐藏大坑。所以我的建议是App自动化优先保住“核心冒烟”别好高骜远先把20条最核心的路径稳定跑起来比硬凑200条不稳定用例强一百倍。4. 边界和状态转换怎么写用例才不会被平台差异坑进去4.1 Web用例偏“路径型”App用例偏“状态机型”Web测试用例哪怕复杂一点本质也是一条路径输入X - 点击Y - 断言Z。跳转关系清楚页面栈简单你甚至可以跟着用户故事直接编排。浏览器里偶尔开个新标签、返回上一个页面状态管理也不复杂主要靠cookie和URL参数。App就不行了我强烈建议用例写成“状态机思维”每个页面/模块都可能有多个生命周期状态而系统随时可能在任意一个状态下把你App切成后台、回收或销毁。所以用例要覆盖冷启动时如何初始化、从后台恢复到前台的缓存数据对不对、在不同页面被系统杀掉之后再恢复时应该回到哪里。再举个例子App里有一个“输入框未提交就被切走”的经典场景用户在编辑页填了内容切到其他App回个微信再切回来输入内容还在不在Web端刷新页面基本就重置了用户也不指望内容保留但App端如果丢了内容用户会非常愤怒因为直觉告诉他们“App不会突然忘记我输入的东西”。4.2 权限、中断、通知这三类用例Web端根本没法定制很多从Web转App的测试同学最容易漏掉以下几类用例权限弹窗类首次启动时是否按顺序弹权限拒绝后再次触发有没有二次说明权限关闭后功能怎么提示中断类来电、短信、闹钟、低电量提醒、系统更新弹窗会不会打断正在进行的流程通知类应用推送通知时App在前台/后台分别怎么表现点击通知跳转到指定页面通知堆叠、重复、已读状态怎么展示。这些用例没有复杂的技术含量但它们决定了用户对App“稳不稳”的直接感知。Web端你能让浏览器随便弹通知吗不能浏览器权限提示本身就受限。可App如果不做通知测试发版当天就可能因为“推送栏点进去不对”“通知点击杀掉后台之后没跳转”被用户狂喷。4.3 两端都有时用例如何组织才不会互相污染现在很多产品是WebApp同售的例如“管理后台在Web、用户使用在App”。这时候用例设计要把业务逻辑和平台特性拆开。我习惯把用例分成三层第一层业务公共层。比如登录、下单、支付的核心业务逻辑两边的用例主干可以复用但入口和控件细节单独维护第二层平台差异层。Web端写浏览器相关、响应式相关App端写权限、生命周期、推送、弱网、设备适配相关第三层专属能力层。只有前端才有的管理功能放Web只有移动端才有的相机扫码、定位轨迹放App。这样组织以后不会出现“同一份业务用例被生硬复制到两边”的尴尬情况也不会因为两端环境差异而互相干扰。5. 排优先级有限人力下Web和App的测试到底怎么分配5.1 别靠感觉用Bug分布说话我在实际项目里的经验是Web端的Bug高发区集中在跨浏览器样式、动态接口返回异常、第三方登录/支付回调、页面加载性能、组件版本升级回归。App端的高发区则明显偏到崩溃/闪退、ANR卡死、权限冲突、弱网处理、缓存/状态恢复、设备适配、通知跳转、版本升级带来的数据兼容。把这些高发区列一个风险矩阵你就会发现两个平台“重投入”的点根本不在同一方向。如果团队资源有限按风险占比排优先级基本上能把80%的线上问题提前截住。5.2 测试轮次可以按“核心Journey × 平台差异”来排不要做“Web全部用例App全部用例”这种无脑全量回归否则人力再多也不够用。我常用的做法是筛选出每个版本的核心用户路径Login、主流程下单、支付、关键查询等这些路径在Web和App各跑一遍作为必测基线相对低频的功能先按平台差异影响面看——Web端影响浏览器兼容/前端布局App端影响权限/生命周期后端新接口、新逻辑优先找Web端或接口层做大量验证因为Web侧发版快、反馈快App端的不稳定项或高风险项单独开“专项目”列入冒烟和回归的必测名单。这么做本质上是把“平台差异”当成了用例优先级的权值而不是把平台当成另一个“重复执行环境”。5.3 质量保障体系两端协同的团队建议如果团队同时维护Web和App以下几个动作能明显提升效率统一Bug模板里面必须有环境信息Web要填浏览器和版本App要填机型、OS版本、App版本、网络方式接口层自动化必须单独维护Web和App测试都依赖它移动端必须引入崩溃监控和日志上报Web端必须有前端错误监控两边数据要看同一套业务漏斗每次版本发布前App端至少做一轮“旧版本兼容测试”尤其后端不能提前下线旧字段。这些往往不是“测试执行”层面的工作而是质量基础设施层面的建设。但说实话没有这些前面那些用例设计做得再细也容易变成“事后消防”。更重要的是——它能把Web和App测试从两套割裂的流程变成一套能互相借力的完整体系。6. 避坑指南我从Web转App后踩过的几条真话6.1 只测新版本完全不管旧版本后端一改接口Web端发布立刻生效但App用户手里可能是旧包。你如果不测旧版App对新接口的兼容性就等于裸奔。现在我的习惯是后端任何对外字段或接口变更都要跑一遍“旧包冒烟”哪怕只是确认不崩溃。6.2 用Chrome调好了就认为移动端Web没问题不少项目里前端把页面做成了H5在Chrome开发者工具里把设备模拟成iPhone看着一切正常就上线。结果用户用iOS原生Safari打开字体渲染异常、键盘弹出后页面布局被严重压缩、底部按钮被Home Indicator挡住。H5不只是“小一点的Web页面”它的运行环境是WebView很多CSS兼容性和原生浏览器交互问题居然只在真机WebView里出现。6.3 模拟器/仿真器上跑得很顺就信了模拟器内存大、CPU强、网络稳定跑任何功能都顺滑。但用户真机可不是这个环境。低内存手机上App启动要三秒模拟器一眨眼就跑完了Android模拟器自带Google Play服务真机上各厂商ROM权限管控完全不同iOS模拟器跟真机的系统权限行为也有很多差异。模拟器可以用来做功能冒烟但凡是涉及权限、生命周期、性能、弱网、兼容性的用例一律上真机。6.4 把键盘、鼠标事件当成触摸手势Web端的点击、hover、滚动都是有对应浏览器事件的但App端的手势事件复杂得多左滑删除、下拉刷新、双击点赞、长按呼出菜单、边缘滑动返回——这些如果用鼠标模拟很容易漏掉真机上的手势冲突问题。比如长按手势和滚动冲突、下拉刷新和页面滚动冲突只有真机手指操作才能复现。6.5 测试数据、缓存、登录态在设备之间互相污染做过App自动化的人都懂“设备状态污染”在一台机器上跑脚本上个用例登录了用户A下个用例没有清理登录态又跑去验证用户B的功能结果测出来的全是假的。所以要么每个用例独立清理数据要么用独立设备池总之不能让“上一次运行的状态”影响这次的结果。这个教训和Web端“清cookie、清缓存、开无痕”是同一个道理只是在App端操作成本高很多特别容易被忽略。最后一条大白话做Web测试和App测试本质上不是“同一套测试在不同终端各做一遍”而是“两种不同产品形态各自驱动的质量体系”。核心路径可以用业务共用的思路去设计但边缘场景、专项能力、自动化方案、问题排查都必须回到各自平台的运行逻辑里重新想一遍。如果你刚从Web端转向App端最怕的就是拿原有经验硬套。别慌先把手上的功能按我前面那张“维度对比表”过一遍哪些是Web思维能覆盖的哪些必须换成App思维再结合每次线上问题复盘迭代自己的用例库。做过一轮之后你对两个平台的理解就会真正长在自己经验里了。
返回列表