[转]Android UI 自动化测试

介绍

Android测试支持库包含UI自动化模块,它可以对Android应用进行自动黑盒测试。在API Level 18中引入了自动化模块,它允许开发者在组成应用UI的控件上模仿用户行为。

在这个教程中,我将展示如何使用此模块来创建和执行一个基本的UI测试,选择默认的计算器模块进行测试。

先决条件

在使用前,需要具备以下条件:

  1. 最新版本的Android Studio
  2. 运行Android 4.3或者更高版本的设备或者虚拟器
  3. 理解JUnit

1. 安装依赖库

工程中使用UI自动化模块,需要编辑你的工程下app目录下的文件build.gradle,添加如下依赖:

androidTestCompile ‘com.android.support.test:runner:0.2‘
androidTestCompile ‘com.android.support.test:rules:0.2‘
androidTestCompile ‘com.android.support.test.uiautomator:uiautomator-v18:2.1.0‘

如果使用的是库appcompat-v7 且其版本号是23.1.0,你需要添加如下依赖以确保应用本身和测试应用都使用相同版本的com.android.support:support-annotations:

androidTestCompile ‘com.android.support:support-annotations:23.1.0‘

2. 创建测试类

创建一个新的测试类,CalculatorTester,通过在 androidTest 目录下创建名为CalculatorTester.java 的文件实现。创建的UI自动化测试用例,必须继承自InstrumentationTestCase

重写setUp方法,并添加testAdd方法。到此CalculatorTester类定义如下:

  public class CalculatorTester extends InstrumentationTestCase{

      @Override
      public void setUp() throws Exception {                    

      }                                                        

      public void testAdd() throws Exception {                  

      }
  }  

3、查看Launcher UI

连接你的Android设备到电脑商,点击home按键,进入主界面。

返回到你的电脑,使用文件管理或者终端浏览你安装Android SDK的目录,进入到 tools目录下,点击 uiautomatorviewer 。这个会启动 UI Automater Viewer ,你将看到如下界面:

点击上方手机图标来获取Android设备截屏。注意到此时获取到的截屏是可交互的。点击下面的Apps图标。在右方的 Node Detail 区域,你就可以看到根据选择图标的不同显示不同的详细信息,如下图所示:

与屏幕上的应用交互,UI自动化测试需要能唯一识别它们。在这个教程中,可以使用应用的textcontent-desc或者class字段来唯一的区分。

从上图可以看到Apps图标没有text字段,但有content-desc。记下它的值,后面将用到这个值。

拿起Android设备,触摸Apps图标,进入设备安装的所有应用界面。使用 UI Automater Viewe 获取另外一张屏幕截图。因为要写一个计算器应用的测试,点击计算器图标查看详细界面。

这次content-desc是空的,但是text的值为Calculator,同样记住这个值。

如果你的Android设备运行不同的主界面或者不同的Android版本,界面和显示的细节会有所不同。这意味着后续代码中需要做一些修改,以匹配你的操作系统。

4、准备测试环境

返回到Android Studio,给setUp方法中添加代码。如同其名字,setUp方法是用来准备测试环境的。换句话说,这个方法是在真正测试之前指定具体需要执行什么动作的。

现在需要写代码来模拟刚才在Android设备上执行的几个动作:
1、按home键进入主界面
2、按Apps图标进入应用界面
3、点击计算器图标启动它

在你的类中声明类型为UiDevice的变量device。它代表你的Android设备,后续使用它来模拟用户行为。

private UiDevice device;

setUp方法中,通过调用UiDevice.getInstance method来初始化device,传递Instrumentation实例,如下所示:

device = UiDevice.getInstance(getInstrumentation());

模拟点击设备home键,需要调用pressHome方法。

device.pressHome();

接下来,需要模拟点击Apps图标的动作。不能立即做这个动作,因为Android设备需要一个反应时间来加载界面。如果在屏幕显示出来之前执行这个动作就会引起运行时异常。

等待一些事情发生时,需要调用UiDevice实例的wait方法。等待Apps图标显示到屏幕,使用Until.hasObject方法。

识别Apps图标需要使用By.desc方法并传递值为Apps的参数。你还需要指定最长等待时间,单位为毫秒。此处设置为3000。
至此形成如下代码段:

device.wait(Until.hasObject(By.desc("Apps")), 3000);

要获取Apps图标的引用,需要使用findObject方法。一旦有了Apps图标的引用,就可以调用click方法来模拟点击动作了。

UiObject2 appsButton = device.findObject(By.desc("Apps"));
appsButton.click();

和前面一样,我们需要等待一些时间,保证计算器图标显示到屏幕上。在之前的步骤中,我们看到可以通过text字段唯一的识别计算器图标。我们调用By.text方法来找到图标,传递参数为Calculator

device.wait(Until.hasObject(By.text("Calculator")), 3000); 

5、检查计算器UI

在你的Android设备上启动计算器应用,使用 UI Automater Viewer 来查看显示。获取到一个截屏后,点击不同的按钮来观察使用何值可以唯一的区分它们。

在本次测试用例中,使用计算器计算 9+9= 的值并确认结果是否为 18。这意味着你需要知道怎么区分按键 9、+ 和 =。

在我的设备上,如下是我收集到的信息:

  1. 数字按键匹配text
  2. + 和 = 使用content-desc值,分别对应 plus 和 equals
  3. 返回值显示在EditText控件中

如果你使用不同版本的计算器应用,请注意这些值有可能不一样。

6、创建测试类

在前面几步操作中,你已经学会了使用findObject方法通过By.text或者By.desc来获取屏幕上不同对象的引用。还学会了通过click方法来模拟点击对象的动作。下面的代码使用这些方法来模拟 9+9=。添加这些到类CalculatorTester的方法testAdd中。

        device.wait(Until.hasObject(By.text("9")), 3000);

        UiObject2 buttonNine = device.findObject(By.text("9"));
        buttonNine.click();

        UiObject2 buttonPlus = device.findObject(By.desc("plus"));
        buttonPlus.click();

        buttonNine.click();

        UiObject2 buttonEquals = device.findObject(By.desc("equals"));
        buttonEquals.click();

现在就等待运行结果。此处不能使用Until.hasObject,因为包含计算结果的EditText已经显示在屏幕上了。取而代之,我们使用waitForIdle方法来等待计算完成。同样,最长等待时间是3000毫秒。

device.waitForIdle(3000);

使用findObjectBy.clazz methods方法获取EditText对象的引用。一旦有了此引用,就可以调用getText 方法来确定计算结果是否正确。

UiObject2 resultText = device.findObject(By.clazz("android.widget.EditText"));
String result = resultText.getText();

最后,使用assertTrue来检验范围值是否为18。

assertTrue(result.equals("18"));

测试到此结束。

6、执行测试

执行测试,需要在Android Studio的工具栏中选择CalculatorTester,点击它右方的play按钮。

一旦编译结束,测试就成功运行完整。当测试运行时,在你的Android设备上就会看到UI自动化运行界面。

7. 完整代码

public class CalculatorTester extends InstrumentationTestCase {

    private UiDevice device;

    @Override
    protected void setUp() throws Exception {
        device = UiDevice.getInstance(getInstrumentation());
        device.pressHome();
        device.wait(Until.hasObject(By.desc("Apps")), 3000);

        UiObject2 appsButton = device.findObject(By.desc("Apps"));
        appsButton.click();

        device.wait(Until.hasObject(By.text("Calculator")), 3000);

        UiObject2 calButton = device.findObject(By.text("Calculator"));
        calButton.click();

        testAdd();
    }

    public void testAdd() throws Exception {
        device.wait(Until.hasObject(By.text("9")), 3000);

        UiObject2 buttonNine = device.findObject(By.text("9"));
        buttonNine.click();

        UiObject2 buttonPlus = device.findObject(By.desc("plus"));
        buttonPlus.click();

        buttonNine.click();

        UiObject2 buttonEquals = device.findObject(By.desc("equals"));
        buttonEquals.click();

        device.waitForIdle(3000);

        UiObject2 resultText = device.findObject(By.clazz("android.widget.EditText"));
        String result = resultText.getText();

        assertTrue(result.equals("18"));
    }
}

总结

在这篇教程中,我们学会了如何使用UI自动化测试模块和 UI Automater Viewer 来创建用户界面测试。你也看到了使用Android Studio执行测试是如此简单。虽然我们测试了一个相对简单的应用,但可以将从中学到的概念用到几乎所有Android应用的测试中。

你可以在Android 开发者网站中 学习更多关于测试支持库的知识。

时间: 2024-08-04 15:52:43

[转]Android UI 自动化测试的相关文章

Android测试(六):Android UI自动化测试

Android测试(六):Android UI自动化测试 发布时间 2017年12月20日 虫师 原文:https://developer.android.com/training/testing/ui-testing/index.html 用户界面(UI)测试可以确保你的应用程序满足其功能要求,并达到用户最可能成功采用的高质量标准. UI测试的一种方法是简单地让人类测试人员在目标应用程序上执行一组用户操作,并验证其行为是否正确. 但是,这种手动方法可能耗时.乏味.且容易出错.更有效的方法是编写

Android Espresso(UI自动化测试)的搭建

Espresso是Google官方提供的Android UI自动化测试的框架. 为什么叫Espresso(浓咖啡),好像是想让Android码农们轻松的写完自动化用例后能享受着咖啡,看着自动化测试"飞". 这是Espresso官方的地址.另外,也推荐大家看这个YouTube上关于Espresso环境搭建的短视频. Espresso环境搭建 下面将基于Android Studio,介绍如何搭建Espresso. 1. 在Android Studio中新建一个Project; 2. 修改P

【腾讯TMQ】解放程序猿(媛)的双手—iOS UI自动化测试

解放程序猿(媛)的双手-iOS UI自动化测试 前言 随着移动互联网时代的蓬勃发展,移动终端的自动化测试也在业界日益活跃,总体来看在Android平台上的自动化工具和实践比较多,但是说到iOS平台无论从自动化工具的数量还是质量上就陡降了.究其原因,无外乎是iOS系统的封闭性,加上相对Android用户的数量少,导致对这个平台系统的自动化进展缓慢,据笔者了解到的情况,很多iOS平台的测试人员还处于纯手工测试模式,自动化程度和Android平台无法相论,更别提和PC端相比了. 然而越是困难的事,越是

软件测试培训 UI 自动化测试详解

软件测试培训小编有好久都没有跟新软件测试,从今天开始,小编会逐渐把这部分知识给大家补上!今天这篇文章给大家介绍的是: UI 自动化测试 互联网产品的迭代速度远高于传统软件,尤其是移动APP不但更新频繁,还需要在不同硬件.系统版本的环境下进行大量兼容测试,这就给传统测试方法和测试工具带来了巨大挑战.为满足产品敏捷开发.快速迭代的需求,自动化测试逐渐流行起来.自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程. 自动化测试的优点很多,简单罗列几条:避免重复工作.提高测试效率.保证每次测试地一

APP的UI自动化测试框架及平台化探索

顾铮,10年+测试及测试开发相关经验,2014年加入京东,曾主导设计开发UI测试框架,参与CI测试平台建设,现负责iOS侧的工具,框架建设.在UI自动化,性能测试,单元测试方面有较深入研究,在App,web端等有较丰富的测试开发和设计经验. >>>> 写在前面 关于UI测试的文章,多数是通过架构的演进,或是重构,或是推翻重做来讲述的.今天我想讲述我的"一步到位"的测试框架设计.当然,这个"一步到位"是加引号的,并不是说没有持续的优化或改进,而

Android UI设计之<十>自定义ListView,实现QQ空间阻尼下拉刷新和渐变菜单栏效果

转载请注明出处:http://blog.csdn.net/llew2011/article/details/51559694 好久没有写有关UI的博客了,刚刚翻了一下之前的博客,最近一篇有关UI的博客是在2014年写的:Android UI设计之<七>自定义Dialog,实现各种风格效果的对话框,在那篇博客写完后由于公司封闭开发封网以及其它原因致使博客中断至今,中断这么久很是惭愧,后续我会尽量把该写的都补充出来.近来项目有个需求,要做个和QQ空间类似的菜单栏透明度渐变和下拉刷新带有阻尼回弹的效

如何提高UI自动化测试的质量

背景 项目是基于Ruby on Rails开发的web程序,应该说项目中的测试实践是很好的,具有高覆盖率的单元测试以及比较合理的集成测试.存在的问题是,所有的单元测试和集成测试都是针对后端代码的,前端的JavaSript代码没有单元测试(这个是有历史原因的,暂时没法改变).这也就意味着针对前端UI的修改是没有底层的单元测试来保障的,只能依靠高层级的UI自动化测试和手工测试来保障. 我们最近刚刚完成了一个story,是纯前端的开发工作,结果在上线后发现我们在修改页面模板文件时,忘记了其他地方也在使

【转】Android UI系列-----时间、日期、Toasts和进度条Dialog

原文网址:http://www.cnblogs.com/xiaoluo501395377/p/3421727.html 您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内容有任何疑问, 可以通过评论或发邮件的方式联系我: [email protected] / [email protected] 如果需要转载,请注明出处,谢谢!! 本篇随笔将继续学

Android UI学习 - ListView (android.R.layout.simple_list_item_1是个什么东西)

Android UI学习 - ListView 2010-06-20 18:21:35 标签:Android UI 移动开发 ListView ListActivity 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://android.blog.51cto.com/268543/336162 ListActivity ListActivity是一个专门显示ListView的Activity类,它内置了ListView对象,只要我