2018年12月30日 星期日

21-sendevent

上回咱們說到怎麼利用 getevent 得到 Android 的輸入事件,本次就來說明如何使用 sendevent 模擬輸入的動作。

2018年12月23日 星期日

20-getevent

getevent 是一個和模擬輸入無直接相關的指令,但若看官想知道當滑動 Android 觸控面板時是由那些輸入事件所構成,或想記錄點擊、滑動等動作以回放這些操作,那 getevent 將是一種選擇。

2018年12月8日 星期六

19-Level up !!! input draganddrop

拖放 (Drag and Drop) 是種很常見的操作,可是咱們曾介紹的 MonkeyDevice.draginput swipe 都難以漂亮地模擬此動作,並非不能,只是實現的效果非常不理想且醜陋。不過從 Android 8.0.0 開始,有一新的 input 成員能夠較為優雅地實現此模擬了,它便是 input draganddrop

2018年12月2日 星期日

18-input三兄弟swipe

input swipe 的功能和 MonkeyDevice.drag 類似,都是模擬手指滑動螢幕的行為,其使用方式也雷同:
語法 input swipe <x1> <y1> <x2> <y2> [ duration(ms) ]
說明 功能與 MonkeyDevice.drag (tuple start, tuple end, float duration, integer steps) 類似。
duration 預設為 300 ms。

2018年11月5日 星期一

17-input三兄弟tap

語法 input tap <x> <y>
說明 與 MonkeyDevice.touch (<x>, <y>, MonkeyDevice.DOWN_AND_UP) 的行為一樣。

16-input三兄弟keyevent

語法 input keyevent [--longpress] <key code number or name>
說明 與 MonkeyDevice.press(<key name>, MonkeyDevice.DOWN_AND_UP) 的行為類似。
Key name,可查閱 KeyEvent 裡以 KEYCODE_ 為開頭的名稱。
Key code number,可查閱 KeyEvent 裡以 KEYCODE_ 為開頭的名稱的 constant value。
--longpress 此參數目前無法達成長壓按鍵的效果。

咱們直接看例子:

2018年11月4日 星期日

15-輕量級的輸入模擬 (input)

相比於 MonkeyDevice 提供的 press、touch 和 drag 三種方法,本喵更常使用 shell 提供的 input 來執行對應的動作。其實若單以行為的可控制性來說,MonkeyDevice 是勝過 shell input 的,比如 shell input tap 只能執行「點一下螢幕」這樣的動作,而 MonkeyDevice.touch() 還可以模擬「長壓螢幕」的行為。但之所以選擇 shell input,是因為 monkeyrunner 太常丟出 exception 了,雖然這可以藉由良好的封裝來重複嘗試執行,但設計上畢竟較繁複,執行測試時也會花費更多時間在不必要的 try...exception 上;另一個理由則是本喵被分配的工作剛好 shell input 便足夠勝任了,所以除非有必要,否則本喵是傾向使用簡單的方式來達成目的。

2018年10月28日 星期日

14-繞遠路雖愚蠢但有用 (screencap)

screencap 是 Android shell 提供來擷取目前螢幕畫面的工具程式,本喵只使用過以下語法:
語法 說明
screencap -p [FILENAME] [FILENAME],截圖儲存在 Android 裝置上的檔案路徑,格式為 png。

什麼時候會需要以 screencap 來取代 MonkeyDevice.takeSnapshot() 呢?本喵遇過的情境如下:

2018年10月27日 星期六

13-最終兵器MonkeyDevice.shell

Shell,可以說是由裝置外部操控裝置的最後也是最強的一種工具,但這並不意味著 monkeyrunner 提供的功能僅僅是 shell 的包裝,甚或雞肋,他們的關係更像是互補。monkeyrunner 不能做到的事由 shell 來完成;而 shell 不能達成的工作,則由 monkeyrunner 來補足,縱使兩者都具備的功能,其表現也不盡相同。因此何時使用 shell 或 monkeyrunner,端視裝置的能力與看官希望達成的效果而定。

2018年10月22日 星期一

12-心中那一瞬的美麗 (MonkeyImage.writeToFile)

咱們已經知道如何載入圖片檔了,那依照想當然耳的對稱性會認為應該存在一個儲存圖片的方法才是,MonkeyImage.writeToFile (string path, string format) 就是用來將 MonkeyImage 表示的畫面儲存成圖像檔的方法。

2018年10月19日 星期五

11-九又四分之三的回憶 (MonkeyRunner.loadImageFromFile)

咱們已經知道如何擷取螢幕的畫面,也了解怎麼切割與比較它,但看官們一定滿肚子疑惑:「我才不在乎螢幕畫面有沒變化呢!我想知道的是目前畫面是不是我想要的阿!」

是的!只靠先前章節介紹的方法根本無法得知目前 app 運行的進展,咱們需要的是一個可以載入預期畫面的方法,好拿它與目前畫面做比較。但非常令人意外的是,Google monkeyrunner 的官方介紹中卻看不到任何與載入圖片相關的說明?!

2018年10月18日 星期四

10-失去你擁有世界又如何 (MonkeyImage.getSubImage)

通常檢查裝置是否在預期的情境時並不會去比較整個螢幕畫面,因為咱們只在意畫面上最關鍵的部分——可以代表預期影格的最有力的特徵,這主要是為避免誤判,另一方面也是為了加速畫面的比較。雖然 MonkeyImage.sameAs() 無法指定比較的範圍,但咱們可以從 MonkeyImage 物件提取出適當的畫面後再以 MonkeyImage.sameAs() 進行比較,這便是 MonkeyImage.getSubImage (tuple rect) 的作用。

2018年10月14日 星期日

2018年10月10日 星期三

08-為你擷取全世界 (MonkeyDevice.takeSnapshot)

咱們已經學會三種操控手持式裝置的方法:press、touch 和 drag,有了這些動作,已經可以設計些簡單的腳本來操控 app,但除非要執行的動作不需任何判斷(比如狂點螢幕上某些固定地方),否則讓腳本可以根據目前資訊來判斷該做什麼事才是較常見的需求。那什麼是目前資訊呢?以使用者的角度來切入,不外乎就是螢幕目前的畫面,當然,螢幕畫面所能表達的訊息有時也可以藉由向裝置發送命令去獲得,但除非 app 開發商有留下此種資訊能讓外界讀取,否則依然只能藉由畫面本身來判斷。

2018年10月8日 星期一

07-迷霧中的MonkeyDevice.drag

對於手機、平板等手持裝置來說,「滑動」這個動作是必不可少的,因此可以模擬滑動效果的 MonkeyDevice.drag (tuple start, tuple end, float duration, integer steps) 是非常重要的功能,但他的參數與實際表現的落差有時卻讓人迷惑。

2018年10月3日 星期三

05-按下那個按鍵!猴子!(MonkeyDevice.press)

終於,咱們可以開始學習對 Android 裝置下達第一道命令了~按下一個實體按鍵: MonkeyDevice.press (string name, integer type)

所謂的實體按鍵就是諸如電源鍵或聲音鍵這種可以實際觸摸到的硬體,而不是由電腦繪製的 icon 類型的按鈕。以前的 Android 手機上還有 Home key 這種按鍵,但現在也常是以 icon 的形式被表現於手機上了。但即使如此,通常還是可以利用 MonkeyDevice.press() 送出一個模擬 Home key 被按下的訊息給沒有 Home key 的手機,讓其表現按下 Home key 時應有的行為。

2018年10月1日 星期一

2018年9月30日 星期日

03-連線吧!Monkeyrunner (MonkeyRunner.waitForConnection)

よし,開發環境已經準備好了,執行方法也已經知道,接下來就開始學習 monkeyrunner API 吧!

本喵最開始要介紹的當然就是所有測試前都必須做的——裝置連線:MonkeyRunner.waitForConnection (float timeout, string deviceId)

MonkeyRunner.waitForConnection() 的作用就是讓手機或模擬器與 monkeyrunner 後端連線,這樣才能藉由腳本傳輸命令控制 Android 裝置。

2018年9月29日 星期六

02-Monkeyrunner的程式架構與執行

Monkeyrunner 的程式架構如下:
# 匯入所需模組
from com.android.monkeyrunner import MonkeyDevice, MonkeyImage, MonkeyRunner

# 連接 Android 裝置
device = MonkeyRunner.waitForConnection()

# 執行測試
# 按 1 次音量增大鍵
device.press('KEYCODE_VOLUME_UP', MonkeyDevice.DOWN_AND_UP)
是的!就是這麼單純!Android 開發團隊已經將 monkeyrunner 包裝得很簡單易用,沒有複雜的流程!

01-環境設置與常見錯誤排解

為了使用 monkeyrunner 執行自動化腳本,首要之舉便是安裝相關的軟體。若看官們已有相應的環境(使用 monkeyrunner 並不需要整個 Android Studio),便可略過此步驟,否則請跟著以下步驟來設定環境:

00-緣起

嗨~大家好!本喵是漂泊於程式測試領域的北極貓~

自從誤打誤撞進入了手機測試的領域已過了七、八個寒暑,因緣際會參與自動化腳本設計的行列也逾五年了。這麼多年過去,雖然一直有想與看官們分享的心情,但念及已有許多神人大大們提供各種豐富的資訊,本喵實不知該拿什麼東西分享。思來想去,有的只是在測試領域的微薄經驗,但單純的經驗談似乎無甚樂趣,這時恰好發現有不少外包內容是要製作類似按鍵精靈的外掛,而這和自動測試可以扯上些許關係,加上本喵從沒實作過按鍵精靈,不只可以分享經驗於人,本喵也能從中學習,於是乎這系列就此誕生。