android自动化测试-UiAutomator使用入门

本文详细介绍了UiAutomator作为Android UI测试工具的优势,包括其丰富的接口、易于使用的特性以及与代码实现细节无关的黑盒测试能力。并通过实例展示了如何使用uiautomatorviewer进行界面分析,以及如何编写测试脚本来模拟应用操作。同时提供了从准备工作到编译测试用例的完整流程,包括添加必要的Jar包、创建测试类和方法、生成build.xml文件以及执行测试的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么选择UiAutomator

作为亲儿子UiAutomator随Android同步推出,随Android版本同步升级,经过多次迭代目前已经相当稳定。
相比MonkeyRunner,UiAutomator接口丰富易用,可以支持所有Android事件操作,事件操作不依赖于控件坐标,可以通过断言和截图验证正确性,非常适合做UI测试。
UIAutomator不需要测试人员了解代码实现细节,属于功能和黑盒测试。测试代码结构简单,编写容易,学习曲线低。基于JAVA,一次编译可以运行于所有Android设备。

注: UIAutomator不适合OpenGL和HTML为主的程序,因为这类程序未使用Android的view体系。

UIAutomator的使用准备


1.首先介绍UIAutomator测试框架的UI工具:uiautomatorviewer
uiautomatorviewer位于sdk/tools目录下,可以扫描、分析待测试应用界面,分析结果可以导出为xml与截图。通过该工具可以分析出UI控件的id,text,focusable等等各种属性,甚至布局上的层次关系。
可以在DDMS中启动,如下:



上图uiautomatorviewer的运行截图,左侧为手机当前画面截图,右侧上部为view控件的层次关系,下部为当前选中控件的各种信息。在左侧屏幕上选择一个组件,可以查看到该控件的属性,在我们写脚本的时候则可以根据对应的属性信息找到该控件然后对控件进行操作,或者根据某些属性进行判断,比如是否可点击等~

2.uiautomator简介
uiautomator是一个包含一套UI测试API,和支持运行测试程序的JAR包。该JAR包位于sdk/platforms/android-*/uiautomator.jar.
使用时需要注意自己的SDK版本需要大于16, SDK Tools版本需要大于21。
uiautomator的使用说起来其实很简单,根据属性找到控件,然后对该控件进行操作,大概如下图:


uiautomator的使用步骤

下面用一个例子介绍uiautomator的使用。在该例子中我们将模拟APP的登录并退出。
以Eclipse为例:
1.创建一个Java工程
File-->New-->Java Project  输入工程名称,例如MessageTsetCase. 点击Finish

2.添加必要的Jar包
在Project Explorer中右击刚刚创建的这个工程,选择 Properties-->Java build Path添加如下JAR包
a.选择Add library -->JUnit选择Junit3
b.选择Add External JARS, 选择sdk/platforms/android-*/目录下的uiautomator.jar和android.jar,路径中的*请使用自己以下载的最新版本。

3.File-->new-->Class创建一个新的文件。

4.编写测试用例,通常可以为一个测试用例编写一个单独的方法:
package com.iflytek.test;

import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiSelector;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;

public class MessageTestCase extends UiAutomatorTestCase {
    public void testDemo() throws UiObjectNotFoundException {
        
        // 模拟 HOME 键点击事件
    	getUiDevice().pressHome();
        // 找到 Apps tab 按钮
        UiObject appsTab = new UiObject(new UiSelector().text("智慧社区"));
        appsTab.click();
        
        //按返回键退出
        getUiDevice().pressBack();
        getUiDevice().pressBack();
        getUiDevice().pressBack();
        getUiDevice().pressBack();
        	
        sleep(2000);
        
        // 打开APP
        if (appsTab.exists()) {
        	appsTab.clickAndWaitForNewWindow();
        	sleep(5000);
		}
        	
        // 进入我的页面
        UiObject myTab = new UiObject(new UiSelector().text("我的"));
        myTab.clickAndWaitForNewWindow();

        //设置循环次数
        for(int i =20; i > 0; i--){
        // 进入登录页
        UiObject Login = new UiObject(new UiSelector().resourceId("com.iflytek.smartzone:id/mine_login_layout"));
        if (Login.exists()) {			
        	Login.clickAndWaitForNewWindow();
        	// 输入用户名密码
        	UiObject username = new UiObject(new UiSelector().resourceId("com.iflytek.smartzone:id/login_editUser"));
        	username.clearTextField();
        	username.setText("18019900009");
        	UiObject passwd = new UiObject(new UiSelector().resourceId("com.iflytek.smartzone:id/login_editPassword"));
        	passwd.clearTextField();
        	passwd.setText("111111");
        	//点击登录按钮
        	UiObject login = new UiObject(new UiSelector().text("登录"));
        	login.clickAndWaitForNewWindow();
		}
        
        //登出
        UiObject myinfo = new UiObject(new UiSelector().resourceId("com.iflytek.smartzone:id/mine_head_layout"));
        myinfo.click();
        UiObject loginout = new UiObject(new UiSelector().resourceId("com.iflytek.smartzone:id/person_info_exitlogin"));
        loginout.click();
        UiObject okbt = new UiObject(new UiSelector().text("确认退出"));
        okbt.clickAndWaitForNewWindow();
        }
    }
}



5.编译测试用例
在编译之前我们先要生成build.xml,生成方法如下:

<android-sdk>/tools/android create uitest-project -n <name> -t 3 -p <path>

其中<name>是包含uiautomator测试源文件的测试项目名称,<path> 是对应的测试项目目录的路径。
-t 后面的参数是android版本在当前sdk中的target值,通常一个sdk中我们会下载多个版本的android platform
可以通过一下命令查看:
<android-sdk>/tools/android list

输出如下:
  1. </pre><pre name="code" class="html">Available Android targets:----------id: 1 or "android-16"     Name: Android 4.1.2     Type: Platform     API level: 16     Revision: 4     Skins: WQVGA400, WSVGA, WXGA800, HVGA, WVGA854, QVGA, WVGA800 (default), WQVGA432, WXGA720, WXGA800-7in Tag/ABIs : default/armeabi-v7a----------id: 2 or "android-19"     Name: Android 4.4.2     Type: Platform     API level: 19     Revision: 3     Skins: WQVGA400, WSVGA, WXGA800, HVGA, WVGA854, QVGA, WVGA800 (default), WQVGA432, WXGA720, WXGA800-7in Tag/ABIs : default/armeabi-v7a----------id: 3 or "android-20"     Name: Android 4.4W     Type: Platform     API level: 20     Revision: 1     Skins: WQVGA400, WSVGA, WXGA800, HVGA, WVGA854, QVGA, WVGA800 (default), WQVGA432, WXGA720, WXGA800-7in, AndroidWearRound, AndroidWear Square, AndroidWearRound, AndroidWearSquare Tag/ABIs : android-wear/armeabi-v7a, android-wear/x86  

这里应该和之前添加Library选择的一致或更新,所以-t 后面我写的是1.

运行后输出如下:
Updated file D:\Users\qxb-810\workspace\MessageTestCase\build.xml

到此,build.xml已经生成完毕,下面我们进入到工程目录下进行编译:
ant build



然后将这个jar文件拷贝到手机的 /data/local/tmp/ 目录中:
adb push D:\Users\qxb-810\workspace\MessageTestCase\bin\MessageTestCase.jar /data/local/tmp

最后在手机里面执行这个case即可:

adb shell uiautomator runtest MessageTestCase.jar -c com.iflytek.test.MessageTestCase



写uiautomate测试脚本时常用的一些类见下篇: android自动化测试-UiAutomator常用类

### Uiautomator Android Automation Testing Framework #### 什么是UiAutomator? `uiautomator` 是 Android 提供的一个用于执行自动化功能界面测试的框架。它由两部分组成:一个是 `uiautomatorviewer` 工具,另一个是 `uiautomator` 类库[^1]。 #### UiAutomatorViewer 的作用 `uiautomatorviewer` 是一个图形化工具,主要用于扫描和分析 Android 应用程序中的 UI 组件。通过该工具可以捕获屏幕截图并显示当前活动窗口的视图层次结构,帮助开发者识别和定位 UI 元素以便编写测试脚本[^1]。 #### UiAutomator 类库的功能 `uiautomator` 类库是一个 Java 库,提供了 API 来创建自定义的功能 UI 测试,并包含了一个执行引擎以自动化和运行这些测试案例。此库允许跨多个应用程序进行交互操作,从而验证不同应用之间的兼容性和功能性[^1]。 以下是使用 `uiautomator` 编写简单测试的例子: ```java import android.support.test.uiautomator.UiDevice; import android.support.test.uiautomator.By; import android.support.test.uiautomator.Until; public class ExampleTest { public static void main(String[] args) throws Exception { // 初始化设备实例 UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); // 启动目标应用 String appName = "com.example.myapp"; Intent intent = new Intent(Intent.ACTION_MAIN); intent.setPackage(appName); device.startActivity(intent); // 等待特定控件加载完成 device.wait(Until.hasObject(By.text("Login")), 5000); // 查找按钮并通过点击触发动作 UiObject button = device.findObject(new UiSelector().text("Login")); if (button.exists()) { button.click(); } } } ``` 这段代码展示了如何启动指定的应用程序、等待某个控件出现以及模拟用户点击行为。 #### 设备化单元测试分类 除了单独讨论 `uiautomator` 外,在更广泛的范围内,Android 还支持多种类型的设备化单元测试,其中包括但不限于: - **设备化单元测试**:构建依赖于真实 Android 平台环境而非模拟对象的复杂单元测试。 - **组件集成测试**:验证那些不直接面向用户的组件的行为,比如服务或内容提供者。 - **UI 集成测试**:确保单个应用内部或者跨越多个应用时用户体验的一致性与正确性[^3]。 #### 使用场景对比 当提到其他类似的解决方案如 Appium 和 Robot Framework 实现的 Appium 库时,需要注意的是它们分别采用 Python 脚本驱动方式或是基于 Robot Framework 架构设计而成。尽管如此,这两种方案本质上都属于更高层抽象级别上的封装形式,而底层仍然可能调用了像 Selenium 或者此处提及到的 `uiautomator` 基础设施作为支撑点之一[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值