Android自動化測試shell指令碼(飛車Asphalt5)
本文為本人原著,轉載請註明出處:http://blog.csdn.net/lhzhang1985/article/details/6580595 謝謝!
由於需要對飛車Asphalt5進行自動化測試,飛車又不能自動重新再開始,因此需要寫個指令碼完成自動化測試,然後就讓它跑個幾天幾夜。剛開始不太熟悉自動化測試指令碼,就在網上大量google。找了一些對資料進行參考。
我們知道在android上有類比點擊觸控螢幕分模擬器和真機,兩者差異還是挺大的,模擬器一般都比較理想化,而在真機上就顯得比較複雜些。
參考一下文章:
1、http://www.eefocus.com/chongzi865458/blog/11-06/225120_23131.html 該文主要講解android使用者輸入系統,比如觸摸按鍵 軌跡球等的資料擷取與輸入
2、http://blog.csdn.net/yiyaaixuexi/article/details/6574001 該文主要描述通過sendEvent來類比鍵盤或者滑鼠點擊事件。
3、http://blog.csdn.net/roger_ge/article/details/5552740 模擬器上類比鍵盤滑鼠事件
4、《Android系統級深入開發—移植與調試》第8章 使用者輸入系統
下面以飛車Asphalt5為例進行詳細分析:
目的:對飛車實現自動化測試,不需要人工操作
原理:第一次啟動飛車,開始競賽,觸摸按鍵ESC 或者MENU 鍵,再按螢幕中的重新開始,如此迴圈,重新開始事件自己設定。
一、擷取裝置對應的event
採用# cat /proc/bus/input/devices
C:\tools>adb shell
# cat /proc/bus/input/devices
cat /proc/bus/input/devices
I: Bus=0019 Vendor=0001 Product=0001 Version=0001
N: Name="s3c-keypad"
P: Phys=yf-keypad/input0
S: Sysfs=/devices/virtual/input/input0
U: Uniq=
H: Handlers=sysrq event0
B: EV=3
B: KEY=400000 0 0 0 0 0 0 0 0 1 ffffffff fffffffe
I: Bus=0018 Vendor=0000 Product=0000 Version=0000
N: Name="pixcir_ts"
P: Phys=
S: Sysfs=/devices/platform/s3c2440-i2c.1/i2c-1/1-005c/input/input1
U: Uniq=
H: Handlers=mouse0 event1
B: EV=b
B: KEY=400 0 0 0 0 0 0 0 0 0 0
B: ABS=2650000 1000003
二、擷取裝置對應的event*傳入值
採用getevent /dev/input/event*,*代表上面的0 或1,在真機中*可以是01234567等等,不同的數值代表不同的裝置,控制不同的東西;而且多點觸摸比單點觸摸要複雜的多。在模擬器中*的值貌似只有0這個值。
# getevent /dev/input/event0 (同時按鍵如有資訊說明該裝置控制按鍵)
getevent /dev/input/event0 等待按鍵事件
按MENU時:
0001 0032 00000001
0001 0032 00000000
按ESC時:
0001 0033 00000001
0001 0033 00000000
# getevent /dev/input/event1(同時觸控螢幕幕若有資訊彈出 則說明該裝置控制觸控螢幕)
getevent /dev/input/event1 等待觸控螢幕幕
0003 0000 0000035b ??
0003 0001 000001ba
0001 014a 00000001
0003 0018 00000001
0003 0039 00000000 ??
0003 0030 00000001
0003 0032 00000000
0003 0035 0000035b
0003 0036 000001ba
0000 0002 00000000
0000 0000 00000000
0003 0039 00000000 ??
0003 0030 00000001
0003 0032 00000000
0003 0035 0000035b
0003 0036 000001ba
0000 0002 00000000
0000 0000 00000000
0003 0039 00000000 ??
0003 0030 00000001
0003 0032 00000000
0003 0035 0000035b
0003 0036 000001ba
0000 0002 00000000
0000 0000 00000000
以上這些代表啥呢,需要找出這些原因需要先熟悉一下內容.
三、使用者輸入輸出系統的初始定義
參考:
1、kernel底層相關 http://blog.csdn.net/guoshaobei/article/details/5824740
2、android層相關 http://blog.csdn.net/yiyaaixuexi/article/details/6574001
kernel:
Event輸入驅動輸入裝置驅動程式的標頭檔:include/linux/input.h。
Event輸入裝置驅動程式的核心和Event部分代碼分別是:drivers/input/input.c和drivers/input/evdev.c。
Event裝置在檔案系統中的裝置節點為:/dev/input/eventX,該X從一部分可以看到具體的值。
Android:
源碼位置:framework/base/core/java/android/view/RawInputEvent.java
public static final int ABS_MT_TOUCH_MAJOR = 0x30;
public static final int ABS_MT_TOUCH_MINOR = 0x31;
public static final int ABS_MT_WIDTH_MAJOR = 0x32;
public static final int ABS_MT_WIDTH_MINOR = 0x33;
public static final int ABS_MT_ORIENTATION = 0x34;
public static final int ABS_MT_POSITION_X = 0x35; 代表X軸
public static final int ABS_MT_POSITION_Y = 0x36; 代表Y軸
public static final int ABS_MT_TOOL_TYPE = 0x37;
public static final int ABS_MT_BLOB_ID = 0x38;
public static final int ABS_MAX = 0x3f;
看到這些源碼後,是否可以聯想到什麼呢?
發送滑鼠事件(Touch):
命令格式:adb shell sendevent [device] [type] [code] [value]
如在模擬器中: adb shell sendevent /dev/input/event0 1 229 1 代表按下按下menu鍵
adb shell sendevent /dev/input/event0 1 229 0 代表按下鬆開menu鍵
上述的命令需組合使用。
我們回到第二部分提到的內容:
按MENU時:
0001 0032 00000001 (十六進位轉為十進位) -》event0 1 50 1 50代表MENU ,第二個1代表按下該鍵
0001 0032 00000000 (十六進位轉為十進位) -》event0 1 50 0 50代表MENU ,0代表鬆開該鍵
按ESC時:
0001 0033 00000001 (十六進位轉為十進位) -》event0 1 51 1 51代表ESC,第二個1代表按下該鍵
0001 0033 00000000 (十六進位轉為十進位) -》event0 1 51 0 51代表ESC ,0代表鬆開該鍵
getevent /dev/input/event1 等待觸控螢幕幕
0003 0000 0000035b ?
0003 0001 000001ba ?
0001 014a 00000001 ? 0x14a固定值
0003 0018 00000001 ?0x18也是固定值
0003 0039 00000000 ?
0003 0030 00000001 ->ABS_MT_TOUCH_MAJOR
0003 0032 00000000 ->ABS_MT_WIDTH_MAJOR
0003 0035 0000035b ->X軸為0x35b
0003 0036 000001ba ->Y軸為0x1ba
0000 0002 00000000 ?
0000 0000 00000000 ->必要的一行,相當於終止一段完整資料的標識
打問號的自己還未找到相關的定義,有知道的可以留言告訴一下哈,謝謝。
四、自動化測試shell指令碼
通過上面的熟悉,現在終於可以開始寫指令碼了。根據測試飛車原理,只要寫個迴圈指令碼即可。
如下:
#!/system/bin/sh
key()
{
sendevent /dev/input/event0 1 $1 1
sendevent /dev/input/event0 0 0 0
sendevent /dev/input/event0 1 $1 0
sendevent /dev/input/event0 0 0 0
echo key $1"("$2")" "& sleep" $3
sleep $3
}
touch()
{
sendevent /dev/input/event1 3 0 $1
sendevent /dev/input/event1 3 1 $2
sendevent /dev/input/event1 1 330 1
sendevent /dev/input/event1 3 24 1
sendevent /dev/input/event1 3 57 0
sendevent /dev/input/event1 3 48 1
sendevent /dev/input/event1 3 50 0
sendevent /dev/input/event1 3 53 $1
sendevent /dev/input/event1 3 54 $2
sendevent /dev/input/event1 0
2 0
sendevent /dev/input/event1 0 0 0
sendevent /dev/input/event1 3 57 0
sendevent /dev/input/event1 3 48 1
sendevent /dev/input/event1 3 50 0
sendevent /dev/input/event1 3 53 $1
sendevent /dev/input/event1 3 54 $2
sendevent /dev/input/event1 0 2 0
sendevent /dev/input/event1 0 0 0
echo touch $1 $2 "("$3")" "& sleep" $4
sleep $4
}
while true;
do
echo "==========================="
key "50" "Menu" "2"
touch "854" "442" "Touch Restart" "2"
touch "319" "316" "Yes" "215"
done
五、驗證與總結
adb push 該指令碼 /data/
adb shell
#cd /data
#chmod 777該指令碼
#./該指令碼 & //地址符 & 表示在後台運行,此時你可以將USB拔了 照樣運行
在真機上測試成功
注意一下事項:
1、不同真機各裝置節點控制內容不同,需要提前測試
2、具體的X和Y值需要實際測試擷取
3、指令碼迴圈時需要注意迴圈內容
祝需要的測試成功,歡迎大家交流。