實用速學!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

呀,這麼認真都看到這裏啦,幫忙點個推薦支持一下唄,灰常感謝~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章