如何为iOS Widget/WidgetKit编写UI测试及功能测试?
Widget 测试完整方案
基于你已经完成数据模型、视图模型单元测试的前提,针对Widget专属的视图和逻辑测试可以按以下方案执行:
1. WidgetView 测试方法
WidgetView 虽然仅在Widget扩展进程内生效,但不需要实际加载Widget到桌面、也不需要启动主App即可完成测试,可选两种测试方式:
- 快照单元测试
- 首先调整
WidgetView的Target归属,把代码放到共享组件目录,让单元测试Target可以直接引用,不要只放在Widget扩展的Target下 - 引入iOS生态常用的快照测试工具,在单元测试中初始化
WidgetView,传入不同状态的Mock视图模型(你已经完成视图模型的单元测试,直接用Mock输出即可),生成小、中、大、特大四种Widget尺寸的快照,和预设的基准快照做比对,即可验证不同状态下视图渲染是否符合预期 - 可覆盖的测试场景:数据加载中状态、加载成功状态、网络/权限异常的占位状态、深色/浅色模式适配、动态字体适配等
- 首先调整
- 开发阶段预览验证
- 在
WidgetView代码末尾添加PreviewProvider实现,选中Widget扩展的Scheme即可在Xcode预览面板直接查看所有尺寸、所有状态的视图效果,不需要运行任何宿主进程
- 在
2. getTimeline 等Widget核心逻辑的测试方法
getTimeline 属于TimelineProvider的纯逻辑方法,完全可以脱离Widget的实际运行做单元测试:
- 先做逻辑剥离:不要把数据处理、规则判断的逻辑直接写在
getTimeline的系统回调里,封装成独立的可调用方法,依赖的视图模型、网络服务都做成可注入的依赖,方便替换成Mock版本 - 单元测试中直接初始化你的
TimelineProvider实例,调用getTimeline方法并传入Mock的Context参数,验证输出的Timeline实例是否符合预期:- 验证生成的
TimelineEntry数量、刷新时间间隔是否符合你设定的规则 - 验证每个
Entry携带的渲染数据和Mock视图模型的输出一致 - 验证网络失败、用户权限关闭等异常场景下,返回的占位Entry是否符合预期
- 验证生成的
- 其余Widget逻辑比如
getSnapshot、占位视图生成逻辑都可以用相同的方式测试,直接调用方法传入参数验证输出即可
测试注意事项
- 不需要编写主App层面的UI测试来验证Widget,Widget运行在独立的扩展进程,主App的UI测试Target无法捕获到Widget的视图元素
- 不需要测试iOS系统的Widget调度逻辑,这部分由系统控制,你只需要保证自己返回的
Timeline配置符合业务要求即可
内容的提问来源于stack exchange,提问作者AK-Vitae
相关产品推荐
相关产品推荐

