Android系統測試過程中,
比如接口測試,需要用到設備的iccid, 或者uuid,
車載測試需要用到VIN號(車輛唯一標識號),
4G測試等需要設計IMEI號等設備配置字參數等,
我們還可以讀取到設備的分辨率,emmc磁盤容量,
cpu型號,內存大小等,這些硬件配置信息,
可以輔助我們做測試,如何讀取到這些硬件信息呢?
準備階段
- adb shell getprop命令,可以獲取到Android設備iccid, imei,emmc磁盤容量等
- adb shell wm size 可以讀取到分辨率
- adb shell cat /proc/cpuinfo 可以讀取到cpu相關的信息
- adb shell cat /proc/meminfo 或adb shell free 可以讀取到內存相關的信息
- os.popen()函數可以快速調用以上命令並獲取輸出字符串。
- python的re正則表達式可以輕易地進行數據匹配,查找等強大的字符串處理
getprop命令介紹
getprop命令是android自帶的動態獲取系統屬性參數,
包括了軟件,硬件屬性參數等,其有好幾種執行方式,包括:
用法一: getprop 獲取全部系統屬性參數,
比如魅族Note5的getprop我們保存爲txt文件(可點擊下載)
用法二: getprop 屬性名,可獲取某個指定屬性的具體參數信息,比如:
相對應的,也有setprop命令是設置某個屬性的具體參數的,
測試一般不建議隨意設置屬性參數。
Python批處理腳本形式
# coding=utf-8
import os
import re
# 獲取iccid
try:
iccid_1 = os.popen("adb shell getprop persist.radio.cfu.iccid.0").read().strip()
iccid_2 = os.popen("adb shell getprop persist.radio.cfu.iccid.1").read().strip()
except:
iccid_1 = "Unknown"
iccid_2 = "Unknown"
print("iccid_1: %s" % iccid_1)
print("iccid_2: %s" % iccid_2)
# 獲取imei
try:
imei = os.popen("adb shell getprop ril.gsm.imei").read().strip().split(",")
except:
imei = ["Unknown", "Unknown"]
print("IMEI_1: %s" % imei[0])
print("IMEI_2: %s" % imei[1])
# 獲取EMMC磁盤容量
try:
emmc_size = os.popen("adb shell getprop vold.emmc_size").read().strip()
emmc_size = str(int(int(emmc_size) / 1024 / 1024 / 1024))
except Exception as e:
print(e)
emmc_size = "Unknown"
print("EMMC_Size: %s GB" % emmc)
# 獲取Android設備的內存容量大小
ram_size = os.popen("adb shell cat /proc/meminfo").read()
try:
ram_size = re.findall(r"MemTotal:(.*)", ram_size)[0].strip()
ram_size = re.sub("kB", "", ram_size)
ram_size = str(round(int(ram_size) / 1024 / 1024))
except Exception as e:
print(e)
ram_size = "Unknown"
print("RAM Size: %s GB" % ram_size)
# 獲取Android設備的CPU型號
cpu_profile = os.popen("adb shell cat /proc/cpuinfo").read()
try:
cpu_profile = re.findall(r"Hardware\s+:(.*)", cpu_profile)[0].strip()
except:
cpu_profile = "Unknown"
print("CPU Profile: %s" % cpu_profile)
# 獲取Android設備的分辨率
resolution = os.popen("adb shell wm size").read()
resolution = resolution.split(":")[1].strip()
print("Resolution: %s" % resolution)
os.system("pause")
try …
except Exception as e 是用來做調試用的,
即當出現常規異常的時候,print(e)顯示報錯內容,
且當出現異常時,相應的硬件信息將賦值爲“Unknown”,
有利於提高程序的健壯性!
Python面向過程函數形式
本次進行改進:
- os.popen(“命令”).read()用的太多了,我們需要考慮封裝成一個函數。
- 獲取各類硬件設備配置的語句塊,分別獨立做成一個個的函數。
# coding=utf-8
import os
import re
# 獨立一個get_popen執行命令並獲取其輸出字符串
def get_popen(command):
p_str = os.popen("%s" % command).read()
return p_str.strip()
def get_iccid(): # 獲取iccid
try:
iccid_1 = get_popen("adb shell getprop persist.radio.cfu.iccid.0")
iccid_2 = get_popen("adb shell getprop persist.radio.cfu.iccid.1")
except:
iccid_1 = "Unknown"
iccid_2 = "Unknown"
return iccid_1, iccid_2
def get_imei(): # 獲取imei
try:
imei = get_popen("adb shell getprop ril.gsm.imei").split(",")
except:
imei = ["Unknown", "Unknown"]
return imei
def get_emmc_size(): # 獲取EMMC磁盤容量
try:
emmc_size =get_popen("adb shell getprop vold.emmc_size")
emmc_size = str(int(int(emmc_size) / 1024 / 1024 / 1024))
except:
emmc_size = "Unknown"
return emmc_size
def get_ram_size(): # 獲取Android設備的內存容量大小
ram_size = get_popen("adb shell cat /proc/meminfo")
try:
ram_size = re.findall(r"MemTotal:(.*)", ram_size)[0].strip()
ram_size = re.sub("kB", "", ram_size)
ram_size = str(round(int(ram_size) / 1024 / 1024))
except:
ram_size = "Unknown"
return ram_size
def get_cpu_profile(): # 獲取Android設備的CPU型號
cpu_profile = get_popen("adb shell cat /proc/cpuinfo")
try:
cpu_profile = re.findall(r"Hardware\s+:(.*)", cpu_profile)[0].strip()
except:
cpu_profile = "Unknown"
return cpu_profile
def get_resolution(): # 獲取Android設備的分辨率
resolution = get_popen("adb shell wm size")
resolution = resolution.split(":")[1].strip()
return resolution
iccid_1, iccid_2 = get_iccid()
imei = get_imei()
emmc_size = get_emmc_size()
ram_size = get_ram_size()
cpu_profile = get_cpu_profile()
resolution = get_resolution()
print("iccid_1: %s" % iccid_1)
print("iccid_2: %s" % iccid_2)
print("IMEI_1: %s" % imei[0])
print("IMEI_2: %s" % imei[1])
print("EMMC_Size: %s GB" % emmc_size)
print("RAM Size: %s GB" % ram_size)
print("CPU Profile: %s" % cpu_profile)
print("Resolution: %s" % resolution)
os.system("pause")
面向對象類的形式
- 以"萬物皆可歸類"的思想, 先抽象化出一個類來,
類名一般建議用"名詞", 所以我們命名爲"HWInfoGetter",
代表硬件信息獲取器, 且一般要駝峯式(首字母大寫)來規範類的命名。 - 養成良好的類的初始化(__init__)的習慣,
初始化過程中, 可以初始化7個屬性(變量),類範圍內可隨意調用 - 細化各不同硬件信息獲取的函數
- 類是一個抽象的事物, 必須實例化成具體的對象後,
才能進行調用, 所以我們實例化並命名成了h_obj, 表明是一個對象。 - 實例化成具體對象後, 對象就可以調用這個類裏邊的各個函數了
# coding=utf-8
import os
import re
# 獨立一個get_popen執行命令並獲取其輸出字符串
def get_popen(command):
p_str = os.popen("%s" % command).read()
return p_str.strip()
class HWInfoGetter():
def __init__(self):
self.iccid_1 = None
self.iccid_2 = None
self.imei = None
self.emmc_size = None
self.ram_size = None
self.cpu_profile = None
self.resolution = None
def get_iccid(self): # 獲取iccid
try:
self.iccid_1 = get_popen("adb shell getprop persist.radio.cfu.iccid.0")
self.iccid_2 = get_popen("adb shell getprop persist.radio.cfu.iccid.1")
except:
self.iccid_1 = "Unknown"
self.iccid_2 = "Unknown"
return self.iccid_1, self.iccid_2
def get_imei(self): # 獲取imei
try:
self.imei = get_popen("adb shell getprop ril.gsm.imei").split(",")
except:
self.imei = ["Unknown", "Unknown"]
return self.imei
def get_emmc_size(self): # 獲取EMMC磁盤容量
try:
self.emmc_size = get_popen("adb shell getprop vold.emmc_size")
self.emmc_size = str(int(int(emmc_size) / 1024 / 1024 / 1024))
except:
self.emmc_size = "Unknown"
return self.emmc_size
def get_ram_size(self): # 獲取Android設備的內存容量大小
self.ram_size = get_popen("adb shell cat /proc/meminfo")
try:
self.ram_size = re.findall(r"MemTotal:(.*)", self.ram_size)[0].strip()
self.ram_size = re.sub("kB", "", self.ram_size)
self.ram_size = str(round(int(self.ram_size) / 1024 / 1024))
except:
self.ram_size = "Unknown"
return self.ram_size
def get_cpu_profile(self): # 獲取Android設備的CPU型號
cpu_profile = get_popen("adb shell cat /proc/cpuinfo")
try:
self.cpu_profile = re.findall(r"Hardware\s+:(.*)", cpu_profile)[0].strip()
except:
self.cpu_profile = "Unknown"
return self.cpu_profile
def get_resolution(self): # 獲取Android設備的分辨率
self.resolution = get_popen("adb shell wm size")
self.resolution = self.resolution.split(":")[1].strip()
return self.resolution
if __name__ == '__main__':
h_obj = HWInfoGetter()
iccid_1, iccid_2 = h_obj.get_iccid()
imei = h_obj.get_imei()
emmc_size = h_obj.get_emmc_size()
ram_size = h_obj.get_ram_size()
cpu_profile = h_obj.get_cpu_profile()
resolution = h_obj.get_resolution()
print("iccid_1: %s" % iccid_1)
print("iccid_2: %s" % iccid_2)
print("IMEI_1: %s" % imei[0])
print("IMEI_2: %s" % imei[1])
print("EMMC_Size: %s GB" % emmc_size)
print("RAM Size: %s GB" % ram_size)
print("CPU Profile: %s" % cpu_profile)
print("Resolution: %s" % resolution)
os.system("pause")
代碼運行方式
確保Android車機設備通過USB線與電腦連接了,adb設備有效連接,
以上代碼的3種實現形式都可以直接運行,比如保存爲get_hw_info.py並放在桌面,
每次需要獲取系統版本信息的時候,雙擊運行get_hw_info.py,
運行效果如下(以魅族Note5爲例),
對比如下:
更多更好的原創文章,請訪問官方網站:www.zipython.com
自拍教程(自動化測試Python教程,武散人編著)
原文鏈接:https://www.zipython.com/#/detail?id=fdbe5cbccbb4400b959716226643367d
也可關注“武散人”微信訂閱號,隨時接受文章推送。