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
呀,這麼認真都看到這裏啦,幫忙點個推薦支持一下唄,灰常感謝~