前言

通常来说,我们开发完成产品之后,都是由测试组或者是我们自己点一点,基本上没有问题了就开始上线。但是,随着时间的堆叠,一款产品的功能也越来越多。这时,我们为了保证产品的质量,就需要在每次测试时将所有的流程都走一遍。然而,对于一款庞大的产品来说这是困难又复杂的。因为我们自己手动测试需要花费大量的时间来完成主业务测试这种重复性工作。为了保证效率以及解决成本,我们就需要考虑将这些过程采用自动化测试来完成。

自动化测试介绍

何为自动化测试?自动化测试就是通过计算机将我们人工操作的动作自动完成,比如自动点击,自动填入文本等等。Android也提供了强大的自动化测试工具,那就是UIAutomator。官方介绍文档为:https://developer.android.google.cn/training/testing/ui-testing/uiautomator-testing.html#setup。

UIAutomator介绍

你可能会有疑问,这个自动化测试能完成什么内容?我来举个简单的例子:

这种登录界面就算没做过,但一定也见过。我们一般会在测试时输入用户名,密码,然后登录。那么自动化测试可以干什么呢?它可以自己输入用户名、密码,然后登录,一气呵成。你可能会觉得,就这还需要上自动化测试?NoNoNo,我这里只是举个例子,它能帮你完成任何事情。甚至是唤醒屏幕,输入图形验证码等都可以完成。

说到这里,肯定有同学已经跃跃欲试了,憋着急,慢慢来。

UIAutomator的使用

首先我们还是需要照着官方文档学习,上面已经提供过地址,将它打开。

配置

在Android的APP module中,加入以下依赖:

dependencies {...androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'
}

辅助工具

因为自动化测试是自动完成的,所以它需要先找到对应的View才能进行操作。然而怎么指定应该查找哪个View呢,Android提供了辅助工具uiautomatorviewer。相信很多同学对这个工具很熟悉。

它位于<android-sdk>/tools/目录下,使用命令行将其启动:

$ uiautomatorviewer

启动后找到Device Screenshot按钮,uiautomatorviewer将会通过adb开始截取手机上的界面,并开始分析View树,就像图中所示。这时随便选择一个空间,在右下角便会列出该View的一些关键信息。其中图中方框所标识的便是基本的,也是最常用的几项信息。这些信息用来在做自动化测试时给UIAutomator提供关键的查找信息。稍后便会用到。

创建测试类

我们需要专门搞一个类用来做自动化测试。如果使用的是AndroidStudio来进行开发,那么在创建工程之初,AndroidStudio会自动创建好一个Android的测试类,就像下面这样:

我们平常开发都是在main文件夹里开发,平常不会注意到另外两个文件夹androidTest以及test是做什么用的,今天你将会了解到它们是用来做什么的。

首先我们做Android测试所用的类就是位于androidTest文件夹下的那个自动创建好的类,我们将其打开:

在示例类ExampleInstrumentedTest的顶部有两个标注:

@RunWith(AndroidJUnit4.class)
@SdkSuppress(minSdkVersion = 18)

这两样是必须要配置的,Android的自动化测试框架是基于Android Testing Support Library的,它只能运行在Android4.3以上的设备,并且它需要和AndroidJUnitRunner一起工作才能完成测试。

如果是自己创建的类,那么一定要记得在类的上面添加注解:@RunWith(AndroidJUnit4.class),除此之外还需要将AndroidJUnitRunner设置为默认的TestRunner。

将AndroidJUnitRunner设置为默认的TestRunner需要在app的build.gradle文件中加入以下配置:

android {defaultConfig {testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}
}

好了,我们的测试准备工作已经完成,接下来就开始写测试执行过程了。

测试逻辑过程

这里还是使用登录页面做示例,该登录页面是由AndroidStudio模板自动生成的。

我们使用自动化测试完成的测试功能有,填入用户名、密码,然后登录。

我们需要先启动uiautomatorviewer:

启动之后的界面:

我们点击图中箭头所指的按钮,出现以下界面:

在左边的图中选择我们第一个要输入文字的EditText输入框,我们可以看到右边出现了这个View层级的属性结构以及该View的一些基本属性,在这里的的EditText的index为0,resource-id为com.sahadev.autotestforlogin:id/password,还有它是哪个类:android.widget.EditText。

得知这些基本信息之后,我们开始了解一下测试代码的执行过程:

  • 1.首先需要获得可以访问设备的上下文对象UiDevice,UiDevice的实例通过静态方法getInstance()获得,该方法需要传入一个Instrumentation对象。
  • 2.通过UiDevice的findObject()来找到UiObject,这个UiObject代表了刚刚我们指定的EditText。
  • 3.通过UiObject来模拟用户的真实操作,比如填入文本,或者点击等操作。由于这里是EditText,所以我们的工作就是填入文本,使用UiObject的setText()方法即可。

测试逻辑实现

有了以上的知识之后,我们来实现这个登录过程。

1.首先获得UiDevice对象:

mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());

2.通过指定的条件查找代表EditText的UiObject:

UiObject email = mDevice.findObject(new UiSelector().resourceId("com.sahadev.autotestforlogin:id/email"));

3.往EditText中写入邮箱地址:

email.setText("sahadev@foxmail.com");

好了,到这里如果执行的话,系统就会帮我们自动填入这个邮箱地址了。接下来我们的工作就是继续填入密码,然后点击登录。我们来完成剩下的代码。完整的代码如下:

package com.sahadev.autotestforlogin;import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SdkSuppress;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject;
import android.support.test.uiautomator.UiSelector;import org.junit.Before;
import org.junit.runner.RunWith;/*** Instrumentation test, which will execute on an Android device.** @see <a href="http://d.android.com/tools/testing">Testing documentation</a>*/
@RunWith(AndroidJUnit4.class)
@SdkSuppress(minSdkVersion = 18)
public class ExampleInstrumentedTest {private UiDevice mDevice;@Beforepublic void startMainActivityFromHomeScreen() {mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());UiObject email = mDevice.findObject(new UiSelector().resourceId("com.sahadev.autotestforlogin:id/email"));//填入邮箱地址email.setText("sahadev@foxmail.com");UiObject password = mDevice.findObject(new UiSelector().resourceId("com.sahadev.autotestforlogin:id/password"));//填入密码password.setText("123456");UiObject loginButton = mDevice.findObject(new UiSelector().resourceId("com.sahadev.autotestforlogin:id/email_sign_in_button"));//点击登录loginButton.click();}
}

基本的测试代码已经完成,接下来就是如何运行了。在AndroidStudio中点击运行按钮即可:

运行效果如下:

怎么样,有没有很想试一把的感觉呢?慢慢积累,它就是一个很庞大的工程了。今天的文章只是带大家入一下门,这个自动化测试工具本身很强大,可以完成很多工作。有更多的问题可以加群讨论。UIAutomator的官方介绍文档地址为:https://developer.android.google.cn/training/testing/ui-testing/uiautomator-testing.html,更多内容请点击查看。


我建了一个QQ群,欢迎对学习有兴趣的同学加入。我们可以一起探讨、深究、掌握那些我们会用到的技术,让自己不至于太落伍。

Android自动化测试探索相关推荐

  1. android 自动化测试

    Android 谈谈自动化测试 Android自动化测试原来可以这么简单 几款Android 应用自动化测试工具 Android自动化测试探索(一)adb详细介绍 - 周希 - 博客园 移动测试基础 ...

  2. 腾讯Android自动化测试实战

    腾讯Android自动化测试实战 丁如敏 盛娟 等著 图书在版编目(CIP)数据 腾讯Android自动化测试实战 / 丁如敏等著. -北京:机械工业出版社,2016.10 ISBN 978-7-11 ...

  3. 腾讯Android自动化测试实战导读

    前 言 Preface 为什么要写这本书 早在2010年年底,我们团队就有出一本关于移动互联网测试书籍的计划(那时候移动互联网测试书籍基本没有),当时计划的内容涉及面比较广,涵盖测试设计.测试用例管理 ...

  4. 《Android深度探索(卷1):HAL与驱动开发》——1.6节 Linux设备驱动

    本节书摘来自异步社区<Android深度探索(卷1):HAL与驱动开发>一书中的第1章,第1.6节 Linux设备驱动,作者李宁,更多章节内容可以访问云栖社区"异步社区" ...

  5. Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记

    Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记     本章学习了使用git下载两套源代码并搭建两个开发环境.分别为Android源代码和Linux内核源代码.A ...

  6. 《Android深度探索(卷1):HAL与驱动开发》——6.4节使用多种方式测试Linux驱动...

    本节书摘来自异步社区<Android深度探索(卷1):HAL与驱动开发>一书中的第6章,第6.4节使用多种方式测试Linux驱动,作者李宁,更多章节内容可以访问云栖社区"异步社区 ...

  7. Android深度探索第五章

    开发板是开发和学习嵌入式技术的主要硬件设备,开发板拥有许多扩展的端口,可以很容易开发定制的硬件,并与开发板链接.目前市面上的开发板型号和种类很多,但目前最流行的是基于三星S3C6410ARM11架构的 ...

  8. Android自动化测试-从入门到入门(5)AdapterView的测试

    在之前的文章中,我们简单介绍了Espresso的使用.通过onView()方法我们可以快速定位到界面上我们需要测试的目标元素.整体来说,onView()比较适用于UI比较简单的情况,在不需要过于复杂的 ...

  9. 新书出版:《Android深度探索(卷1):HAL与驱动开发》

    <Android深度探索(卷1):HAL与驱动开发> [1]亚马逊 [2]当当网 [3]京东商城 [4]互动网 [5]淘宝网 [6]豆瓣网 < Android深度探索(卷1):HAL ...

最新文章

  1. 神州数码使用telnet方式管理交换机
  2. 死磕Java并发:Java内存模型之总结
  3. Ajax简要应用说明及技术开发实例
  4. 【存储知识学习】第三章磁盘原理与技术3.1磁盘结构--《大话存储》阅读笔记
  5. $(@:_config=)的意思
  6. highcharts总结
  7. 深入源码理解.NET Core中Startup的注册及运行
  8. 【转】调用约定__cdecl、__stdcall和__fastcall的区别
  9. Android笔记 Android客户端从服务器获取源码乱码demo
  10. 我们大学的第一桶金!!(更新中。。。)
  11. PFC离散元仿真核心技术与应用
  12. 抖音视频什么时候投放dou+最好,dou+投放实战总结:国仁网络资讯
  13. 记录下IDEA导入web项目遇到的web facet问题
  14. tp6分页显示首页和尾页
  15. 【强化学习】手把手教你实现游戏通关AI(2)——Q-Learning
  16. Eureka常见问题解答
  17. 通过ip地址访问其他电脑的共享文件
  18. 微信小程序学习之JS模块化(总结)
  19. 第十一课_编程语言发展史
  20. 【虚拟语气练习题】unless

热门文章

  1. boost库学习入门篇
  2. 打印菱形星号组合C程序
  3. 困扰多年的PCB散热问题终于可以解决了!
  4. 为了杀蚊子,他用树莓派DIY了一把激光枪!
  5. 自己都不觉得自己值钱,别人怎么觉得你值钱?
  6. 我在深圳,但是家里托人在老家找了一份工作
  7. Qt删除 空格/空白符
  8. 高通8X25Q wifi BT 调试文档
  9. NILMTK——深扒组合优化(CO)和FHMM细节
  10. redis分布式锁java代码_基于redis实现分布式锁