Android测试开发环境(含ADB和Monkey)

1、Android开发的三种环境

1.1、Android Studio

     AndroidStudio 是Google 官方在2013 Google I/O 大会上发布的Andrid 开发IDE,专门用于开发Android项目,安装包里集成了Android SDK,不需再安装ADT,是目前主流的Android应用开发环境。

1.2、Eclipse+Android SDK+ADT

    Eclipse默认只能用于开发普通的JAVA应用程序,AndroidSDK提供了开发Android应用程序所需的API库和构建、调试Android应用程序所需的开发工具

    如果要通过Eclipse来开发Android应用程序,就需要另外安装AndroidSDK,默认情况下Eclipse不会和Android SDK进行关联。为了两者连接起来,Android的开发团队专门针对Eclipse IDE定制了一个插件:Android Development Tools(ADT),ADT也需要单独安装,安装完成之后在Eclipse里经过一系列的配置,这套Android开发环境就完成了。

1.3、ADT

   集成式的安卓开发工具,安装包中包含了Eclipse和Android SDK,而且是默认关联的。

2、搭建ADT

2.1、安装JDK

     如果机器是32位的就32位JDK,如果机器是64位的就安装64位JDK,安装完成后要配置环境变量JAVA_HOME和PATH。

2.2、安装ADT

     解压到某个目录下就可以了,同样区分32位和64位,安装完成之后需要配置ANDROID_HOME(***\adt-bundle-windows-x86_64-20140321\sdk)和PATH(%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\build-tools\android-4.4.2;)。

Android测试开发环境(含ADB和Monkey)_第1张图片

2.3、连接真机或者启动模拟器

   如果是连接真机就需要手机打开USB调试模式,并通过数据线与电脑连接

   如果是使用模拟器不需要做以上工作,启动模拟机就可以了。

3、Android模拟器

3.1、原生态模拟器

    只要第二章节的ADT安装配置完成,就可以在dos里通过androidavd启动Android虚拟设备管理器。

Android测试开发环境(含ADB和Monkey)_第2张图片

Android测试开发环境(含ADB和Monkey)_第3张图片

Android测试开发环境(含ADB和Monkey)_第4张图片

Android测试开发环境(含ADB和Monkey)_第5张图片

3.2、非原生模拟器

    使用最广泛的就是Genymotion模拟器,是运行最快Android模拟器,也有使用夜神模拟器的,安装启动后的操作方法和原生模拟器差别不大。

4、ADB命令实战

    全称是AndroidDebug Brige,就是起个桥梁连接的作用,是Android SDK提供的Debug工具。借助ADB工具,我们可以管理终端设备或模拟器的状态,进行很多操作,如安装APP、升级、运行Shell命令登录。如果是终端设备,ADB就是连接Android手机与PC的桥梁,可以让用户在电脑上对手机进行全面操作;如果是模拟器,adb也可以对模拟器进行操作。

Android测试开发环境(含ADB和Monkey)_第6张图片

5、uiautomatorviewer

    uiautomatorviewer是Android SDK提供的一个GUI工具,在**/tools/目录下。使用uiautomatorviewer可以从PC端获取一个设备或APP的UI布局结构,并且可以查看各个控件的相关属性。这是非常重要的,特别是当编写UI自动化测试代码时,就可以使用该工具获取APP的UI界面中的元素属性。

    1、使用uiautomatorviewer之前必须要连接一个模拟器或真机,而且最好只有一个。

    2、启动uiautomatorviewer的GUI工作界面,启动后点击左起第二个图标DeviceScreeshot,就可以捕捉到当前已连接设备的UI界面;如果要检查其他APP或其他页,就操作连接设备,然后再点击图标DeviceScreeshot重新捕获。

Android测试开发环境(含ADB和Monkey)_第7张图片

     3、左侧是捕获到的设备或APP的某一页,可以移动鼠标选择某一个控件,右侧上方显示当前界面的布局结构,右侧下方显示所选控件的属性。点击右侧上方的黄三角按钮可以来查看不能被测试工具(如uiautomator)访问到的控件,因为这些控件只设置了有限的属性,。这种情况下你可以要求开发者为这些控件添加必要的属性,比如如果是ImageView或者ImageButton应该添加android:contentDescription属性。

Android测试开发环境(含ADB和Monkey)_第8张图片

    如果就可以获取被点击区域的控件属性了,为实现UI自动化做准备。但如果想要知道他是如何和手机设备通信,然后获取控件信息的,就需要反编译uiautomatorviewer.jar,从源码了解它的原理。

6、Android测试之工具

6.1、monkey介绍

   monkey是Android SDK中自带的一个命令行工具,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar;可以通过开发机器上的命令行或脚本来启动。Monkey表面上运行在开发机器上,其实是运行在模拟器/真实终端设备的adb shell中中,所以必须用其环境中的shell(/system/bin/monkey)来运行,可以通过在每条命令前加上adb shell来达到目的,也可以进入Shell后直接输入Monkey命令。

   Monkey测试一般是在产品功能稳定之后进行,专擅于对APP作长稳测试。

    通过monkey命令可以模拟用户向目标程序发送随机的事件流,效果等同于手动操作APP,并产生对应的日志,开发测试人可以通过分析monkey日志定位测试过程中出现的问题,实现对APP的自动化和压力测试。

6.1.1、Monkey支持的事件

    Monkey支持11种事件,主要是以下5种.....

Touch触摸事件                      由屏幕中的一个down-up事件,即在屏幕某处按下并抬起的操作

Trackball滚动球事件            由一个或多个随机的移动事件组成,有时会伴随着点击事件

motion滑动事件                   由屏幕上某处一个down事件、一系列随机的移动事件和一个up事件组成

nav基本导航事件                 由方向输入设备的上下左右按键所触发的事件组成

majornav主要导航事件      通常会导致UI界面中的动作事件,如5-way键盘的中间键,回退 按键、菜单按键

6.1.2、Monkey测试的特征

1、测试的对象仅为应用程序包,有一定的局限性

2、使用的事件流都是随机产生的,不能自定义也不含任何的主观性

3、可以对测试的事件数量、类型和频率等参数进行设置

6.2、monkey命令讲解

    Monkey一般是产品相对稳定之后使用,使用步骤:

1、启动模拟器或者连接真机,使用adbdevices验必须是device状态

2、确定被测试应用的PackageName

3、开始使用monkey发送测试命令(通过adbshell或者先进入设备的shell环境)。

   当通过开发机器上的命令行(如dos)运行monkey命令时,基本语法如下:


约束选项:

-p PackageName   指定一个包名,每个Android应用都有一个唯一的包名,指定之后

                  Monkey将只允许系统启动这个包里的Activity。如果应用程序还需要访

                  问其它包里的Activity(如选择取一个联系人),那些包也需要在此同时指

                  定(使用多个 -p选项,每个-p选项只能用于一个包)。如果不指定任何

                  包,Monkey将允许启动设备系统全部包里的Activity。

常用选项:

                        用于指定反馈信息级别,就是日志的详细程度,总共分3个级别,    

-v                     仅提供启动提示、测试完成和最终结果等少量信息;

–v -v                提供较为详细的日志,包括每个发送到Activity的事件信息;

–v -v –v           提供最详细的日志,包括了测试中选中/未选中的Activity信息 

事件选项:

--throttle 毫秒     每两组事件流(一个touch事件流有一个action-up和一个action-down

                 组成)之间sleep一段时间,模拟用户的真实使用场景,只有在俩v或三      

                 v时才生效;如果不指定,系统会尽快的发送事件流,造成太大压力也

                 不便于观察。

-s seed值          如果指定了伪随机数生成器的seed值,就会产生固定事件流,如果用

                  相同的seed值再次运行Monkey,它将生成相同的事件序列。如果不指

                   定,seed值就随机产生,事件流也是随机产生的

--pct-touch  *      指定触摸/点击事件在事件流中的百分比

--pct-trackball  *    指定滚轮事件在事件流中的百分比

--pct-motion *       调整motion事件在事件流中百分比。

--pct-nav *          调整基本导航事件在事件流中百分比。

--pct-majornav       调整主要导航事件在事件流中的百分比  

调试选项:

--ignore-crashes     通常,当应用程序崩溃或发生任何失控异常时,Monkey将停止运行。

                  如果设置此选项,Monkey将继续向系统发送事件,直到计数完成。

--ignore-timeouts    通常,当应用程序发生任何超时错误(如“Application Not Responding”

                  对话框)时,Monkey将停止运行。如果设置此选项,Monkey将继续向                

                  系统发送事件,直到计数完成。

--monitor-native-crashes   监视并报告Android系统中本地代码的崩溃事件

随机事件数:      最后指定

6.3、monkey日志分析和案例分析

Android测试开发环境(含ADB和Monkey)_第9张图片

Android测试开发环境(含ADB和Monkey)_第10张图片

6.4、Python+monkey自动化实战

#coding=gbk
import os                                #import                 导入一些系统设置
import os.path                             
##第一步##获取正在连接的设备并存入ds[]数组中
os.system("cls")                          #os.popen():            执行系统命令,和os.system功能类似
print "adb devices检查设备..."            #print:                向屏幕输出信息,参数可以是数组或字符串   
rt = os.popen('adb devices').readlines()  #popen的readlines属性: 把输出的每一行信息(连续多个空行就用一个'\n'代替)当做一个元素,生成一个数组并返回
n = len(rt) - 2                           #len():              如果是数组就计算元素个数,-2是因为第一行不是设备,最后一个是'\n'
print rt                                                         
print "检测到" + str(n) + "台设备:"      #str():              如果参数是数值,就转换成字符串
if n == 0:
	print "python结束运行......"
	exit()
ds = range(n)                             #range():               range(1,5)返回从1到4的数组;range(5)返回从0到4的数组,python的数组是可变的 
for i in range(n):                        #for..in..:             遍历数组逐个循环,这段循环的作用就是把检测到的所有设备赋值到ds[]数组中,并逐个打印出来
	nPos = rt[i+1].index("\t")            # '\t'                  制表符,作用是换行显示      
	ds[i] = rt[i+1][:nPos]               
	print str(i+1) + " - " + ds[i]
print " "
##第二步##从ds[]数组选择一个设备存入dev中
nSel = 1
if n == 1:                               #if或for语句块           没有结束标志,语句块内每行必须一个tab键(不能用空格)缩进,某一行不缩进就代表语句块结束了。                       
	dev = ds[0]															
elif n > 1:
	nSel = input("选择设备编号:")        #input():               返回数值类型,如int,float
	dev = ds[nSel-1]
##第三步##这以上的代码就为了获取这个34行的dev,以下代码是创建***.cmd文件 
fn = raw_input("输入文件(夹)名:")      #raw_input():           返回字符串类型,如string
if not os.path.isdir("D:\\" + fn):        #os.path.isdir():       判断文件夹是否存在,返回boolean值      
	os.mkdir("D:\\" + fn)                 #os.mkdir():            创建文件夹
fd = open(fn + '.cmd', 'w')               #open():                打开文件,返回文件句柄
fd.write("@set number=0\n")#set在dos里定义变量
fd.write(":loop\n")#cmd脚本的标签,与goto语句一起使用
fd.write("adb -s ")#指定设备的命令
fd.write(dev)
fd.write(" shell monkey  -p com.android.browser --monitor-native-crashes  --pct-touch 80 --pct-motion 15 \
	--pct-nav 5 -s %random% -v -v --throttle 500 320000 >d:\\")#-s %random%的意思是防止产品相同的时间避免重复执行同一种动作
fd.write(fn)
fd.write("\\%random%.log\n")
fd.write("@ping -n 15 127.1 >nul\n")#ping自己15次用来延迟
fd.write("adb -s ")
fd.write(dev)
fd.write(" reboot\n")#reboot指定的真机或模拟器,模拟器可能无法重启
fd.write("@ping -n 100 127.1 >nul\n")
fd.write("@set /a number=number+1\n")#dos里/a是加,/y是复制
fd.write("@if %number%==5 exit\n")#pause是按任意键继续......
fd.write("@goto loop")
fd.close()                                #关闭文件                                     
	
print "批处理生成完毕"


Android测试开发环境(含ADB和Monkey)_第11张图片

 Second、执行cmd脚本

Android测试开发环境(含ADB和Monkey)_第12张图片

 Third、Windows计划任务

Android测试开发环境(含ADB和Monkey)_第13张图片

7、查看APP的Package Name和入口Activity

Android测试开发环境(含ADB和Monkey)_第14张图片


你可能感兴趣的:(APP测试)