Win10系統(tǒng)下基于Docker構(gòu)建Appium容器連接Android模擬器Genymotion完成移動(dòng)端Python自動(dòng)化測(cè)試

原文轉(zhuǎn)載自「劉悅的技術(shù)博客」https://v3u.cn/a_id_196

Python自動(dòng)化,大概也許或者是今年最具熱度的話題之一了。七月流火,招聘市場(chǎng)上對(duì)于Python自動(dòng)化的追捧熱度仍未消減,那么Python自動(dòng)化到底能幫我們做些什么呢?

第一,Python自動(dòng)化可以避免熟練工種的重復(fù)工作,對(duì)于功能相對(duì)完整和成熟的軟件,每發(fā)布一個(gè)新的版本,無論是大版本還是小版本,其中大部分功能和界面都幾乎和上一個(gè)版本相似或完全相同,但所謂向上兼容,你不能因?yàn)樾鹿δ艿漠a(chǎn)生而不對(duì)老版本功能進(jìn)行測(cè)試工作,而這些老功能又在上一個(gè)版本上線時(shí)測(cè)過,所以這部分功能特別適合于自動(dòng)化測(cè)試,從而可以讓測(cè)試達(dá)到測(cè)試每個(gè)特征的目的。

第二,Python自動(dòng)化可以幫助我們提高測(cè)試效率:比如一個(gè)項(xiàng)目要的開發(fā)周期只有短短的幾個(gè)月,而在測(cè)試期間是每周都要發(fā)布一個(gè)版本供測(cè)試人員測(cè)試,一個(gè)系統(tǒng)的功能點(diǎn)有幾千個(gè)上萬個(gè),人工測(cè)試是非常的耗時(shí)和繁瑣,這樣必然會(huì)使測(cè)試效率低下,而自動(dòng)化流程恰恰幫我們提高了測(cè)試效率。

那么對(duì)于移動(dòng)App測(cè)試領(lǐng)域,如果一個(gè)新的應(yīng)用發(fā)布版本,QA人員面臨的挑戰(zhàn)就是如何應(yīng)對(duì)市場(chǎng)上數(shù)以千計(jì)的機(jī)型兼容性測(cè)試,毫無疑問,這是一個(gè)非常浩大的工程,更別提有些工程機(jī)在市面上根本就采購(gòu)不到,比如谷歌的Nexus和Pixel系列手機(jī),所以本次我們就在Win10系統(tǒng)下嘗試?yán)肎enymotion模擬器配合Docker構(gòu)建Appium容器,實(shí)現(xiàn)短時(shí)間內(nèi)上千款機(jī)型的自動(dòng)化測(cè)試工作。

首先關(guān)于Android模擬器為什么選擇Genymotion,誠(chéng)然,國(guó)內(nèi)也有藍(lán)神等模擬器可供選擇,但是Genymotion作為Android模擬器領(lǐng)域的執(zhí)牛耳者,其啟動(dòng)及運(yùn)行速度非???,不僅支持多個(gè)Android版本,還可以多個(gè)Android系統(tǒng)同時(shí)啟動(dòng)運(yùn)行,這就為我們并行測(cè)試腳本提供了便利,當(dāng)然了,Genymotion也有自身的缺點(diǎn),就是客戶端版本為內(nèi)核x86架構(gòu)暫不支持arm框架的應(yīng)用,但是云端服務(wù)已經(jīng)支持了arm架構(gòu),這無疑在模擬器領(lǐng)域是一個(gè)重大利好。

進(jìn)入Genymotion注冊(cè)頁(yè)面:https://www-v1.genymotion.com/account/create/

注冊(cè)成功后,注意郵箱需要激活一下,隨后進(jìn)入下載頁(yè)面:https://www.genymotion.com/download/

這里Win10系統(tǒng)會(huì)有兩個(gè)版本,因?yàn)镚enymotion內(nèi)核是基于VirtualBox虛擬機(jī),所以如果未安裝VirtualBox,則選擇with Virtualbox,否則可以選擇without Virtualbox,直接選擇Genymotion本體即可。

image

安裝成功后,用剛剛注冊(cè)的賬號(hào)進(jìn)行登錄,隨后選擇personal use(個(gè)人版):

image

隨后選擇需要測(cè)試的機(jī)型創(chuàng)建即可:

image

創(chuàng)建好對(duì)應(yīng)手機(jī)的虛擬機(jī),還需要進(jìn)行一些設(shè)置,才能保證虛擬機(jī)正常運(yùn)行。

將Virtualbox設(shè)置常規(guī)選項(xiàng)中的版本重新選擇Ohter Linux-64位

image

同時(shí)將網(wǎng)絡(luò)選項(xiàng)的混雜模式選擇:允許虛擬電腦,這個(gè)稍后鏈接虛擬機(jī)的時(shí)候會(huì)用到:

image

最后,為了安全起見,最好將宿主機(jī)的hyper-v功能關(guān)閉,管理員權(quán)限打開終端,執(zhí)行命令

bcdedit /set hypervisorlaunchtype off

重啟電腦后,啟動(dòng)手機(jī)模擬器,出現(xiàn)Android界面則表示配置成功:

image

接著我們來配置Android ADB,Android ADB又是什么?ADB 全程是 Android Debug Bridge,是開發(fā)或使用 Android 時(shí)很常用到的工具??梢詮碾娔X透過 USB 連線到 Android 手機(jī)上,利用指令列來控制你的手機(jī)。

這里我們主要是通過ADB命令來獲取虛擬機(jī)的終端ip,直接下載壓縮包文件:https://dl.google.com/android/repository/platform-tools-latest-windows.zip

將其解壓到C盤根目錄,C:\platform-tools_r31.0.2-windows\platform-tools

然后將該目錄配置全局環(huán)境變量,使其可以在終端內(nèi)直接訪問:

C:\Users\liuyue>adb --version  
Android Debug Bridge version 1.0.41  
Version 31.0.2-7242960  
Installed as C:\platform-tools_r31.0.2-windows\platform-tools\adb.exe

現(xiàn)在執(zhí)行設(shè)備列表命令:

C:\Users\liuyue>adb devices  
List of devices attached  
192.168.42.103:5555     device

可以看到,剛剛我們啟動(dòng)的虛擬機(jī)已經(jīng)出現(xiàn)在設(shè)備列表中了,直接通過connect命令就可以進(jìn)行連接,和真機(jī)幾乎沒有任何差別:

C:\Users\liuyue>adb devices  
List of devices attached  
192.168.42.103:5555     device  
  
  
C:\Users\liuyue>adb connect 192.168.42.103:5555  
already connected to 192.168.42.103:5555  
  
C:\Users\liuyue>

下面輪到Docker出場(chǎng)了,Docker的任務(wù)主要是利用容器運(yùn)行Appuim自動(dòng)化腳本,這樣就避免了繁縟的Appuim安裝配置環(huán)節(jié),當(dāng)然了,您的電腦得提前裝好Docker,如果沒有,請(qǐng)移步:win10系統(tǒng)下把玩折騰DockerToolBox以及更換國(guó)內(nèi)鏡像源(各種神坑)

隨后下載Appium基礎(chǔ)鏡像,Dockerhub上的鏡像魚龍混雜,這里還是推薦官方的版本:https://hub.docker.com/r/appium/appium

執(zhí)行命令:

docker pull appium/appium

查看鏡像:

liuyue@DESKTOP-NVU6CCV MINGW32 ~  
$ docker images  
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE  
appium/appium       latest              70f3d328b949        6 weeks ago         1.55GB

緊接著啟動(dòng)容器:

docker run --privileged -d -p 4723:4723 --name appium appium/appium

這里我們啟動(dòng)Appium容器,端口映射到4723,privileged參數(shù)讓其具備root權(quán)限,-d后臺(tái)執(zhí)行。

隨后查看容器運(yùn)行狀態(tài):

liuyue@DESKTOP-NVU6CCV MINGW32 ~  
$ docker run --privileged -d -p 4723:4723 --name appium appium/appium  
a2e8f11fdf7c561b075b563dfcc1efb6e5381e78dc3d4435a89cf8f97be52f6d  
  
liuyue@DESKTOP-NVU6CCV MINGW32 ~  
$ docker ps  
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES  
a2e8f11fdf7c        appium/appium       "/bin/sh -c '/root/w…"   7 minutes ago       Up 19 seconds       4567/tcp, 0.0.0.0:4723->4723/tcp   appium

此時(shí),我們就可以利用docker容器內(nèi)的adb服務(wù)進(jìn)行操作了:

docker exec -it appium adb connect 192.168.42.103:5555

可以看到,docker連接手機(jī)配對(duì)成功:

liuyue@DESKTOP-NVU6CCV MINGW32 ~  
$ docker exec -it appium adb connect 192.168.42.103:5555  
connected to 192.168.42.103:5555

常用的adb命令都可以進(jìn)行操作,例如查看手機(jī)Android版本:

liuyue@DESKTOP-NVU6CCV MINGW32 ~  
$ docker exec -it appium adb shell getprop ro.build.version.release  
5.0

下面我們來編寫一套簡(jiǎn)單的Appium自動(dòng)化測(cè)試腳本,首先安裝Appium庫(kù):

pip install Appium-Python-Client

編寫appium_test.py:

from appium import webdriver  
  
cap = {  
        "platformName": "Android",  
        "platformVersion": "5",  
        "deviceName": "192.168.42.103:5555",  
        "udid":"192.168.42.103:5555",  
        # 真機(jī)的  
        # "platformName": "Android",  
        # "platformVersion": "7.1.2",  
        # "deviceName": "10d4e4387d74",  
        "noReset": True,  
        "unicodeKeyboard": True,  
        "resetkeyboard": True  
    }  
  
driver = webdriver.Remote('https://192.168.99.100:4723/wd/hub', cap)  
  
# 安裝APP  
driver.install_app(app_path='C:\\test.apk',  
                   replace=False, # 不允許覆蓋  
                   timeout=10000, # 超時(shí)時(shí)間為10秒  
                   allowTestPackages=True, # 允許測(cè)試包  
                   useSdcard=False, # 不要安裝在Sdcard  
                   grantPermissions=False) # 授予權(quán)限  
  
driver.quit()

這里的192.168.42.103:5555是Genymotion模擬的手機(jī)客戶端地址,而https://192.168.99.100:4723/wd/hub則是基于Docker的Appium容器,這里我們?yōu)槭謾C(jī)安裝一款測(cè)試的app。

安裝操作腳本執(zhí)行以后,可以判斷是否安裝成功:

from appium import webdriver  
  
cap = {  
        "platformName": "Android",  
        "platformVersion": "5",  
        "deviceName": "192.168.42.103:5555",  
        "udid":"192.168.42.103:5555",  
        # 真機(jī)的  
        # "platformName": "Android",  
        # "platformVersion": "7.1.2",  
        # "deviceName": "10d4e4387d74",  
        "noReset": True,  
        "unicodeKeyboard": True,  
        "resetkeyboard": True  
    }  
  
driver = webdriver.Remote('https://192.168.99.100:4723/wd/hub', cap)  
  
# 判斷APP是否安裝,傳遞的參數(shù)為包名  
res = driver.is_app_installed('com.tencent.android.qqdownloader')  
print(res)  
driver.quit()

也可以利用腳本啟動(dòng)一些app,比如內(nèi)置的計(jì)算器應(yīng)用:

from appium import webdriver  
from time import sleep  
cap = {  
        "platformName": "Android",  
        "platformVersion": "5",  
        "deviceName": "192.168.42.103:5555",  
        "udid":"192.168.42.103:5555",  
        # 真機(jī)的  
        # "platformName": "Android",  
        # "platformVersion": "7.1.2",  
        # "deviceName": "10d4e4387d74",  
        "appPackage": "com.android.calculator2",  
        "appActivity": "com.android.calculator2.Calculato",  
        "noReset": True,  
        "unicodeKeyboard": True,  
        "resetkeyboard": True  
    }  
  
driver = webdriver.Remote('https://192.168.99.100:4723/wd/hub', cap)  
  
# 等待3秒  
sleep(3)  
# 將APP置于后臺(tái)運(yùn)行5秒鐘,然后再切回前臺(tái)  
driver.background_app(5)  
# 關(guān)閉APP  
driver.close_app()  
sleep(3)  
# 重新啟動(dòng)APP  
driver.launch_app()  
sleep(3)  
  
driver.quit()

這里計(jì)算器的包名和activity信息都配置在cap變量中。

殺死應(yīng)用進(jìn)程:

from appium import webdriver  
  
cap = {  
        "platformName": "Android",  
        "platformVersion": "5",  
        "deviceName": "192.168.42.103:5555",  
        "udid":"192.168.42.103:5555",  
        # 真機(jī)的  
        # "platformName": "Android",  
        # "platformVersion": "7.1.2",  
        # "deviceName": "10d4e4387d74",  
        "appPackage": "com.android.calculator2",  
        "appActivity": "com.android.calculator2.Calculato",  
        "noReset": True,  
        "unicodeKeyboard": True,  
        "resetkeyboard": True  
    }  
  
driver = webdriver.Remote('https://192.168.99.100:4723/wd/hub', cap)  
  
  
# 等待3秒  
sleep(3)  
# 如果應(yīng)用程序沒有運(yùn)行或正在后臺(tái)運(yùn)行,則激活該應(yīng)用程序  
driver.activate_app('com.android.calculator2')  
sleep(3)  
# 終止應(yīng)用程序  
driver.terminate_app('com.android.calculator2')  
sleep(3)  
driver.quit()

幾乎所有的移動(dòng)端應(yīng)用操作都可以編寫Python腳本進(jìn)行自動(dòng)化測(cè)試,我們可以將Appium理解為移動(dòng)端的Selenium,使用起來非常方便。

結(jié)語(yǔ):莎士比亞說過,“一千個(gè)觀眾眼中有一千個(gè)哈姆雷特”。而在千萬個(gè)Genymotion模擬器中,移動(dòng)App也可以是千萬種樣子,通過編寫Appium自動(dòng)化腳本就可以將測(cè)試人員將這千萬種的重復(fù)測(cè)試勞動(dòng)中解放出來,何樂而不為呢?

原文轉(zhuǎn)載自「劉悅的技術(shù)博客」 https://v3u.cn/a_id_196

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容