Android自动化测试shell脚本(飞车Asphalt5)

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、脚本循环时需要注意循环内容


祝需要的测试成功,欢迎大家交流。







你可能感兴趣的:(01Android)