monkey 進階使用手冊,monkey隨機測試后怎么定位問題


首先我們知道使用monkey后,我們可以查看三種類型的日志,一種是安卓內核日志,一種是安卓系統自己的日志,還有一種是monkey日志。
當我們使用monkey進行隨機測試時,如何才知道我們這次隨機測試是否有問題。
 
1.使用命令產生隨機事件
adb shell monkey -p vchat.faceme -v  100    簡單adb命令,執行100次隨機事件並輸出簡單日志
完整mokey命令:
 adb shell monkey -p vchat.faceme  --throttle 1000 -s 100 -v -v 500000 >C:\Users\admin\Downloads\TESTER\monkey_log\java_monkey_log.txt
 
monkey日志可以導入到text文件中自己查看,同事安卓的內核和系統日志可以在monkey結束后,自己使用adb logcat命令來查看
 
2.查看monkey日志

1.程序無響應,ANR問題:在日志中搜索“ANR”
2.崩潰問題:在日志中搜索“CRASH”

3.其他問題:在日志中搜索”Exception”

搜索了一下,發現無1,2問題,但又一個Exception異常

Got IOException performing flipjava.io.IOException: write failed: EINVAL (Invalid argument) 
// Injection Failed

百度后,發現別人這樣解釋的:monkey發送各種事件操作app,中間有一個io異常,但是並沒有堆棧,所以沒有任何意義。

如果在這里發現monkey崩潰日志,應該要看monkey當時執行了什么事情,自己手動執行看看是否出現,如果不出現,再次使用相同的seed和相同的頁面,再次啟動app monkey再來一次隨機測試,如果沒有出現,證明次問題是偶然性問題。

3.adb logcat查看安卓日志

記得只查看並過濾自己操作的app日志,不過在屏幕上輸出並不好找出問題,最好把它輸出到text文件再查看

命令如下:

adb logcat  -v time | findstr vchat.faceme >C:\Users\admin\Downloads\TESTER\monkey_log\andriod_log.txt

一樣的搜索關鍵字ANR/CRASH/Exception 查看日志異常

搜索到一個崩潰和一個異常:

08-13 11:09:27.658 D/CrashReport(15779): >>> vchat.faceme.ui.personal.PersonalSettingActivity onResumed <<<

08-12 20:12:20.073 D/Error   ( 4763): ERR: stack=android.util.Log$TerribleFailure: {"ptid":"4763-1*","stack":"java.lang.NumberFormatException: Invalid long: \"gp-500108\"\\n\tat java.lang.Long.invalidLong(Long.java:124)\\n\tat java.lang.Long.parse(Long.java:363)\\n\tat java.lang.Long.parseLong(Long.java:353)\\n\tat java.lang.Long.parseLong(Long.java:321)\\n\tat vchat.common.util.IMDecodeUtil.decodeContactByTargetId(IMDecodeUtil.java:96)\\n\tat vchat.faceme.message.adapter.MessageListAdapter.convert(MessageListAdapter.java:65)\\n\tat vchat.faceme.message.adapter.MessageListAdapter.convert(MessageListAdapter.java:47)\\n\tat com.chad.library.adapter.base.BaseQuickAdapter.onBindViewHolder(BaseQuickAdapter.java:937)\\n\tat com.chad.library.adapter.base.BaseQuickAdapter.onBindViewHolder(BaseQuickAdapter.java:66)\\n\tat androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6890)\\n\tat androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6932)\\n\tat androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5852)\\n\tat androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6119)\\n\tat androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5958)\\n\tat androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5954)\\n\tat androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2226)\\n\tat androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)\\n\tat androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)\\n\tat androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)\\n\tat androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3990)\\n\tat androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3402)\\n\tat android.view.View.measure(View.java:18831)\\n\tat androidx.constraintlayout.widget.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:1248)\\n\tat androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1593)\\n\tat android.view.View.measure(View.java:18831)\\n\tat vchat.common.widget.MyDrawerLayout.onMeasure(MyDrawerLayout.java:1115)\\n\tat android.view.View.measure(View.java:18831)\\n\tat androidx.constraintlayout.widget.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:1248)\\n\tat androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1593)\\n\tat android.view.View.measure(View.java:18831)\\n\tat android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5990)\\n\tat android.widget.FrameLayout.onMeasure(FrameLayout.java:194)\\n\tat androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)\\n\tat android.view.View.measure(View.java:18831)\\n\tat android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5990)\\n\tat android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)\\n\tat android.widget.LinearLayout.measureVertical(LinearLayout.java:748)\\n\tat android.widget.LinearLayout.onMeasure(LinearLayout.java:630)\\n\tat android.view.View.measure(View.java:18831)\\n\tat android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5990)\\n\tat android.widget.FrameLayout.onMeasure(FrameLayout.java:194)\\n\tat android.view.View.measure(View.java:18831)\\n\tat android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5990)\\n\tat android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)\\n\tat android.widget.LinearLayout.measureVertical(LinearLayout.java:748)\\n\tat android.widget.LinearLayout.onMeasure(LinearLayout.java:630)\\n\tat android.view.View.measure(View.java:18831)\\n\tat android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5990)\\n\tat android.widget.FrameLayout.onMeasure(FrameLayout.java:194)\\n\tat com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:26

出現了一個崩潰異常,給開發反饋后,開發果然知道是出現了什么問題,然后正在看,對我來說,合適蠻有成就感的哈哈哈

 

停止monkey的辦法:

 

注意 Monkey啟動后會不斷地向被測對象發送隨機事件流,直到事件執行完畢或者發生異常時才停止。在Monkey運行過程中,即便斷開 與PC的連接,Monkey依然可以在手機上繼續運行。

停止Monkey的方法是:直接殺掉手機上的Monkey進程。具體方法如下:

adb shell 進入腳本界面

shell界面輸入

ps |grep monkey

獲取到com.android.commands.monkey的進程ID

 kill pid進程號

 

使用monkey查看app是否有內存泄露:

 adb shell monkey -p vchat.faceme --pct-touch 100  --throttle 1000 -s 100 -v -v 50 >C:\Users\admin\Downloads\TESTER\monkey_log\java_monkey_log.txt

 

adb shell 查看進程內存

dumpsys meminfo  后面有點難,后面再看好了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM