Caching of Application Bundles
Appium's base driver provides a feature which enables caching of application builds provided, for example,
as app
capability value or to endpoints similar to the installApp
one. This article explains common caching
principles, so you could create more performant and efficient test suite execution strategies.
Why Caching Is Necessary¶
Mobile application bundles could reach hundreds of megabytes is size. This could become a serious performance issue if a test suite is executed, and it is necessary to fetch/extract the same application bundle for each test.
What Is Cached¶
Caching could be applied to application bundles generated by
configureApp
helper call.
Inherited drivers can customize their caching logic by providing own onPostProcess
(or both inDownload
and onPostProcess
) property definition, but the general
rule of thumb is that we need to cache locally all application bundles need to be downloaded and/or extracted
first before they could be actually installed on the device under test. On iOS, for example, these are .ipa
or
.zip
compressed application bundles, or .aab
on Android.
Caching of Remote Application Bundles¶
In order to validate whether an app bundle downloaded from the given URL could be (re)used from the cache the following steps are applied:
- The script checks if the given URL is already present in the cache. If yes then it tries to fetch previously remembered Last-Modified or ETag header values for it.
- If
ETag
value is present then it is put into If-None-Match request header. Else ifLast-Modified
header value is present then it is put into If-Modified-Since request header. Otherwise, no caching is applied. - If the response status is equal to
304
then the previously cached binary is used, otherwise the cached entry is reset and refreshed.
Caching of Local Application Bundles¶
It only makes sense to cache application bundles if they need some preprocessing before being installed on the device under test.
For example, on iOS .ipa
bundles must be unzipped, because the system installer only works with .app
folders.
- The script verifies if the given bundle path is already present in the cache. If the bundle was not in the cache yet then it gets preprocessed and added there.
- The script validates the hashsum of the bundle and compares it to the previously stored one. If hash sums don't match then the cached item gets deleted and the preprocessing of the bundle repeats.
How The Cache File System Is Configured¶
The cache where the base driver keeps all application bundles is located in the system temp folder. It is configured on per-process basis, so each test session initialized in scope of the same Appium server process takes advantages of it. It is a LRU Cache with the following limitations:
- Max items: 1024. You may customize it by providing a new value to the APPIUM_APPS_CACHE_MAX_ITEMS environment variable. Do not set it to a lower number than the amount of apps in all parallel sessions per process.
- Max time to live (TTL) for each entry: 24 hours. You may customize it by providing a new value to the APPIUM_APPS_CACHE_MAX_AGE environment variable. Do not set it to a lower number than the duration of a single session startup.
- TTL is refreshed for each entry upon access
- By default the full application URL is used as cache key. You may change this behavior by enabling the APPIUM_APPS_CACHE_IGNORE_URL_QUERY environment variable. If the above option is enabled then the 'search' part of the app URL will be cut off from cache keys. See the corresponding feature request for more details.
Warning
Note: The cache root folder is set up for automatic deletion on Appium process termination. This would only
work if Appium server is killed with SIGINT
or SIGTERM
. If SIGKILL
is used then no cache cleanup
would be performed.