APP自动化效果测试工具
1. 背景
項目測試過程中經常需要在手機端體驗語音產品的識別效果和穩定性,識別效果與手機硬件強相關無法拋開硬件影響。因此開發了一套基于uiautomator2+python UI自動化工具,可以實現在電腦端控制手機demo開始收音+播放待測音頻+保存識別結果的APP自動化效果測試工具。
2. uiautomator2安裝及介紹
uiautomator2是一個自動化測試開源工具,僅支持Android平臺的原生應用測試。它本來是Google提供的一個自動化測試的Java庫,后來發展了python-uiautomator2,封裝了谷歌自帶的uiautomator測試框架,提供便利的python接口,用它可以很便捷的編寫python腳本來實現app的自動化測試。uiautomator2 提供了點擊、長按、輸入文本、滑動、拖拽、截屏等方法,能夠模擬用戶的各種動作。用戶可以通過控件的 id 或 text 等屬性,定位到控件,從而對控件實施上述操作。
2.1 環境搭建
2.1.1 安裝adb
安裝adb并使手機與電腦連接(具體安裝自行百度)。 adb devices 查看連接設備。2.1.2 安裝uiautomator2
pip install --pre -U uiautomator22.1.3 設備安裝atx-agent
python -m uiautomator2 init (安裝包含httprpc服務的apk到手機)2.1.4 安裝weditor
基于瀏覽器技術的weditor UI查看器,方便抓取手機上應用的控件。
pip install --pre weditor(安裝) python -m weditor(運行)2.2 atx主要方法
2.2.1 設備連接
import uiautomator2 as u2d = u2.connect('192.168.1.169') #通過WIFI d = u2.connect_usb('123456f') #通過USB(手機的序列號可以通過adb devices獲取到,假設序列號是123456f)2.2.2 獲取當前包名
cmd界面輸入“uiautomator2 current ”,能獲取手機當前界面APP的包名、activity以及pid等相關信息,如下:{"package": "com.android.browser", "activity": "com.uc.browser.InnerUCMobile", "pid": 28478 }。
2.2.3 啟動/停止APP
//啟動 d.app_start("com.android.browser") #默認的這種方法是先通過atx-agent解析apk包的mainActivity,然后調用am start -n $package/$activity啟動 d.app_start("com.android.browser", use_monkey=True) #使用 monkey -p com.example.hello_world -c android.intent.category.LAUNCHER 1 啟動,這種方法有個副作用,自動會將手機的旋轉鎖定給關掉 //停止 d.app_stop("com.android.browser") d.app_clear('com.android.browser')2.2.4 元素定位方法
d(resourceId="com.smartisanos.clock:id/text_stopwatch").click() #ResourceId定位 d(text="發現").click() #Text定位 d(description="..").click() #Description定位 d(className="android.widget.TextView").click() #ClassName定位2.2.5 控件操作
d.click(x, y) #點擊 d.double_click(x, y) #雙擊 d.double_click(x, y, 0.1) # 兩次點擊時間間隔0.1秒 d.long_click(x, y) d.long_click(x, y, 0.5) # 點擊時間0.5秒,長按2.3 uiautomator2+python UI自動化測試框架簡介
python端:運行腳本,并向移動設備發送HTTP請求。移動設備:移動設備上運行了封裝了uiautomator2的HTTP服務,解析收到的請求,并轉化成uiautomator2的代碼,對被測程序進行相關操作。
3.實戰案例
3.1 手機計算器
以下以計算器為例,計算七加八并自動獲取計算結果。
#!/usr/bin/env python # -*- coding: utf-8 -*- import uiautomator2 as u2 import timeif __name__ == '__main__':d = u2.connect_usb("123456f") # 通過USB連接手機(手機的序列號可以通過adb devices獲取到,假設序列號是123456f)d.app_start("com.coloros.calculator") # 通過包名啟動手機計算器(不同手機計算器包名可能不同,需要修改)d(resourceId="com.coloros.calculator:id/digit_7").click() # resourceId定位法,點擊“7”d(resourceId="com.coloros.calculator:id/op_add").click() # 點擊“+”d(text="8").click() # text定位法,點擊“8”# d(resourceId="com.coloros.calculator:id/eq").click()d.click(0.829, 0.92) # 坐標定位法,找到“=”的坐標點,點擊“=”d(resourceId="com.coloros.calculator:id/result").get_text() #獲取result結果time.sleep(5)d.app_stop("com.coloros.calculator") #關閉手機計算器3.2 語音助手識別效果自動化測試
同時控制手機和音箱,配合模擬人與手機助手的語音交互并保存返回的識別結果
控制手機打開語音助手
def openAssistant()d = u2.connect_usb("手機序列號")d.app_start("包名", "activity", use_monkey=True) #啟動手機語音助手,需要通過語音助手包名啟動d.click(x, y) #通過坐標定位方法,點擊語音助手浮球,開啟語音助手交互播放測試音頻文件
# pcm音頻讀取 class PcmRead:def __init__(self, path, sampleRate, sampleSize, channelCount):self._i_opened_the_file = Noneif isinstance(path, str):f = open(path, 'rb')self._i_opened_the_file = f# else, assume it is an open file object alreadyself._framerate = sampleRateself._sampwidth = sampleSizeself._nchannels = channelCountself._nframes = os.path.getsize(path) // (sampleSize * channelCount);def __del__(self):self.close()def __enter__(self):return selfdef __exit__(self, *args):self.close()def close(self):file = self._i_opened_the_fileif file:self._i_opened_the_file = Nonefile.close()def getnchannels(self):return self._nchannelsdef getnframes(self):return self._nframesdef getsampwidth(self):return self._sampwidthdef getframerate(self):return self._frameratedef readframes(self, nframes):size = nframes * self._sampwidth * self._nchannels;data = self._i_opened_the_file.read(size);return data#播放音頻文件 def play(audioPath):if audioPath.endswith(".pcm"):wf = PcmRead(audioPath, "音頻采樣率", "采樣點大小,只支持2", "音頻聲道數")elif audioPath.endswith(".wav"):wf = wave.open(audioPath, 'rb')else:raise ValueError("invalid suffix")with wf:p = pyaudio.PyAudio()stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),channels=wf.getnchannels(),rate=wf.getframerate(),output=True)CHUNK = 1024data = wf.readframes(CHUNK)while b'' != data:stream.write(data)data = wf.readframes(CHUNK)stream.stop_stream()stream.close()p.terminate()4.可擴展領域
uiautomator2+python UI自動化測試框架,與selenium 和 unittest 的 Web UI自動化測試框架相類似,基于Android系統有屏設備的自動化測試解決方案,支持對被測設備的模擬點擊、截圖、獲取返回結果等功能。可用于所有Android帶屏設備的APP測試。
總結
以上是生活随笔為你收集整理的APP自动化效果测试工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 测试移动信号频率的软件,移动设备的FM测
- 下一篇: 电容麦克风测试软件,大家都在用的测试话筒