溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Monkey自動(dòng)化測(cè)試工具

發(fā)布時(shí)間:2020-06-30 13:14:04 來(lái)源:網(wǎng)絡(luò) 閱讀:5473 作者:wx5cef3cea13078 欄目:軟件技術(shù)

概述

MonkeyAndroid中的一個(gè)命令行工具,可以運(yùn)行在模擬器里或?qū)嶋H設(shè)備中。它向系統(tǒng)發(fā)送偽隨機(jī)的用戶事件流(如按鍵輸入、觸摸屏輸入、手勢(shì)輸入等),實(shí)現(xiàn)對(duì)正在開(kāi)發(fā)的應(yīng)用程序進(jìn)行壓力測(cè)試。Monkey測(cè)試是一種為了測(cè)試軟件的穩(wěn)定性、健壯性的快速有效的方法。Monkey自動(dòng)化測(cè)試工具是可視化操作的便利方式工具,提高使用性和效率。


設(shè)置monkey種子數(shù),延遲,執(zhí)行次數(shù)

-s <seed> 種子數(shù)作用:偽隨機(jī)數(shù)生成器的seed值。如果用相同的seed值再次運(yùn)行monkey,將生成相同的事件序列。

--throttle <milliseconds>延遲作用:在事件之間插入固定的時(shí)間(毫秒)延遲,你可以使用這個(gè)設(shè)置來(lái)減緩Monkey的運(yùn)行速度,如果你不指定這個(gè)參數(shù),則事件之間將沒(méi)有延遲,事件將以最快的速度生成。

-v 日志輸出等級(jí)作用:命令行上的每一個(gè)-v都將增加反饋信息的詳細(xì)級(jí)別。
簡(jiǎn)單(默認(rèn)),除了啟動(dòng)、測(cè)試完成和最終結(jié)果外只提供較少的信息。
中等,提供了較為詳細(xì)的測(cè)試信息,如逐個(gè)發(fā)送到Activity的事件信息。
復(fù)雜,提供了更多的設(shè)置信息,如測(cè)試中選中或未選中的Activity信息。

--ignore-crashes作用:通常,應(yīng)用發(fā)生崩潰或異常時(shí)Monkey會(huì)停止運(yùn)行。如果設(shè)置此項(xiàng),Monkey將繼續(xù)發(fā)送事件給系統(tǒng),直到事件計(jì)數(shù)完成。

--ignore-security-exception?作用:通常,當(dāng)程序發(fā)生許可錯(cuò)誤(例如啟動(dòng)一些需要許可的Activity)導(dǎo)致的異常時(shí),Monkey將停止運(yùn)行。設(shè)置此項(xiàng),Monkey將繼續(xù)發(fā)送事件給系統(tǒng),直到事件計(jì)數(shù)完成。


Monkey自動(dòng)化測(cè)試工具


讀取程序包,選擇需要測(cè)試的包名

-p <allowed-package-name> 程序包作用:如果你指定一個(gè)或多個(gè)包,Monkey將只允許訪問(wèn)這些包中的Activity。如果你的應(yīng)用程序需要訪問(wèn)這些包(如選擇聯(lián)系人)以外的Activity,你需要指定這些包。如果你不指定任何包,Monkey將允許系統(tǒng)啟動(dòng)所有包的Activity。指定多個(gè)包,使用多個(gè)-p,一個(gè)-p后面接一個(gè)包名。

點(diǎn)擊讀取程序包通過(guò)讀取data/data目錄下獲取所有的程序包名稱,首先需要將手機(jī)連接到PC,測(cè)試連接是否正常,可在cmd里輸入adb devices來(lái)進(jìn)行驗(yàn)證;因測(cè)試多針對(duì)一個(gè)特定的APP包,所以需要知道需要測(cè)試包的包名;也可以通過(guò)?adb shell pm list packages ?列出所有包名來(lái)進(jìn)行查找通過(guò)全部選擇快速選取所有的應(yīng)用包,通過(guò)全部取消取消已選項(xiàng)。


Monkey自動(dòng)化測(cè)試工具


查看log,生成Monkey log。

Monkey開(kāi)始,通過(guò)adb連接手機(jī),并運(yùn)行logcat,生成logcat到指定目錄。

一鍵monkey可以自動(dòng)生成默認(rèn)參數(shù),直接開(kāi)始monkey測(cè)試。


Monkey自動(dòng)化測(cè)試工具



Monkey的可視化界面是通過(guò)python 內(nèi)置的wx模塊來(lái)實(shí)現(xiàn),可以快速構(gòu)建UI界面。

軟件主界面的控件排布代碼:

1.????? MyFrame是整個(gè)窗體的主入口,通過(guò)實(shí)例化wx.Frame來(lái)顯示窗口

class MyFrame(wx.Frame):

?

??? //設(shè)置默認(rèn)delay時(shí)間值

delayDefault = "2"

//設(shè)置默認(rèn)種子數(shù)

seedDefault = "5000000"

//設(shè)置默認(rèn)執(zhí)行次數(shù)

??? executionFrequencyDefault = "60000000"

logDir = "./"

def __init__(self):

??? //執(zhí)行方式定義

??????? excuteMode = ["忽略程序崩潰",

??????????????????? "忽略程序無(wú)響應(yīng)",

??????????????????? "忽略安全異常",

??????????????????? "出錯(cuò)中斷程序",

??????????????????? "本地代碼導(dǎo)致的崩潰",

??????????????????? "默認(rèn)"

??????????????????? ]

?

??????? //日志輸出等級(jí)區(qū)分

??????? logMode = ["簡(jiǎn)單","普通","詳細(xì)"]

??????? executionModeDefault = excuteMode[0]

??? ??? //初始化菜單按鈕

??????? menuBar = wx.MenuBar()

??????? menu1 = wx.Menu("")

??????? menuBar.Append(menu1, "File")

??????? self.SetMenuBar(menuBar)

??????? //初始化標(biāo)簽欄

??????? wx.StaticText(panel, -1, "種子數(shù):", pos=(xPos, yPos))

??????? self.seedCtrl = wx.TextCtrl(panel, -1, "", pos=(xPos1, yPos))

??????? //綁定點(diǎn)擊事件

?????? ?self.seedCtrl.Bind(wx.EVT_KILL_FOCUS, self.OnAction)

??????? self.seedCtrl.SetFocus()

?

??????? //初始化標(biāo)簽欄

??????? wx.StaticText(panel, -1, "執(zhí)行次數(shù):", pos=(xPos, yPos+yDelta))

??????? //設(shè)置窗口位置

??????? self.excuteNumCtrl = wx.TextCtrl(panel, -1, "", pos=(xPos1, yPos+yDelta))

??????? //初始化標(biāo)簽欄

??????? wx.StaticText(panel, -1, "延時(shí):", pos=(xPos, yPos+2*yDelta))

??????? self.delayNumCtrl = wx.TextCtrl(panel, -1, "", pos=(xPos1, yPos+2*yDelta))

??????? //初始化標(biāo)簽欄???????

??????? wx.StaticText(panel, -1, "執(zhí)行方式:", pos=(xPos, yPos+3*yDelta))

??? ??? //設(shè)置窗口位置

??????? self.excuteModeCtrl = wx.ComboBox(panel, -1, "", (xPos1,yPos+3*yDelta), choices=excuteMode,style=wx.CB_DROPDOWN)

???????

//設(shè)置初始化checklistbox,下拉菜單

??????? self.checkListBox = wx.CheckListBox(panel, -1, (xPos, yPos+4*yDelta ), (400, 350), [])

??????? wx.StaticText(panel, -1, "日志輸出等級(jí):", pos=(xPos, yPoslayout-yDelta))

??????? self.logModeCtrl = wx.ComboBox(panel, -1, "", (xPos1,yPoslayout-yDelta), choices=logMode,style=wx.CB_DROPDOWN)

?

??????? //初始化按鈕,讀取程序包按鈕綁定readButton事件

??????? self.readButton = wx.Button(panel, -1, "讀取程序包", pos=(xPos, yPoslayout))

??????? self.Bind(wx.EVT_BUTTON, self.OnReadClick, self.readButton)

???? ???self.readButton.SetDefault()

?


??????? //初始化默認(rèn)參數(shù)按鈕,綁定defaultButton事件

??????? self.defaultButton = wx.Button(panel, -1, "默認(rèn)參數(shù)", pos=(xPos, yPoslayout+yDelta))

??????? self.Bind(wx.EVT_BUTTON, self.OnResetClick, self.defaultButton)

??????? self.defaultButton.SetDefault()

?

??????? //初始化一鍵monkey按鈕,按鈕綁定quick事件

??????? self.quickButton = wx.Button(panel, -1, "一鍵Monkey", pos=(xPos+120, yPoslayout+yDelta))

??????? self.Bind(wx.EVT_BUTTON, self.OnQuickStartClick, self.quickButton)

??????? self.quickButton.SetDefault()

?

2.????? 生成log代碼:

??? //生成log函數(shù)

??? def OnBuildLog(self,event):

??????? os.chdir(self.logDir)??

??????? //通過(guò)日期創(chuàng)建唯一標(biāo)識(shí)文件名稱

??????? date = time.strftime('%Y-%m-%d-%H-%M',time.localtime(time.time()))

??????? dir_m = "Monkey_Log_"+date.replace("-","")

??????? dir0 = "sdcard0_log"

??????? 創(chuàng)建目標(biāo)文件目錄

??????? if (os.path.exists(dir_m+"/"+dir0)):

??????????? print "already exists"

??????? else:

??????????? os.system("mkdir -p "+dir_m+"/"+dir0)

?

??????? os.chdir(dir_m)

??????? //通過(guò)adb命令導(dǎo)出log文件到目標(biāo)文件夾中

??????? os.system("adb pull /storage/sdcard0/log/ "+dir0)

??????? //查找異常log文件

??????? self.BuildFatalLog(os.getcwd())

?

??? //遍歷所有的log文件函數(shù)

def ListFiles(self,path):

??? //遍歷文件件

??????? for root,dirs,files in os.walk(path):

??????????? log_f = ""

??????????? for f in files:

??????????????? if(f.find("main") == 0):

??????????????????? log_f = f.strip()

??????????????????? //切換到目標(biāo)目錄

??????????????????? os.chdir(root)

??????????????????? //通過(guò)grep 命令查找所有的異常文件

??????????????????? if (log_f != ""):

??????????? grep_cmd="grep-Eni-B2-A20'FATAL|error|exception|system.err|androidruntime' "+log_f+" > "+log_f+"_fatal.log"

??????????? ????????????os.system(grep_cmd)

??? //查找異常文件函數(shù)

??? def BuildFatalLog(self,path):

??????? self.ListFiles(path)

?

3.????? 讀取程序包代碼分析:

//讀取程序包函數(shù)聲明

def OnReadClick(self, event):

??? //清空控件內(nèi)容

??????? self.checkListBox.Clear()

??????? //通過(guò)讀取手機(jī)data/data目錄來(lái)確認(rèn)所有的包名

??????? os.system("adb shell ls data/data > ~/log.log")

??????? //解析log.log文件

??????? home = os.path.expanduser('~')

??????? f = open(home+"/log.log", 'r')

??????? line = f.readline()

??????? while line:

??????????? line = f.readline()

??????????? if (line != ""):

??????????????? print "===="+line

??????????????? //將解析的包名,添加包名checkbox中顯示

??????????????? self.checkListBox.Append(line)

??????? f.close()


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI