以下内容选自《深入解析Android5.0系统》,京东,当当,亚马逊上有售。
除了对组成安卓应用的组件(例如:Activities,Services和ContentProviders)进行单元测试,测试应用程序运行在设备上时的界面也很重要。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属性作为ImageButton,ImageView,CheckBox 和其他界面控件的标签。
q 为EditText 输入框提供android:hint属性代替android:contentDescription属性。
q 用于反馈给用户信息(如状态、声明信息)的控件的图标应该包含android:hint属性
q 确保在使用方向控制键(如trackball或D-pad)时所有的UI元素也是可访问的,
q 使用uiautomatorviewer工具确保UI组件可以被uiautomator工具访问。
注意:为了识别不可访问的UI组件,请点击uiautomatorviewer工具的Toggle NAFNodes选项。
通常,Android应用开发者不需要考虑是否支持可访问性,因为它们都继承View和ViewGroup类。然而,对于使用定制组件来提供更丰富用户体验的应用,这些定制组件无法获得由标准组件才有的可访问性支持。如果你的测试应用有类似情况,确保应用实现了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 的官方文档。