Android 自动化测试(4)<uiautomator> 单元测试

在之前的系列文章中,我介绍过用java来实现过 Android
自动化测试(1)如何安装和卸载一个应用(java)
Android
自动化测试(2)根据ID查找对象(java)
;然后又介绍了用python语言来实现Android 自动化测试(3) 根据ID查找对象&touch&type
(python)
。还说过后续要写点关于单元测试和代码覆盖测试的文章。今天要介绍的就是单元测试。

1、 概要

做过java单元测试的同学,使用Android的单元测试比较简单,参见 如何进行Android单元测试,采用这种方式,业务逻辑上的测试在很多情况下,就已经解决了。还有一个明显的缺陷就是测试界面不方便。而对于android应用程序来说,界面占据了很重要的一个部分。

这个时候可以使用uiautomator.jar这个类库。  这里我不详细讲具体的Android 的 uiautomator类库怎么使用。具体的使用可以参见Android
UI Testing (英文版)
, 和 Android
uiautomator 使用入门官方教程(中文版)

2、核心类

我主要提一下里面最重要的核心类UiDevice、UISelector和UiObject ,如何查找对象和作用于对象是测试的核心。

UiDevice

Represents the device state. In your tests, you can call methods on the  UiDevice  instance to check for the state of various properties, such as current
orientation or display size. Your tests also can use the  UiDevice  instance to perform device level actions, such as forcing the device into a specific rotation, pressing the d-pad hardware button, or pressing the Home and Menu buttons.

UiDevice代表设备状态。在测试时,可以调用UiDevice实例的方法来检查不同属性的状态,如当前的屏幕旋转方向货展示大小。测试代码还能使用UiDevice实例来执行设备级的操作,如强制设备横竖屏,按压d-pad硬件按钮,或按压主屏幕键和菜单键。

获取UiDevice实例,模拟按压主屏幕键的代码如下: getUiDevice (). pressHome ();

UiSelector 

Represents a search criteria to query and get a handle on specific elements in the currently displayed UI. If more than one matching element is found, the first matching element in the layout hierarchy is returned as the target UiObject. When constructing
a  UiSelector , you can chain together multiple properties to refine your search. If no matching UI element is found, a UiAutomatorObjectNotFoundException  is thrown. You can use the  childSelector()  method to nest multiple  UiSelector  instances. For example,
the following code example shows how to specify a search to find the first  ListView  in the currently displayed UI, then search within that  ListView  to find a UI element with the text property Apps.

UiSelector代表一种搜索标准,可以在当前展示界面上查询和获取特定元素的句柄。若找到多于一个的匹配元素,则返回布局层次结构上的第一个匹配元素作为目标UiObject。当构造一个UiSelector对象时,可以使用链式调用多个属性来缩小查询范围。如无匹配元素,则返回异常 UiAutomatorObjectNotFoundException 。你还可以使用 childSelector()  方法来嵌套多个Uiselector实例。例如。下面的代码演示如何制定查询来定位在当前界面的第一个ListView,然后在返回的ListView内定位一个带有Apps文本属性的界面元素。

UiObject  appItem  =   new   UiObject ( new   UiSelector () . className ( “android.widget.ListView” ). instance ( 1 ) . childSelector ( new   UiSelector (). text ( “Apps” )));

  UiObject 

Represents a UI element. To create a  UiObject  instance, use a UiSelector that describes how to search for, or select, the UI element.

The following code example shows how to construct  UiObject  instances that represent a Cancel button and a OKbutton in your application.

UiObject代表一个UI元素。为创建一个UiObject实例,使用用来描述如何搜索、选定UI元素的UiSelector实例:

UiObject  cancelButton  =   new   UiObject ( new   UiSelector (). text ( “Cancel” ));
UiObject  okButton  =   new   UiObject ( new   UiSelector (). text ( “OK” ));

You can reuse the  UiObject  instances that you have created in other parts of your app testing, as needed. Note that the uiautomator test framework searches
the current display for a match every time your test uses a  UiObject instance to click on a UI element or query a property.

In the following code example, the uiautomator test framework searches for a UI element with the text property OK. If a match is found and if the element is enabled, the framework simulates a user click action on the element.You can also restrict the
search to find only elements of a specific class. For example, to find matches of the  Button class:

必要时,可以重用测试项目中已经创建的UiObject实例。注意,测试用例每次使用UiObject实例来点击UI元素或查询属性时,uiautomator测试框架会搜索当前的界面来寻找匹配。在下面的代码中,uiautomator测试框架搜索带有OK文本属性的UI元素。若发现匹配,并且该元素启用,框架会模拟用户的在该元素上的点击操作。

if ( okButton . exists ()   &&  okButton . isEnabled ()) {
    okButton . click ();
}

还可以限制搜索在几个特定的类中寻找元素,例如,为发现Button类的匹配:

UiObject  cancelButton  =   new   UiObject ( new   UiSelector (). text ( “Cancel” ) .className ( “android.widget.Button” ));
UiObject  okButton  =   new   UiObject ( new   UiSelector (). text ( “OK” ) .className ( “android.widget.Button” ));

3、 详细样例,注意类库中需要引用android.jar和uiautomator.jar包啊

package xzy.test.uiautomator;

import java.io.IOException;

import android.os.RemoteException;

import com.android.uiautomator.core.UiDevice;
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 CalTest extends UiAutomatorTestCase {

	public void testDemo() throws UiObjectNotFoundException, RemoteException {

		UiDevice device = getUiDevice();
		// 唤醒屏幕
		device.wakeUp();
		assertTrue("screenOn: can't wakeup", device.isScreenOn());
		// 回到HOME
		device.pressHome();
		sleep(1000);

		// 启动计算器App
		try {
			Runtime.getRuntime().exec(
					"am start -n com.android.calculator2/.Calculator");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		sleep(1000);
		UiObject oneButton = new UiObject(new UiSelector().text("1"));
		assertTrue("oneButton not found", oneButton.exists());
		UiObject plusButton = new UiObject(new UiSelector().text("+"));
		assertTrue("plusButton not found", plusButton.exists());

		sleep(100);

		UiObject equalButton = new UiObject(new UiSelector().text("="));
		assertTrue("equalButton not found", equalButton.exists());

		oneButton.click();
		sleep(100);
		plusButton.click();
		sleep(100);
		oneButton.click();

		equalButton.click();
		sleep(100);

		UiObject switcher = new UiObject(
				new UiSelector()
						.resourceId("com.android.calculator2:id/display"));
		UiObject result = switcher.getChild(new UiSelector().index(0));
		System.out.print("text is :" + result.getText());
		assertTrue("result != 2", result.getText().equals("2"));
	}
}

4、总结一下

单元测试比较简单,但是很有效,对于要做自动化测试的团队,和要提供稳定而又质量的交付,单元测试是很重要的噢 。Android已经有一套非常完善的单元测试支持了,UI测试也 OK

5、后面会介绍一些采用 robotium 框架进行 Android Unit
Test  & Android Code Coverage Test

时间: 2024-10-19 20:15:04

Android 自动化测试(4)<uiautomator> 单元测试的相关文章

【转】Android自动化测试(UiAutomator)简要介绍

一.一个BUG引发的问题 如果研发过程中有一个BUG:“不断的切换手机语言出现花屏现象”.这个问题我们如何验证呢?我想,最好的方式应该是自动化测试.    那么,自动化测试可以完成哪些任务呢?    简单的说,那些重复性的测试工作,都可以交给自动化完成:        1.设置手机的语言        2.添加.删除.收藏联系人        3.拨号.挂断        4.甚至发送短信.收藏短信 如果需要上面的功能,那么就开始自动化之旅吧. 二.Android自动化测试简单介绍 Androi

Android自动化测试(UiAutomator)

一.一个BUG引发的问题 如果研发过程中有一个BUG:“不断的切换手机语言出现花屏现象”.这个问题我们如何验证呢?我想,最好的方式应该是自动化测试.    那么,自动化测试可以完成哪些任务呢?    简单的说,那些重复性的测试工作,都可以交给自动化完成:        1.设置手机的语言         2.添加.删除.收藏联系人         3.拨号.挂断         4.甚至发送短信.收藏短信 如果需要上面的功能,那么就开始自动化之旅吧. 二.Android自动化测试简单介绍 And

Android自动化测试-UiAutomator环境搭建

Android自动化测试-UiAutomator环境搭建 一.环境准备 1. 安装android sdk,并配置环境变量 2. 安装android studio,国内访问官网受限,如果下载不到,可以到我的百度云盘下载: https://pan.baidu.com/s/1bpq5wK3 此云盘中有uiautomator2所依赖的jar包,可以同时下载 二.新建Android Studio工程 新建一个project,输入application name,下一步, 默认选择,下一步, 选择 empt

Android 自动化测试(5)&lt;robotium&gt;

关于Android的自动化测试之UI测试,之前介绍过Android 自动化测试(4)<uiautomator>, 在android原生的单元测试框架上,利用uiautomator.jar这个类库来完成Android的界面上的测试,这已经使得测试比较简单了.但还有更加简单的写测试的方式,那就是利用一些第三方的测试框架,比如robotium. Android的第三方的测试框架,有Robolectric 和 robotium,我试着用了下,觉得robotium已经非常好用了. 1.概要 Roboti

对自己开发的产品负责——《腾讯Android自动化测试实战》

Android应用由于设备内存有限.网络连接不稳定.迭代速度快.用户体验要求高等原因,加上测试人员需要面对 Native.WebView 和 HTML5 等不同技术,造成了单元测试.性能测试.压力测试. 兼容性测试.速度测试等各方面都更大的挑战性.因此开发人员必须为自己开发的产品负责,在交付测试人员之前进行Android自动化测试. 腾讯移动品质中心的核心成员秉承"为自己开发的产品负责"的原则,把多年来在移动测试领域的探索和实践总结成了<腾讯Android自动化测试实战>.

Android 自动化测试(3)&lt;monkeyrunner&gt; 根据ID查找对象&amp;touch&amp;type (python)

我在之前的两篇文章中用java来实现过 Android 自动化测试(1)如何安装和卸载一个应用(java).Android 自动化测试(2)根据ID查找对象(java). 但是本质上都是用monkeyrunner对应的java lib 来实现的,但是相关的文档非常少,如果真的要用monkeyrunner来做功能性的自动化测试,强烈还是推荐使用python语言 1.monkey runner The monkeyrunner tool provides an API for writing pro

Android 自动化测试框架

Android常用的自动化测试工具框架: Monkey,MonkeyRunner,UIAutomator,Robotium,Appium,Monkey Talk 但是这些工具框架都有什么关系呢,先通过一张图来了解一下吧.(图是某博客上借过来的) 是不是一脸懵逼,不知道这是什么鬼.下面详细了解一下. 一.Monkey 是Android SDK自带的测试工具,是一个命令行工具,可以运行在模拟器中或者实际设备中,它向系统发送伪随机的用户事件流(如按键输入,触摸屏输入,手势输入等),实现对正在开发的应用

Android自动化之uiautomator(一)

一.uiautomator简介 Android SDK提供下述工具来支持自动化的功能界面测试: 1.uiautomatorviewer:扫描.分析待测应用的UI组件的图像工具. 2.uiautomator:包含创建定制功能界面测试API和自动化运行测试用例的引擎的JAVA类库. 优点:可以对所有操作进行自动化,操作简单: 缺点:Android版本需要高于4.0. 二.Uiautomator常用API了解 以下是uiautomator最基本最常用到的三个类,这里只是简单地介绍这三个类的作用,后续本

Android 自动化测试--要点概括

Android自动化测试 :Top-Down的要点概括 一.测试方法 1.功能型测试  monkeyrunner.uiautomator 2.随机事件测试  monkey 二.发现问题 3.监测内存是否有泄露     工具 4.监测是否有ANR            日志 (/data/anr) 5.监测是否有Crash         日志(/data/system/dropbox) 6.监测CPU是否有问题    日志(/data/anr) 7.监测流量是否有问题     工具 三.解决问题