使用python自動化測試,如何腳本監(jiān)控android設(shè)備上指定app的cpu和內(nèi)存呢?
最近正好自己用python寫了一個小工具,獲取android的一些性能指標,看是否能在做UI自動化的同時驗證一下app的性能,封裝了一些提取參數(shù)的方法僅供參考,里面包含了這幾項,都是通過用adb命令來實現(xiàn),下面說以下整個工具的運作流程。
相關(guān)庫準備:
-
wx-----------------wxpython用來產(chǎn)生圖形界面
-
gevent-------------線程
-
time---------------時間相關(guān)模塊
-
re-----------------正則表達式操作
-
multiprocessing----多進程
-
os-----------------處理文件和目錄
-
threading----------操作線程

第一步:獲取設(shè)備和app的基礎(chǔ)參數(shù)
1、檢查設(shè)備是否存在
def get_devices(self):
devices = []
result = subprocess.Popen("adb devices", shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE).stdout.readlines()
if len(result) - 2 == 1:
for line in result[1:]:
devices.append(line.strip().decode())
return devices[0].split()[0]
else:
return 'No device found'
2、獲取packagename
def getpackagename(self):
pattern = re.compile(r"[a-zA-Z0-9.]+/.[a-zA-Z0-9.]+")
package = subprocess.Popen("adb shell dumpsys activity | findstr mFocusedActivity", shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.read()
package = (str(package))
packagename = pattern.findall(package)[0].split('/')[0]
return packagename
3、獲取activity
def getactivity(self):
pattern = re.compile(r"[a-zA-Z0-9.]+/.[a-zA-Z0-9.]+")
package = subprocess.Popen("adb shell dumpsys activity | findstr mFocusedActivity", shell=True stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.read()
package = (str(package))
activity = pattern.findall(package)[0].split('/')[1]
print(activity)
return activity
第二步:設(shè)置定時時間
設(shè)置定時時間,多長時間間隔獲取一次數(shù)據(jù),并將數(shù)據(jù)動態(tài)展示在圖形界面,也可以將數(shù)據(jù)存在Excle或做出圖形更直觀(打算后期實現(xiàn))
第三步:通過基礎(chǔ)參數(shù)拼接獲取其他信息
1、獲取內(nèi)存
mem_list = []
def mem(self):
cmd = 'adb -s ' + self.get_devices() + ' shell dumpsys meminfo ' + self.getpackagename()
men_s = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.readlines()
for info in men_s:
if len(info.split()) > 0 and info.split()[0].decode() == "TOTAL":
self.mem_list.append((int(info.split()[1].decode()) // 1024))
men_list = str(info.split()[1].decode())
return self.mem_list
2、獲取cpu
cpu_list = []
def getcpu(self):
cmd = 'adb -s ' + self.get_devices() + ' shell top -n 1| findstr ' + self.getpackagename()
top_info = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.readlines()
if len(top_info) >= 1:
self.cpu_list.append(int(top_info[0].split()[2][0:-1]))
return self.cpu_list
3、獲取電量
def get_battery(self):
battery_cmd = "adb shell dumpsys battery"
batterys = []
battery_s = subprocess.Popen(battery_cmd, shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE).stdout.readlines()
battery= (battery_s[7].split())[1].decode()
return battery
4、獲取溫度
def get_temperature(self):
battery_cmd = "adb shell dumpsys battery"
battery_s = subprocess.Popen(battery_cmd, shell=True,stdout=subprocess.PIPE,
stderr=subprocess.PIPE).stdout.readlines()
temperature = str((int((battery_s[10].split())[1].decode())) * 0.1)
return temperature
5、啟動時間
def get_startime(self):
starttime_cmd = "adb shell am start -W -n XXXactivity"#XXXactivity可以從getactivity獲取
times = []
starttime_s = subprocess.Popen(starttime_cmd, shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE).stdout.readlines()
if (starttime_s[1].split())[1].decode() == 'ok':
statrtime = (starttime_s[5].split())[1].decode()
return statrtime
else:
return '啟動計時失敗'

上面的部分python代碼縮進格式可能會有問題,引用的時候需要注意,現(xiàn)在已實現(xiàn)了提取數(shù)據(jù)和在圖形界面展示的部分,至于上面為什么會引入進程和線程多個模塊,是因為這塊還沒有考慮好要怎么實現(xiàn)。

