實用速學!Airtest如何幫助我們檢測包體是否需要覆蓋安裝?
1. 安裝包體真的是一個簡單的事情嗎?
今天我們來聊一聊測試前的準備工作--“安裝包體”。有同學看到這個可能會說,這不是很簡單嗎?直接用Airtest封裝的 install
介面,直接裝一下不就完事了嗎?
我們也希望是這麼簡單的,但實際上並不是,舉個例子,如果該手機已經安裝了一個相同包名的包體,那我們使用 install
安裝的時候,裝置就會提示我們是否需要覆蓋安裝,此時單純的 install
介面就沒法幫我們自動處理了。我們可能就需要在安裝之前,事先判斷一下,手機上是否已經安裝了同名包體。
那進一步思考,究竟要不要執行覆蓋安裝呢(假設我們希望要安裝的包體,比裝置裡已經安裝的包體版本要高,才執行覆蓋安裝的操作)?這時我們就需要通過指令碼判斷下,我們想要安裝的這個包體,是否比手機上已有的包體版本更高,才執行進一步的操作。
2. Airtest如何檢測包體已經成功安裝?
我們可以通過Airtest提供的下述2個介面,來判斷一個包體是否已經成功安裝在測試裝置上:
以網易雲音樂APP為例(遊戲應用也是同理的):
# -*- encoding=utf8 -*- __author__ = "AirtestProject" from airtest.core.api import * from airtest.core.android.android import * auto_setup(__file__) PACKAGE = "com.netease.cloudmusic" android = Android() print(str(android.check_app(PACKAGE))) print("-----------------") print(str(android.path_app(PACKAGE)))
通過介面判斷出裝置是否已經成功安裝了包體之後,我們就可以做出如下處理:
- 如裝置未安裝包體,則直接執行安裝
- 如裝置已安裝包體,則進一步判斷是否需要覆蓋安裝
3. Airtest如何檢測包體是否需要覆蓋安裝?
檢測是否需要執行覆蓋安裝的思路大概是:
- 獲取本地apk的版本號(即準備安裝到手機上的那個包體)
- 獲取手機裡已經安裝好的包體的版本號
- 對比獲得的2個版本號,如果本地apk版本號大於手機裡包體的版本號,則判斷需要執行覆蓋安裝
# -*- encoding=utf8 -*- __author__ = "AirtestProject" from airtest.core.api import * from airtest.utils.apkparser import APK from airtest.core.android.android import * auto_setup(__file__) PACKAGE = "com.netease.cloudmusic" APK_PATH = r"D:\demo\NeteaseCloudMusic_Music_official_8.7.11.220318190241_32.apk" android = Android() # 獲取本地apk檔案的版本號 apk_version = int(APK(APK_PATH).androidversion_code) # 獲取手機已安裝包體的版本號 installed_version = android.adb.get_package_version(PACKAGE) print("------------------------------------") print("local version code is {}, installed version code is {}".format(apk_version, installed_version))
因為我們對每臺裝置,或者每次拿到新包時,都要判斷一下,所以我們可以直接把判斷是否需要覆蓋的指令碼,封裝成一個方法:
from airtest.utils.apkparser import APK
def need_upgrade(device: Android, package: str, apk_path: str):
"""
檢查手機中的package name的版本號,與本地apk檔案版本號進行對比,如果本地檔案版本號更高,說明需要覆蓋安裝
:param device: Android() 物件
:param package: 例如:com.netease.cloudmusic
:param apk_path: 本地apk檔案路徑
:return:
"""
apk_version = int(APK(apk_path).androidversion_code)
installed_version = device.adb.get_package_version(package)
if installed_version is None or apk_version > int(installed_version):
print("local version code is {}, installed version code is {}".format(apk_version, installed_version))
return True
return False
4. 關於覆蓋安裝
大部分同學應該都知道,我們可以使用Airtest封裝的 install
介面幫助我們在裝置上安裝包體,其實,它還支援傳入一些引數,比如執行覆蓋安裝(與 adb install
命令一致):
from airtest.core.api import *
# 安裝引數 -r 表示覆蓋安裝
install(r"D:\demo\test.apk", install_options=["-r", "-t"])
5. 小結
那今天關於“安裝包體”的內容就聊到這裡,簡單彙總一下上文提到的幾個小知識點:
- 檢查package在裝置中是否存在:
check_app
- 打印出package的完整路徑:
path_app
- 獲取本地apk檔案的版本號:
int(APK(apk_path).androidversion_code)
- 獲取手機中包體的版本號:
Android().adb.get_package_version(package)
- 覆蓋安裝:
install(r"D:\test.apk", install_options=["-r", "-t"])
Airtest官網:https://airtest.netease.com/
Airtest教程官網:https://airtest.doc.io.netease.com/
搭建企業私有云服務:https://airlab.163.com/b2b
官方答疑 Q 群:117973773
呀,這麼認真都看到這裡啦,幫忙點個推薦支援一下唄,灰常感謝~