UiAutomator——Android自动化测试工具简要介绍

来源:互联网 发布:淘宝促销手段有哪些 编辑:程序博客网 时间:2024/06/05 12:20


1.   Android自动化测试简单介绍

    Android自动化测试主要分为MonkeyrunnerRubotiumUiAutomatorMonkey(在我看来这个不算)等。主要特点:
    1
Monkeyrunner:优点:操作最为简单,可以录制测试脚本,可视化操作;缺点:主要生成坐标的自动化操作,移植性不强,功能最为局限;
    2
Rubotium:主要针对某一个APK进行自动化测试,APK可以有源码,也可以没有源码,功能强大;缺点是针对APK操作,而且需要对APK重新签名(有工具),因此操作相对复杂;
    3
UiAutomator:优点:可以对所有操作进行自动化,操作简单;缺点:Android版本需要高于4.0,无法根据控件ID操作,相对来说功能较为局限,但也够用了;
    4
Monkey:准确来说,这不算是自动化测试,因为其只能产生随机的事件,无法按照既定的步骤操作;
   
由上面介绍可以有这样的结论:测试某个APK,可以选择Rubotium;测试过程可能涉及多个APK,选择UiAutomator;一些简单的测试,选择Monkeyrunner

    本文主要介绍UiAutomator的使用方法。

 

2. 环境搭建

2.1 必备条件:

    1JDK
    2
SDKAPI高于15
    3
Eclipse(安装ADT插件)
    4
ANT(用于编译生成jar

2.2 简要步骤:

   1、安装JDK并添加环境变量。
       
安装后,一定要通过JAVA_HOME的方式添加环境变量,即先建立JAVA_HOME变量,然后在path中添加%JAVA_HOME%\bin;
   2
、添加SDK环境变量。
       
一定要先建立ANDROID_HOME,然后把%ANDROID_HOME%\tools添加到path中;
   3
、安装Eclipse,并安装ADT插件。
   4
、安装ANT工具,并添加环境变量。

       同样一定要先建立%ANT_HOME%变量,然后在path中添加%ANT_HOME%\bin

 

3. 详细操作

3.1建立工程

    Eclipse新建Java Project注意,不是Android Project

3.2添加JUnit库

    

 

3.3 添加Android库

    找到路径Android-sdk\platforms\android-17\下面的android.jaruiautomator.jar添加进来:

    

 

   所有库添加完应该是这个样子:


3.4 在src中添加包,然后添加class文件

    文件内容为:

[java] view plaincopy

1.       package com;  

2.       import com.android.uiautomator.core.UiObject;  

3.       import com.android.uiautomator.core.UiObjectNotFoundException;  

4.       import com.android.uiautomator.core.UiScrollable;  

5.       import com.android.uiautomator.core.UiSelector;  

6.       import com.android.uiautomator.testrunner.UiAutomatorTestCase;  

7.         

8.       public class Runner extends UiAutomatorTestCase {  

9.         

10.         public void testDemo() throws UiObjectNotFoundException {  

11.             getUiDevice().pressHome();  

12.             // 进入设置菜单  

13.             UiObject settingApp = new UiObject(new UiSelector().text("Settings"));  

14.             settingApp.click();  

15.             //休眠3  

16.             try {  

17.                 Thread.sleep(3000);  

18.             } catch (InterruptedException e1) {  

19.                 // TODO Auto-generated catch block  

20.                 e1.printStackTrace();  

21.             }  

22.             // 进入语言和输入法设置  

23.             UiScrollable settingItems = new UiScrollable( new UiSelector().scrollable(true));  

24.       

25.             UiObject languageAndInputItem = settingItems.getChildByText(  

26.                     new UiSelector().text("Language & input"), "Language & input"true);  

27.             languageAndInputItem.clickAndWaitForNewWindow();  

28.               

29.         }  

30.     }  

    上面工程路径在e:\workspace\AutoRunner,类全名为com.Runner,至于具体的作用我们现在不去关心。

3.5 找到SDK ID

    CMD进入\Android-sdk\tools\目录下,运行命令:
    android list
   
查看API大于15SDKID值,当前是6
    

3.6 创建build文件

    仍然在\Android-sdk\tools\目录下,运行命令:
    android create uitest-project -n <name> -t<android-sdk-ID> -p <path>
   
比如:
    android create uitest-project -n AutoRunner -t 6 -pe:\workspace\AutoRunner
   
上面的name就是将来生成的jar包的名字,可以自己定义,android-sdk-ID就是上面看到的6pathEclipse新建的工程的路径;运行命令后,将会在工程的根目录下生成build.xml文件。如果没生成,检查上面的步骤。

3.7 编译生成jar

    CMD进入项目的工程目录,然后运行ant build,将使用ant编译生成jar,成功将会提示:

   
   
然后会在bin目录下生成jar文件。

3.8 push并运行jar

    adb push <jar文件路径> data/local/tmp
    adb shell uiautomator runtest <jar
文件名> -c <工程中的类名,包含包名>
   
比如:
    adb push e:\workspace\AutoRunner\bin\AutoRunner.jardata/local/tmp
    adb shell uiautomator runtest AutoRunner.jar -c com.Runner

    然后就能看到手机会按照Runner中的步骤自动执行。具体效果就是,进入设置菜单,然后再进入语言和输入法菜单

 

4. 代码分析

 

    我们从几个最重要的对象来介绍。

4.1 UiDevice对象

    getUiDevice()的方法可以得到一个UiDevice的对象,通过这个对象可以完成一些针对设备的动作:
    click(int x, int y)
    ----
(x,y)表示的像素地方点击
    pressBack()
    pressDelete()
    pressEnter()
    pressHome()
    pressMenu()
    pressSearch()
    ----
点击相应的按键
    wakeUp()
    ----
当手机处于灭屏状态时,唤醒屏幕,并解锁。
    swipe(startX, startY, endX, endY, steps)
    ----
在手机上滑动,从(startX,startY)(endX,endY)steps表示滑动的这个距离分为几步完成,数目越少,滑动幅度越大。
    setOrientationLeft()
    setOrientationRight()
    ----
将手机向相应方向旋转。
    setOrientationNatural()
    ----
将手机旋转状态回归正常。

4.2 UiSelector对象

    这个对象可以理解为一种条件对象,描述的是一种条件,经常配合UiObject使用,可以得到某个(某些)符合条件的控件对象。
    checked(boolean val)
    ----
描述一种check状态为val的关系。
    className(className)
    ----
描述一种类名为className的对象关系
    clickable(boolean val)
    ----
checked类似,描述clickable状态为val的关系
    description(desc)
    ----
不解释
    descriptionContains(desc)
    ----
description类似
    focusable(boolean val)
    ----
checked类似
    index(index)
    ----
用当前对象在父对象集中的索引作为描述
    packageName(String name)
    ----
用包名作为条件描述
    selected(val)
    ----
描述一种选择关系
    text(text)
    ----
最为常用的一种关系,用控件上的文本即可找到当前控件,需要注意,所有使用text属性找到的控件,必须是英文的。也就是说,不支持通过中文查找控件!
    textContains(text)
    ----
text类似
    textStartsWith(text)
    ----
text类似

4.3 UiObject对象

    这个对象可以理解为控件的对象。一般一个UiObject对象可以通过以下形式得到:
    UiObject mItem = new UiObject(newUiSelector().text("English"));
   
也就是配合一个UiSelector就可以得到一个控件。
    click()
    ----
点击控件
    clickAndWaitForNewWindow()
    ----
点击某个控件,并等待窗口刷新
    longClick()
    ----
长按
    clearTextField()
    ----
清除文本,主要针对编辑框
    getChildCount()
    ----
这个方法可以看出,其实UiObject也可以是一个控件的集合
    getPackageName()
    ----
得到控件的包名
    getSelector()
    ----
得到当前控件的选择条件
    getText()
    ----
得到控件上的Text
    isCheckable()
    isChecked()
    isClickable()
    isLongClickable()
    isScrollable()
    isScrollable()
    isSelected()
    ----
判断是否具备某个属性

4.4 UiCollection对象

    这个对象可以理解为一个对象的集合。因为UiSelector描述后得到的有可能是多个满足条件的控件集合,因此可以用来生成UiCollection:
    UiCollection mUiCollection = new UiCollection(newUiSelector().text("Settings"));
    getChild(selector)
    ----
从集合中再次通过UiSelector选择一个UiObject对象
    getChildByDescription(childPattern, text)
    ----
从一个匹配模式中再次以text为条件选择UiObject
    getChildByText(childPattern, text)
    ----
与上面类似。
    getChildCount()
    ----
得到当前集合中控件的个数

4.5 UiScrollable对象

    UiScrollable可以生成一个滚动动作的对象,其最大的作用就是可以实现滚动的查找某个元素。比如在设置菜单中,语言和输入法这个菜单比较靠下,需要滚动后才可以看到(找到),因此就用上了UiScrollable

[java] view plaincopy

1.       UiScrollable settingItems = new UiScrollable( new UiSelector().scrollable(true));  

2.       UiObject languageAndInputItem = settingItems.getChildByText(  

3.       new UiSelector().text("Language & input"), "Language & input",  

4.       true);  

    上面的形式就可以在滚动中查找显示有“Language & input”的控件,也就是语言和输入法的设置项。

4.6 等待操作和添加Log的方法

    如果是对于一个标准的UiObject对象,可以通过clickAndWaitForNewWindow的方法在点击之后主动等待一段事件,但是如果需要额外的等待一段时间,特别对于getUiDevice().pressHome();这种操作,可能需要很长的事件去为下一步操作获取更多的事件,此时我们可以使用线程的sleep方法去实现:

[java] view plaincopy

1.       //等待3  

2.       try {  

3.           Thread.sleep(3000);  

4.       catch (InterruptedException e1) {  

5.           e1.printStackTrace();  

6.       }  

    而添加Log的方法也可以通过Java标准的println来实现:
    System.out.println("This used to print some log!!!" +setLanItem.getText());
   
以上Log将会在jar被运行时通过CMD窗口打印出来。

 

5. 一个相对完整的测试case

 

    下面就用一个相对连贯的测试用例来串一下上面的知识点,这个case用例要做的就是进入系统设置菜单,然后选择语言和输入法菜单,然后进入语言设置菜单,然后在第一项上点击,把当前语言设置为简体中文

[java] view plaincopy

1.       public void setChineseLan() throws UiObjectNotFoundException {  

2.           //进入操作前,先用Home键进入待机界面  

3.           getUiDevice().pressHome();  

4.         

5.         

6.           //进入系统设置菜单。也可以通过点击menu按键来实现  

7.           UiObject settingApp = new UiObject(new UiSelector().text("Settings"));  

8.           settingApp.click();  

9.         

10.       

11.         //等待3  

12.         try {  

13.             Thread.sleep(3000);  

14.         } catch (InterruptedException e1) {  

15.             e1.printStackTrace();  

16.         }  

17.       

18.       

19.         //用滚动的方式查找并进入语言和输入法设置菜单  

20.         UiScrollable settingItems = new UiScrollable(  

21.                 new UiSelector().scrollable(true));  

22.       

23.       

24.         UiObject languageAndInputItem = settingItems.getChildByText(  

25.                 new UiSelector().text("Language & input"), "Language & input",  

26.                 true);  

27.         languageAndInputItem.clickAndWaitForNewWindow();  

28.       

29.       

30.         //找到“English”的可点击项(因为当前是英文环境)  

31.         UiObject setLanItem = new UiObject(new UiSelector().text("English"));  

32.         setLanItem.clickAndWaitForNewWindow();  

33.       

34.       

35.         //Log输出  

36.         System.out.println("setLanItem-->" + setLanItem.getPackageName());  

37.       

38.       

39.         //由于无法识别中文,因此我们这里使用坐标去选择简体中文  

40.         getUiDevice().click(350250);  

41.           

42.         //点击返回键,回到待机界面  

43.         getUiDevice().pressBack();  

44.         getUiDevice().pressBack();  

45.         getUiDevice().pressBack();  

 

6. 如何查看android uiautomator源码

首先双击已导入到项目中的jar包中任意一个类文件,会出现下面的界面。

 

此时点击上图中“Attach source”按钮,eclipse会展示source源的设置界面,


此时点选上图中“External location”选项并点击External Folder按钮,eclipse会展示文件夹列表


此时找到sdk/source目录,选择对应的android文件夹,如我们导入的是sdk/platform/android-19平台对应的jar包,则在此处选择sdk/source/android-19作为源文件默认获取文件夹,点击确定保存设置。Eclipse即可显示对应的源码内容。

 


0 0