您好,登錄后才能下訂單哦!
Monkey是Android中的一個命令行工具,可以運行在模擬器里或實際設備中。它向系統發送偽隨機的用戶事件流(如按鍵輸入、觸摸屏輸入、手勢輸入等),實現對正在開發的應用程序進行壓力測試。Monkey測試是一種為了測試軟件的穩定性、健壯性的快速有效的方法。Monkey自動化測試工具是可視化操作的便利方式工具,提高使用性和效率。
-s <seed> 種子數作用:偽隨機數生成器的seed值。如果用相同的seed值再次運行monkey,將生成相同的事件序列。
--throttle <milliseconds>延遲作用:在事件之間插入固定的時間(毫秒)延遲,你可以使用這個設置來減緩Monkey的運行速度,如果你不指定這個參數,則事件之間將沒有延遲,事件將以最快的速度生成。
-v 日志輸出等級作用:命令行上的每一個-v都將增加反饋信息的詳細級別。
簡單(默認),除了啟動、測試完成和最終結果外只提供較少的信息。
中等,提供了較為詳細的測試信息,如逐個發送到Activity的事件信息。
復雜,提供了更多的設置信息,如測試中選中或未選中的Activity信息。
--ignore-crashes作用:通常,應用發生崩潰或異常時Monkey會停止運行。如果設置此項,Monkey將繼續發送事件給系統,直到事件計數完成。
--ignore-security-exception?作用:通常,當程序發生許可錯誤(例如啟動一些需要許可的Activity)導致的異常時,Monkey將停止運行。設置此項,Monkey將繼續發送事件給系統,直到事件計數完成。
-p <allowed-package-name> 程序包作用:如果你指定一個或多個包,Monkey將只允許訪問這些包中的Activity。如果你的應用程序需要訪問這些包(如選擇聯系人)以外的Activity,你需要指定這些包。如果你不指定任何包,Monkey將允許系統啟動所有包的Activity。指定多個包,使用多個-p,一個-p后面接一個包名。
點擊讀取程序包通過讀取data/data目錄下獲取所有的程序包名稱,首先需要將手機連接到PC,測試連接是否正常,可在cmd里輸入adb devices來進行驗證;因測試多針對一個特定的APP包,所以需要知道需要測試包的包名;也可以通過?adb shell pm list packages ?列出所有包名來進行查找通過全部選擇快速選取所有的應用包,通過全部取消取消已選項。
Monkey開始,通過adb連接手機,并運行logcat,生成logcat到指定目錄。
一鍵monkey可以自動生成默認參數,直接開始monkey測試。
Monkey的可視化界面是通過python 內置的wx模塊來實現,可以快速構建UI界面。
軟件主界面的控件排布代碼:
1.????? MyFrame是整個窗體的主入口,通過實例化wx.Frame來顯示窗口
class MyFrame(wx.Frame):
?
??? //設置默認delay時間值
delayDefault = "2"
//設置默認種子數
seedDefault = "5000000"
//設置默認執行次數
??? executionFrequencyDefault = "60000000"
logDir = "./"
def __init__(self):
??? //執行方式定義
??????? excuteMode = ["忽略程序崩潰",
??????????????????? "忽略程序無響應",
??????????????????? "忽略安全異常",
??????????????????? "出錯中斷程序",
??????????????????? "本地代碼導致的崩潰",
??????????????????? "默認"
??????????????????? ]
?
??????? //日志輸出等級區分
??????? logMode = ["簡單","普通","詳細"]
??????? executionModeDefault = excuteMode[0]
??? ??? //初始化菜單按鈕
??????? menuBar = wx.MenuBar()
??????? menu1 = wx.Menu("")
??????? menuBar.Append(menu1, "File")
??????? self.SetMenuBar(menuBar)
??????? //初始化標簽欄
??????? wx.StaticText(panel, -1, "種子數:", pos=(xPos, yPos))
??????? self.seedCtrl = wx.TextCtrl(panel, -1, "", pos=(xPos1, yPos))
??????? //綁定點擊事件
?????? ?self.seedCtrl.Bind(wx.EVT_KILL_FOCUS, self.OnAction)
??????? self.seedCtrl.SetFocus()
?
??????? //初始化標簽欄
??????? wx.StaticText(panel, -1, "執行次數:", pos=(xPos, yPos+yDelta))
??????? //設置窗口位置
??????? self.excuteNumCtrl = wx.TextCtrl(panel, -1, "", pos=(xPos1, yPos+yDelta))
??????? //初始化標簽欄
??????? wx.StaticText(panel, -1, "延時:", pos=(xPos, yPos+2*yDelta))
??????? self.delayNumCtrl = wx.TextCtrl(panel, -1, "", pos=(xPos1, yPos+2*yDelta))
??????? //初始化標簽欄???????
??????? wx.StaticText(panel, -1, "執行方式:", pos=(xPos, yPos+3*yDelta))
??? ??? //設置窗口位置
??????? self.excuteModeCtrl = wx.ComboBox(panel, -1, "", (xPos1,yPos+3*yDelta), choices=excuteMode,style=wx.CB_DROPDOWN)
???????
//設置初始化checklistbox,下拉菜單
??????? self.checkListBox = wx.CheckListBox(panel, -1, (xPos, yPos+4*yDelta ), (400, 350), [])
??????? wx.StaticText(panel, -1, "日志輸出等級:", 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()
?
??????? //初始化默認參數按鈕,綁定defaultButton事件
??????? self.defaultButton = wx.Button(panel, -1, "默認參數", 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函數
??? def OnBuildLog(self,event):
??????? os.chdir(self.logDir)??
??????? //通過日期創建唯一標識文件名稱
??????? date = time.strftime('%Y-%m-%d-%H-%M',time.localtime(time.time()))
??????? dir_m = "Monkey_Log_"+date.replace("-","")
??????? dir0 = "sdcard0_log"
??????? 創建目標文件目錄
??????? if (os.path.exists(dir_m+"/"+dir0)):
??????????? print "already exists"
??????? else:
??????????? os.system("mkdir -p "+dir_m+"/"+dir0)
?
??????? os.chdir(dir_m)
??????? //通過adb命令導出log文件到目標文件夾中
??????? os.system("adb pull /storage/sdcard0/log/ "+dir0)
??????? //查找異常log文件
??????? self.BuildFatalLog(os.getcwd())
?
??? //遍歷所有的log文件函數
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()
??????????????????? //切換到目標目錄
??????????????????? os.chdir(root)
??????????????????? //通過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)
??? //查找異常文件函數
??? def BuildFatalLog(self,path):
??????? self.ListFiles(path)
?
3.????? 讀取程序包代碼分析:
//讀取程序包函數聲明
def OnReadClick(self, event):
??? //清空控件內容
??????? self.checkListBox.Clear()
??????? //通過讀取手機data/data目錄來確認所有的包名
??????? 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()
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。