应用程序包缓存
Appium 的基础驱动程序提供了一个功能,可以缓存提供的应用程序构建,例如,作为 app
功能值或类似于 installApp
的端点。本文解释了常见的缓存原理,以便您可以创建更高效的测试套件执行策略。
为什么需要缓存¶
移动应用程序包的大小可能达到数百兆字节。如果执行测试套件,并且需要为每个测试获取/提取相同的应用程序包,这可能会成为一个严重的性能问题。
缓存的内容¶
缓存可以应用于由 configureApp
帮助程序调用生成的应用程序包。继承的驱动程序可以通过提供自己的 onPostProcess
属性定义来定制其缓存逻辑,但一般规则是,我们需要在本地缓存所有需要先下载和/或提取的应用程序包,然后才能将其实际安装在测试设备上。例如,在 iOS 上,这些是 .ipa
或 .zip
压缩的应用程序包,或 Android 上的 .aab
。
远程应用程序包的缓存¶
为了验证从给定 URL 下载的应用程序包是否可以从缓存中(重新)使用,将应用以下步骤
- 脚本发送
HEAD
请求到给定的链接,以便只获取响应头。如果此请求失败/超时,则不应用缓存。 - 提取以下头值:
Last-Modified
、Cache-Control
。如果不存在Last-Modified
头,或者头值无法解析为有效的日期时间,则不应用缓存。 - 脚本检查给定的 URL 是否已存在于缓存中。如果应用程序尚未缓存,则将其下载,并将当前头值以及哈希值添加到缓存中。
- 如果 URL 已存在于缓存中,则脚本验证
- 当前
Last-Modified
日期时间是否与之前的日期时间不同 - 当前
Last-Modified
日期时间与缓存日期时间之间的差值是否不超过 max-age(如果存在) - 缓存文件/文件夹的哈希值是否已更改(例如,它在缓存中时没有损坏)
- 当前
- 如果以上所有验证都成功,则返回缓存的构建,否则删除当前缓存的条目,并改为下载新的条目。
本地应用程序包的缓存¶
只有在应用程序包需要在安装到测试设备之前进行一些预处理时,缓存应用程序包才有意义。例如,在 iOS 上,.ipa
包必须解压缩,因为系统安装程序只支持 .app
文件夹。
- 脚本验证给定的包路径是否已存在于缓存中。如果包尚未缓存,则对其进行预处理并将其添加到缓存中。
- 脚本验证包的哈希值,并将其与之前存储的哈希值进行比较。如果哈希值不匹配,则删除缓存的项目,并重复包的预处理。
缓存文件系统的配置方式¶
基础驱动程序保存所有应用程序包的缓存位于系统临时文件夹中。它是在每个进程的基础上配置的,因此在同一 Appium 服务器进程范围内初始化的每个测试会话都将利用它。它是一个 LRU 缓存,具有以下限制
- 最大项目数:1024
- 每个条目的最大生存时间 (TTL):24 小时
- 每次访问时都会刷新每个条目的 TTL
警告
注意:缓存根文件夹设置为在 Appium 进程终止时自动删除。这只有在 Appium 服务器使用 SIGINT
或 SIGTERM
终止时才有效。如果使用 SIGKILL
,则不会执行任何缓存清理。