Android的uiAutomator

以下内容选自《深入解析Android5.0系统》,京东,当当,亚马逊上有售。


除了对组成安卓应用的组件(例如:ActivitiesServicesContentProviders)进行单元测试,测试应用程序运行在设备上时的界面也很重要。UI测试确保应用在一系列用户操作后能产生正确的UI界面,例如:通过键盘输入,点击工具栏,菜单,对话框,图片或其他的UI控件。

功能测试或者黑盒测试不需要测试人员了解应用的内部实现细节,只要明白在执行一系列用户操作或输入后返回的UI是什么。这种测试方法将能更好的把你的组织中的开发和测试角色分离。

UI测试通常是的通过手工方式进行,验证应用的行为是否像所期望的那样运行。然而,这种方法非常耗时,无趣和容易出错。一种更有效、更可靠的方式是使用软件测试框架来自动化进行UI测试。自动化测试首先需要编写程序执行测试任务(测试用例)来覆盖指定的使用场景,然后使用测试框架自动的重复的运行测试用例。

1.  概述

Android SDK提供下述工具来支持自动化的功能界面测试:

uiautomatorviewer:一种扫描、分析Android应用的UI组件的可视化工具

uiautomator :一个包含创建定制功能界面测试API和自动化运行测试用例的引擎的JAVA类库。 

2.  使用uiautomator测试框架的工作流程

下面简单介绍一下UI自动化测试的主要步骤:

q 安装应用到用来测试的设备,分析应用的界面模块。确保你的应用能够被自动化测试框架访问。

q 为你的应用创建自动化测试来模拟特定的用户交互。

q 把测试用例编译成jar文件,安装到装有应用的设备上。

q 执行测试并检查测试结果。

q 修正测试发现的错误或者缺陷。

3.  分析应用的UI

在编写测试用例之前,熟悉待测应用的UI组件(包括视图和控件)是很有帮助的。你能通过uiautomatorviewer获取连接在电脑上的设备的UI快照。uiautomatorviewer提供了一个可视化的界面来检查UI的布局层次和查看每一个显示在设备上的UI组件的属性。使用这些信息,你能够创建测试用例来测试特定的UI组件。   

24.4 uiautomatorviewer显示捕获的测试设备的界面

分析待测程序的UI组件的步骤如下:

q 连接Android设备到有开发环境的电脑上。

q 打开命令行终端窗口,进入android sdk tool所在目录。

q 执行命令: $ uiautomatorviewer

q 捕获到应用的界面后,点击“Device Screenshot”按钮。

注意:如果你连接了多个设备,需要通过环境变量ANDROID_SERIAL来指定对截取哪个设备。

1)       运行以下命令,得到所有和电脑相连的设备序列号

$adb devices

2)       设置环境变量ANDROID_SERIAL

Windows上:

set ANDROID_SERIAL=

Lnix上:

export ANDROID_SERIAL=

如果你只连接一个设备,则不需要设置。

q 查看应用的UI属性:在快照的左侧面板上,可以看到uiautomatorviewer显示的UI组件;在右侧下边是组件的属性,上边是布局的层次。你也可以点击“Toggle NAFNodes”按钮来显示uiautomator框架无法访问的UI组件,它们只有有限的属性信息可以供uiautomator使用。

4.  准备测试

在开始使用uiautomator测试框架之前,完成下面的准备工作:

安装待测应用到设备。

了解待测应用的UI组件。

确保待测应用可访问。本步骤非常必要,因为uiautomator工具依赖Android的可访问特性来执行UI功能测试。你应该在你的程序中加入下述简单的优化来支持uiautomator测试工具:

q 使用android:contentDescription属性作为ImageButtonImageViewCheckBox 和其他界面控件的标签。 

q EditText 输入框提供android:hint属性代替android:contentDescription属性。 

q 用于反馈给用户信息(如状态、声明信息)的控件的图标应该包含android:hint属性 

q 确保在使用方向控制键(如trackballD-pad)时所有的UI元素也是可访问的,

q 使用uiautomatorviewer工具确保UI组件可以被uiautomator工具访问。

注意:为了识别不可访问的UI组件,请点击uiautomatorviewer工具的Toggle NAFNodes选项。

通常,Android应用开发者不需要考虑是否支持可访问性,因为它们都继承ViewViewGroup类。然而,对于使用定制组件来提供更丰富用户体验的应用,这些定制组件无法获得由标准组件才有的可访问性支持。如果你的测试应用有类似情况,确保应用实现了AccessibilityNodeProvider接口类来暴露定制组件给Android

关于更多信息,可以参考android官方站点。 

5.  分析一个实际的测试程序

下面的代码例子演示一个简单的测试用例,它可以用来模拟用户在一个安卓设备上启动设置应用。该测试用例模拟用户完成这样的场景的所有步骤,包括打开主屏幕,进入主菜单屏幕,滑动到设置应用图标所在的位置,点击该图标进入设置应用。 

// 引入uiautomator

import com.android.uiautomator.core.UiObject ;

import com.android.uiautomator.core.UiObjectNotFoundException;

import com.android.uiautomator.core.UiScrollable;

import com.android.uiautomator.core.UiSelector ;

import com.android.uiautomator.testrunner . UiAutomatorTestCase;

 

publicclass LaunchSettings extends UiAutomatorTestCase{

publicvoid testDemo() throws UiObjectNotFoundException {

//模拟点击Home

getUiDevice().pressHome ();

 

// 现在在主屏幕上,接下来需要模拟用户进入应用主菜单。如果使用uiautomatorviewer工具捕获主屏幕

// 的快照,注意看“All Apps”按钮的content-description属性值为“Apps.

// 我们将使用该属性创建一个UiSelector 对象来表示该按钮。 

UiObject allAppsButton  = new UiObject(newUiSelector().description(“Apps”)); 

 

// 模拟点击进入应用主菜单的屏幕

allAppsButton.clickAndWaitForNewWindow();

 

// 在主菜单的屏幕中,设置应用位于Apps选项卡内。为模拟用户进入该选项卡,我们创建一个UiSelector

// 对象来表示带“Apps”文本标签属性的选项卡。

UiObject  appsTab  =  new  UiObject(newUiSelector().text( “Apps” ));

 

// 模拟点击Apps选项卡

appsTab.click();

 

// 接下来在apps选项卡内,我们将模拟用户滑动屏幕找到设置应用的图标。创建UiScrollable 对象。 

 UiScrollable appViews  =  new UiScrollable(new UiSelector() . scrollable ( true));

 

// 设置滑动模式为水平,默认为垂直模式

 appViews.setAsHorizontalList();

 

// 创建一个UiSelector对象来寻找设置应用并模拟用户点击启动该应用

iObject settingsApp  = appViews.getChildByText(newUiSelector().className

(android.widget.TextView.class.getName()),“Settings”);

settingsApp.clickAndWaitForNewWindow();

 

// 检查包名是否和预期的一致

UiObject settingsValidation  = new UiObject(newUiSelector().

packageName(“com.android.settings”));

assertTrue(“Unable to detect Settings”,settingsValidation.exists ());

 }

 }

6.  构建和部署uiautomator测试

一旦完成编码和测试后,按照下面的步骤来构建和部署你的测试jar包到Android的测试设备上。

创建配置文件来构建要输出的JAR文件。为了生成配置文件,打开一个命令行终端,运行下面的命令:

/tools/android create uitest-project -n -t 1-p 

其中 是包含uiautomator测试源文件的测试项目名称。是对应的测试项目目录的路径。

进入包括测试项目目录下,使用命令antbuild构建测试的jar文件。

部署生成的的JAR文件到待测设备上。命令是:

db pushcommand:adb push /data/local/tmp/

7.  运行uiautomator测试用例

下面的例子演示了如何运行实现在 LaunchSettings.jar文件中的一个测试用例,该测试用例包含在com.uia.example.my包中。  

adb shelluiautomator runtest LaunchSettings.jar -c

com.uia.example.my.LaunchSettings

如果希望了解更多关于 uiautomator 的语法格式,子命令或者选项,请参考 uiautomator 的官方文档。

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