Android 自動化測試 - Monkey Event(事件)來源

Monkey 事件簡介

Monkey 通過注入事件來對手機或者模擬器進行操作柏肪,根據Monkey源碼.
Monkey的事件來源有三種

  • MonkeySourceScript
    Monkey 腳本文件草戈,通過參數 -f 添加
  • MonkeySourceNetwork 统捶, 通過參數--port控制
    服務器控制的monkey文件
  • MonkeySourceRandom
    隨機生成的Monkey 事件哆窿,大多數人常用的那種

Monkey Script腳本

通過參數 -f 配置 Script ,可以配置多個腳本,如果沒有配置--randomize-script 參數,則按照順序執(zhí)行康谆,否則,隨機執(zhí)行腳本嫉到。
如果配置了多個(>1)腳本,那么可以配置--setup 參數月洛,后面緊跟一個腳本何恶。 這個腳本保證是第一個運行的。

Monkey 服務器控制

Monkey 隨機事件

Monkey 隨機事件類型有12種嚼黔。分別為

    public static final int FACTOR_TOUCH        = 0;
    public static final int FACTOR_MOTION       = 1;
    public static final int FACTOR_PINCHZOOM    = 2;
    public static final int FACTOR_TRACKBALL    = 3;
    public static final int FACTOR_ROTATION     = 4;
    public static final int FACTOR_PERMISSION   = 5;
    public static final int FACTOR_NAV          = 6;
    public static final int FACTOR_MAJORNAV     = 7;
    public static final int FACTOR_SYSOPS       = 8;
    public static final int FACTOR_APPSWITCH    = 9;
    public static final int FACTOR_FLIP         = 10;
    public static final int FACTOR_ANYTHING     = 11;

按照種子數生成的Random,生成[0,1]之間的隨機數细层。按照隨機數的大小和各個類型占用的比例進行比較惜辑,生成事件。

   if (cls < mFactors[FACTOR_TOUCH]) {
            generatePointerEvent(mRandom, GESTURE_TAP);
            return;
        } else if (cls < mFactors[FACTOR_MOTION]) {
            generatePointerEvent(mRandom, GESTURE_DRAG);
            return;
        } else if (cls < mFactors[FACTOR_PINCHZOOM]) {
            generatePointerEvent(mRandom, GESTURE_PINCH_OR_ZOOM);
            return;
        } else if (cls < mFactors[FACTOR_TRACKBALL]) {
            generateTrackballEvent(mRandom);
            return;
        } else if (cls < mFactors[FACTOR_ROTATION]) {
            generateRotationEvent(mRandom);
            return;
        } else if (cls < mFactors[FACTOR_PERMISSION]) {
            mQ.add(mPermissionUtil.generateRandomPermissionEvent(mRandom));
            return;
        }

        // The remaining event categories are injected as key events
        for (;;) {
            if (cls < mFactors[FACTOR_NAV]) {
                lastKey = NAV_KEYS[mRandom.nextInt(NAV_KEYS.length)];
            } else if (cls < mFactors[FACTOR_MAJORNAV]) {
                lastKey = MAJOR_NAV_KEYS[mRandom.nextInt(MAJOR_NAV_KEYS.length)];
            } else if (cls < mFactors[FACTOR_SYSOPS]) {
                lastKey = SYS_KEYS[mRandom.nextInt(SYS_KEYS.length)];
            } else if (cls < mFactors[FACTOR_APPSWITCH]) {
                MonkeyActivityEvent e = new MonkeyActivityEvent(mMainApps.get(
                        mRandom.nextInt(mMainApps.size())));
                mQ.addLast(e);
                return;
            } else if (cls < mFactors[FACTOR_FLIP]) {
                MonkeyFlipEvent e = new MonkeyFlipEvent(mKeyboardOpen);
                mKeyboardOpen = !mKeyboardOpen;
                mQ.addLast(e);
                return;
            } else {   //FACTOR_ANYTHING
                lastKey = 1 + mRandom.nextInt(KeyEvent.getMaxKeyCode() - 1);
            }

            if (lastKey != KeyEvent.KEYCODE_POWER
                    && lastKey != KeyEvent.KEYCODE_ENDCALL
                    && lastKey != KeyEvent.KEYCODE_SLEEP
                    && lastKey != KeyEvent.KEYCODE_SOFT_SLEEP
                    && PHYSICAL_KEY_EXISTS[lastKey]) {
                break;
            }
        }

怎么生成事件

  • generationPointerEvent(Random random, int gesture)
    隨機生成一個點p1疫赎,然后生成一個x,y在[-25,25]范圍類的點盛撑,monkey 隊列中先加入p1 的按下事件。
    如果手勢是GESTURE_DRAG(拉動)捧搞,那么會生成[0,10)個數的MotionEvent.ACTION_MOVE事件抵卫。然后生成MotionEvent.ACTION_UP事件。
    如果手勢是GESTURE_PINCH_OR_ZOOM(放大或縮小)胎撇, 那么先會生成MotionEvent.ACTION_POINTER_DOWN事件介粘,表示第二根手指按下。然后生成[0,10)個數的MotionEvent.ACTION_MOVE事件晚树,然后再生成MotionEvent.ACTION_POINTER_UP事件姻采,表示第二根手指抬起。最后再生成MotionEvent.ACTION_UP事件爵憎。
    如果手勢不屬于以上兩種慨亲,則直接生成MotionEvent.ACTION_UP事件。

  • generateTrackballEvent(Random random)
    首先宝鼓,什么是TrackBallEvent刑棵,在第一代Android 手機如HTC Dream手機上有一個移動球(如下圖中menu下面的圓球),像ThinkPad 鍵盤上面那個紅色按鈕那樣席函,可以用來移動☆硗現在的手機上已經看不到了這個按鈕了。


    timg.jpeg
  • generateRotationEvent(Random random)
    生成旋轉事件

  • generateRandomPermissionEvent(mRandom)
    首先先判斷app需要哪些權限(Android 6.0以后)茂附,然后生成隨機的PermissionEvent, 來取消(revoke)或者授予(grant)app權限正蛙。

  • NAV_KEYS
    包括KeyEvent.KEYCODE_DPAD_UP, KeyEvent.KEYCODE_DPAD_DOWN, KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.KEYCODE_DPAD_RIGHT,代表鍵盤上的上下左右鍵营曼。


    左鍵
  • MAJOR_NAV_KEYS
    包括兩個鍵 KeyEvent.KEYCODE_MENU和KeyEvent.KEYCODE_DPAD_CENTER鍵乒验。KeyEvent.KEYCODE_MENU是指菜單鍵,KeyEvent.KEYCODE_DPAD_CENTER 是指鍵盤上的中鍵蒂阱。 下圖所示锻全,即為中鍵。


    中鍵
  • SYS_KEY
    其中包括KeyEvent.KEYCODE_HOME, KeyEvent.KEYCODE_BACK,KeyEvent.KEYCODE_CALL, KeyEvent.KEYCODE_ENDCALL,KeyEvent.KEYCODE_VOLUME_UP,KeyEvent.KEYCODE_VOLUME_DOWN, KeyEvent.KEYCODE_VOLUME_MUTE,KeyEvent.KEYCODE_MUTE录煤。 Monkey會判斷測試機是否有這些KeyEvent. 如果沒有鳄厌,則會再隨機取一個,直到取到了有的鍵值妈踊。

    • KeyEvent.KEYCODE_HOME 了嚎, HOME鍵
    • KeyEvent.KEYCODE_BACK , BACK鍵
    • KeyEvent.KEYCODE_CALL , 撥打電話鍵
    • KeyEvent.KEYCODE_ENDCALL歪泳, 結束通話
    • KeyEvent.KEYCODE_VOLUME_UP 萝勤,增加音量
    • KeyEvent.KEYCODE_VOLUME_DOWN, 減少音量
    • KeyEvent.KEYCODE_VOLUME_MUTE呐伞, 揚聲器靜音鍵
    • KeyEvent.KEYCODE_MUTE敌卓, 話筒靜音鍵
  • MonkeyActivityEvent
    根據輸入參數的選出適合測試的app,輸入的參數中 -p 指定測試的包名。--pkg-whitelist-file指定白名單文件伶氢,--pkg-blacklist-file制定黑名單文件趟径,然后-c 增加category。

獲取Android系統(tǒng)的PackageManger 通過mPm.queryIntentActivities 來判斷是否有APP能夠響應的該intent. 把這些app存成一個list,隨機在其中取鞍历。通過startactivity來生成MonkeyActivityEvent舵抹。

  • MonkeyFlipEvent
    生成滑動事件。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末劣砍,一起剝皮案震驚了整個濱河市惧蛹,隨后出現的幾起案子,更是在濱河造成了極大的恐慌刑枝,老刑警劉巖香嗓,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異装畅,居然都是意外死亡靠娱,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門掠兄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來像云,“玉大人,你說我怎么就攤上這事蚂夕⊙肝埽” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵婿牍,是天一觀的道長侈贷。 經常有香客問我,道長等脂,這世上最難降的妖魔是什么俏蛮? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮上遥,結果婚禮上搏屑,老公的妹妹穿的比我還像新娘。我一直安慰自己粉楚,他們只是感情好睬棚,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般抑党。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上撵摆,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天底靠,我揣著相機與錄音,去河邊找鬼特铝。 笑死暑中,一個胖子當著我的面吹牛,可吹牛的內容都是我干的鲫剿。 我是一名探鬼主播鳄逾,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼灵莲!你這毒婦竟也來了雕凹?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤政冻,失蹤者是張志新(化名)和其女友劉穎枚抵,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體明场,經...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡汽摹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了苦锨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逼泣。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖舟舒,靈堂內的尸體忽然破棺而出拉庶,到底是詐尸還是另有隱情,我是刑警寧澤魏蔗,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布砍的,位于F島的核電站,受9級特大地震影響莺治,放射性物質發(fā)生泄漏廓鞠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一谣旁、第九天 我趴在偏房一處隱蔽的房頂上張望床佳。 院中可真熱鬧,春花似錦榄审、人聲如沸砌们。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浪感。三九已至昔头,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間影兽,已是汗流浹背揭斧。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留峻堰,地道東北人讹开。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像捐名,于是被迫代替她去往敵國和親旦万。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353