摘" 要:四川交通院自研的公路工程外業(yè)調(diào)查APP廣泛地用于一線(xiàn)外業(yè)勘測(cè)。由于軟件與機(jī)型及其機(jī)型版本適配的問(wèn)題,導(dǎo)致該軟件在不同的設(shè)備上可能會(huì)產(chǎn)生不同。針對(duì)該情況,發(fā)明一種能夠多機(jī)并行兼容性自動(dòng)化測(cè)試的方法。對(duì)于常用的3種Android手機(jī),給出具體的實(shí)現(xiàn)方法。通過(guò)該方法,大大縮短依次手動(dòng)測(cè)試需要的時(shí)間,避免重復(fù)且繁瑣的手工測(cè)試,保證軟件的質(zhì)量,縮短軟件開(kāi)發(fā)的周期。
關(guān)鍵詞:Pytest;兼容性測(cè)試;并行處理;自動(dòng)化測(cè)試;軟件開(kāi)發(fā)
中圖分類(lèi)號(hào):TP274 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):2095-2945(2025)11-0045-04
Abstract: The self-developed Highway Engineering Field Survey App by Sichuan Transportation Institute is widely used in frontline field surveys. Due to issues related to software compatibility with different device models and versions, the software may experience various problems on different devices. To address this, a method for parallel multi-device automated compatibility testing was invented. The specific implementation for three commonly used Android phones was provided. This method significantly reduces the time required for sequential manual testing, avoids repetitive and tedious manual testing, ensures software quality, and shortens the software development cycle.
Keywords: Pytest; compatibility testing; parallel processing; automated testing; software development
四川省交通勘察設(shè)計(jì)研究院有限公司自研的公路工程外業(yè)調(diào)查APP適用于各版本的Android手機(jī)系統(tǒng),但某些APP功能需針對(duì)不同的機(jī)型進(jìn)行程序適配,在華為手機(jī)上能正常運(yùn)行的功能,但小米手機(jī)上可能會(huì)無(wú)法正常使用,因此,需針對(duì)不同機(jī)型的Android手機(jī)依次進(jìn)行自動(dòng)化測(cè)試。每一種機(jī)型的手機(jī)單獨(dú)運(yùn)行測(cè)試用例耗時(shí)費(fèi)力。提供了一種并行兼容性測(cè)試的方法能夠同時(shí)在多種機(jī)型的手機(jī)上運(yùn)行測(cè)試用例,提高測(cè)試效率。
1" 問(wèn)題
四川交通設(shè)計(jì)院自研的公路工程外業(yè)調(diào)查APP廣泛地運(yùn)用與調(diào)查一線(xiàn),其累計(jì)用戶(hù)已達(dá)到4 000余人。據(jù)統(tǒng)計(jì),其使用的Android機(jī)型達(dá)100多種,常用機(jī)型30多種。
盡管在軟件測(cè)試過(guò)程中,已采用了自動(dòng)化測(cè)試的方式提高軟件的測(cè)試效率和測(cè)試質(zhì)量,并且取得了良好的收益。測(cè)試效率相比于手動(dòng)測(cè)試提高了80%,大大縮短了軟件開(kāi)發(fā)的周期。測(cè)試流程也做到了標(biāo)準(zhǔn)化、流程化和智能化。
但有的問(wèn)題依然存在。由于用戶(hù)使用機(jī)型繁多,會(huì)造成同一個(gè)功能在某些用戶(hù)的手機(jī)上能正常使用,而在另一些用戶(hù)的手機(jī)上出現(xiàn)問(wèn)題。這就需要拿到有代表性的樣機(jī)依次對(duì)已有功能進(jìn)行兼容性測(cè)試。盡管已有自動(dòng)化測(cè)試提高效率,但如果將十多個(gè)樣機(jī)依次插入電腦進(jìn)行測(cè)試,依然非常耗費(fèi)時(shí)間。且測(cè)試人員需一直守在電腦前,等一個(gè)樣機(jī)測(cè)試完畢后,更換另一個(gè)樣機(jī)進(jìn)行測(cè)試。
2" 解決方案
多機(jī)并行兼容性測(cè)試是指將若干個(gè)手機(jī)同時(shí)連接到電腦上,同時(shí)利用一套測(cè)試代碼在若干個(gè)手機(jī)上運(yùn)行測(cè)試用例,最后分別輸出測(cè)試報(bào)告。這種方式是傳統(tǒng)自動(dòng)化測(cè)試方式的進(jìn)階,不僅滿(mǎn)足了自動(dòng)化測(cè)試的要求,而且能夠同一時(shí)間在多個(gè)手機(jī)上進(jìn)行自動(dòng)化測(cè)試。針對(duì)此種解決方案,發(fā)明了一種基于Pytest的公路工程外業(yè)調(diào)查APP的兼容性測(cè)試方法,并且對(duì)于Android手機(jī)常用的測(cè)試場(chǎng)景給出了具體的實(shí)現(xiàn)方法。
3" Pytest簡(jiǎn)介
Pytest是一個(gè)強(qiáng)大的Python測(cè)試框架,用于編寫(xiě)和運(yùn)行測(cè)試用例。它廣泛應(yīng)用于單元測(cè)試、集成測(cè)試、功能測(cè)試等各類(lèi)測(cè)試場(chǎng)景。Pytest 的主要特點(diǎn)包括易用性、靈活性和豐富的插件生態(tài)系統(tǒng)。
Pytest提供了Fixture功能,用于在測(cè)試用例前后執(zhí)行準(zhǔn)備和清理操作。例如,數(shù)據(jù)庫(kù)連接、初始化數(shù)據(jù)、創(chuàng)建臨時(shí)文件等。Fixture可以設(shè)置不同的作用域,如函數(shù)級(jí)別、模塊級(jí)別或會(huì)話(huà)級(jí)別。
4" Appium Server簡(jiǎn)介
Appium Server 是一種用于自動(dòng)化測(cè)試移動(dòng)應(yīng)用程序的工具,它支持在 Android 和 iOS 平臺(tái)上進(jìn)行測(cè)試。作為一個(gè)開(kāi)源項(xiàng)目,Appium 允許開(kāi)發(fā)人員使用標(biāo)準(zhǔn)的 WebDriver 協(xié)議(與 Selenium 類(lèi)似)編寫(xiě)測(cè)試腳本,以便與移動(dòng)設(shè)備上的應(yīng)用程序進(jìn)行交互。Appium Server 接受客戶(hù)端發(fā)送的測(cè)試請(qǐng)求(命令),將這些請(qǐng)求翻譯成設(shè)備可執(zhí)行的動(dòng)作,并將執(zhí)行結(jié)果返回給客戶(hù)端。
5" 開(kāi)發(fā)環(huán)境搭建
本節(jié)主要介紹了Android SDK,JDK的環(huán)境配置,appium server的安裝配置,appium客戶(hù)端的安裝,pytest的安裝。Android SDK、JDK、Python的安裝配置只需根據(jù)安裝提示按流程進(jìn)行,不在本節(jié)進(jìn)行說(shuō)明。
5.1" Android JDK的環(huán)境配置
JDK是開(kāi)發(fā)人員運(yùn)用Java進(jìn)行開(kāi)發(fā)的核心工具包,它提供了Java開(kāi)發(fā)的一系列工具與環(huán)境。其中包括Java編譯器,Java開(kāi)發(fā)和運(yùn)行所需的環(huán)境。其中重要的環(huán)境例如Java類(lèi)庫(kù)、Java虛擬機(jī)、調(diào)試工具、打包工具和文檔生成工具。以此,是進(jìn)行Android端APP測(cè)試必不可少的程序。配置Java環(huán)境包含以下步驟。
Step1:右鍵“我的電腦”中的屬性,進(jìn)入高級(jí)系統(tǒng)設(shè)置后,點(diǎn)擊環(huán)境變量。
Step2:新建系統(tǒng)變量為JAVA_HOME,變量值輸入為jdk的安裝目錄。點(diǎn)擊“確定”,如圖1所示。
Step3:在系統(tǒng)變量中,找到Path變量,選中,進(jìn)行編輯。在Path中新建2個(gè)環(huán)境變量,分別為%JAVA_HOME\bin和%JAVA_HOME%\jre\bin。確保變量名字的大小寫(xiě)準(zhǔn)確,編寫(xiě)完畢,點(diǎn)擊確定,如圖2所示。
Step 4: JDK配置完成后,退出環(huán)境變量的配置頁(yè)面。
5.2" SDK 環(huán)境變量的配置
Android SDK包含了Android開(kāi)發(fā),調(diào)試,測(cè)試的一系列工具和包。這其中,本次測(cè)試使用的adb命令就包含在Android SDK中。Adb命令用于測(cè)試Android手機(jī)是否能夠與測(cè)試電腦正常通信,以及獲取設(shè)備的uuid值以尋求測(cè)試電腦與Andoid手機(jī)的正常通信等。
配置Android SDK的環(huán)境變量與配置JDK的步驟相類(lèi)似,都是通過(guò)在環(huán)境變量中新建ANDROID_HOME環(huán)境變量,然后在Path中加入SDK安裝目錄中執(zhí)行文件的路徑來(lái)實(shí)現(xiàn)的,以下是具體步驟。
Step1:右擊“我的電腦”,選擇“屬性”,進(jìn)入“高級(jí)系統(tǒng)設(shè)置”后,點(diǎn)擊“環(huán)境變量”。
Step2:進(jìn)入“環(huán)境變量”后,在“系統(tǒng)變量”中新建環(huán)境變量。變量名為ANDROID_HOME,變量值填寫(xiě)ANDROID_SDK的安裝主目錄,確保地址正確。設(shè)置好后點(diǎn)擊“確定”退出,如圖3所示。
Step3:在系統(tǒng)變量中,選中Path變量,進(jìn)行編輯。在Path中分別新建2個(gè)環(huán)境變量,分別為%ANDROI
D_HOME%\platform_tools和%ANDROID_HOME%\tools。新建好后,點(diǎn)擊“確定”保存并退出,如圖4所示。
Step 4:確認(rèn)所有配置完畢后,即可退出。
5.3" Appium-server的安裝配置
Step 1:首先,確保電腦上安裝有nodejs和npm。可通過(guò)命令進(jìn)行檢查,如圖5所示。若未安裝nodejs,可在官網(wǎng)上下載安裝nodejs,過(guò)程簡(jiǎn)單,此節(jié)不再贅述。
Step 2:使用npm安裝指定版本的appium-server,如圖6所示。
Step 3:安裝完成后,可使用一下命令檢查appium-server是否安裝成功,如圖7所示。
5.4" Appium客戶(hù)端的安裝
在IDE工具Pycharm命令行中,輸入 pip install appium-python-client==2.8.1安裝指定版本的appium客戶(hù)端。
5.5" pytest的安裝
在IDE工具Pycharm命令行中,輸入pip install pytest==7.2.2安裝指定版本的pytest。
6" 并行測(cè)試實(shí)例
為測(cè)試不同Android版本的手機(jī)存在的APP兼容性問(wèn)題,所用測(cè)試機(jī)分別為華為Mate 60,Android版本為12.0.1,小米14 Ultra,Android版本為13.0.1,華為mate40pro,Android版本為14.0.1。
測(cè)試開(kāi)始之前,將手機(jī)通過(guò)數(shù)據(jù)線(xiàn)連接到USB拓展塢,打開(kāi)手機(jī)的開(kāi)發(fā)者模式。通過(guò)adb命令測(cè)試是否所有手機(jī)已與測(cè)試電腦相連。
首次運(yùn)行,允許uiautomator2應(yīng)用安裝到測(cè)試機(jī)。
6.1" pool類(lèi)執(zhí)行多進(jìn)程并行操作
Multiprocessing 是 Python 的標(biāo)準(zhǔn)庫(kù)模塊,用于并行執(zhí)行任務(wù),以充分利用多核處理器的能力。
Pool 類(lèi)提供了一種便捷的方式來(lái)并行執(zhí)行函數(shù)調(diào)用。它允許將函數(shù)應(yīng)用于輸入數(shù)據(jù)的多個(gè)部分,并并行執(zhí)行這些調(diào)用。Pool 通過(guò)將多個(gè)進(jìn)程分配給不同的處理器核,以提高性能,尤其是在 CPU 密集型任務(wù)中,如圖8所示。
Run_parallel為啟動(dòng)測(cè)試的入口函數(shù),device_infos變量將各個(gè)設(shè)備的信息以列表嵌套字典的形式從內(nèi)存中讀取出來(lái),通過(guò)pool.map(run_parallel,device_infos),使得run_parallel函數(shù)分別讀取各個(gè)設(shè)備的信息。
以自定義命令行--cmdopt={device_info}傳入設(shè)備信息參數(shù),用作各個(gè)driver啟動(dòng)appium的基本數(shù)據(jù)。
6.2 DeviceInfo實(shí)例調(diào)用獲取所有設(shè)備的信息
在DeviceInfo類(lèi)中,編寫(xiě)adb命令獲取所有設(shè)備的udid,如圖9所示。
而后利用獲取到的每個(gè)udid循環(huán),獲取設(shè)備的其他信息,調(diào)用find_port函數(shù)和check_port函數(shù)設(shè)定好每個(gè)設(shè)備的port,bp_port,sys_port。最后將每個(gè)設(shè)備的信息以字典的形式存放入列表device_infomation當(dāng)中,如圖10、11所示。
6.3" cmdopt函數(shù)調(diào)用啟動(dòng)driver
在存放夾具的conftest全局文件中,通過(guò)鉤子函數(shù)pytest_addoption將--cmdopt設(shè)置為自定義命令行,并通過(guò)cmdopt函數(shù)獲取命令行選項(xiàng)的值,即device_info的值,并返回給調(diào)用者。最后驅(qū)動(dòng)器driver以cmdopt函數(shù)作為入?yún)?,入?yún)⒐﹩?dòng)appium和app的函數(shù)調(diào)用,如圖12所示。
6.4" BaseDriver啟動(dòng)appium和app
BaseDriver類(lèi)以傳入的cmdopt表達(dá)式作為參數(shù),在__init__方法中運(yùn)用啟動(dòng)appium,如圖13所示。然后調(diào)用get_base_driver()方法啟動(dòng)應(yīng)用程序,如圖14所示。
7" 結(jié)論
根據(jù)3種機(jī)型自動(dòng)化兼容性測(cè)試的實(shí)驗(yàn)結(jié)果,發(fā)現(xiàn)華為Nova12有2處未通過(guò)的測(cè)試是Mate60和小米14 Ultra所沒(méi)有的。
通過(guò)自動(dòng)化并行兼容性測(cè)試,有效地發(fā)現(xiàn)了因不同的機(jī)型導(dǎo)致的app部分功能失效。提高了測(cè)試效率,保證了軟件質(zhì)量。
參考文獻(xiàn):
[1] 王佳明,駱德漢.基于Monkeyrunner的Android應(yīng)用自動(dòng)化測(cè)試框架的研究[J].電腦知識(shí)與技術(shù)2019(15):234-236,245.
[2] 成靜,朱怡安,張濤,等.基于模型的移動(dòng)應(yīng)用兼容性測(cè)試方法研究[J].西北工業(yè)大學(xué)學(xué)報(bào),2015(2):337-341.
[3] 王玥,基于深度學(xué)習(xí)的回歸測(cè)試與兼容性測(cè)試的研究與實(shí)現(xiàn)[D]北京:北京郵電大學(xué),2024.