Android自动化测试探索

前言

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

自动化测试介绍

何为自动化测试?自动化测试就是通过计算机将我们人工操作的动作自动完成,比如自动点击,自动填入文本等等。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
1
1
启动后找到Device Screenshot按钮,uiautomatorviewer将会通过adb开始截取手机上的界面,并开始分析View树,就像图中所示。这时随便选择一个空间,在右下角便会列出该View的一些关键信息。其中图中方框所标识的便是基本的,也是最常用的几项信息。这些信息用来在做自动化测试时给UIAutomator提供关键的查找信息。稍后便会用到。

创建测试类

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

这里写图片描述

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

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

这里写图片描述

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

@RunWith(AndroidJUnit4.class)
@SdkSuppress(minSdkVersion www.yongshiyule.cn/ = 18)
1
2
1
2
这两样是必须要配置的,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());
1
1
2.通过指定的条件查找代表EditText的UiObject:

UiObject email = mDevice.findObject(new UiSelector( www.xucaizxyl.com) .resourceId("com.sahadev.autotestforlogin:id/email"));
1
1
3.往EditText中写入邮箱地址:

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

package com.sahadev.autotestforlogin;

import android.support.test.www.6788878.cn/ 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. www.yongshiyule178.com 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;

@Before
public void startMainActivityFromHomeScreen( www.tips139.com/) {

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/ www.xinbeiyule.cn /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自动化用例的代码覆盖率,将最终使用的方法记录下来. 覆盖率监测的原理 覆盖率监测的原理跟iOS上的原理差不多,大致的思路参考下吧, iOS ...

  2. Android自动化测试探索(七)代码覆盖率统计

    之前在 https://www.cnblogs.com/zhouxihi/p/11453738.html 这篇写了一种统计Android覆盖率的方式 但是对于一些比较复杂或者代码结构不够规范的项目,有 ...

  3. Android自动化测试探索(二)常用自动化工具

    Android常用自动化工具 ADB - 是Google提供的为Android编写UI测试用例的自动化工具, Android开发/测试人员不可替代的强大工具 uiautomator - 是Google ...

  4. Android自动化测试探索(三)Android SDK tools安装、aapt配置以及使用aapt获取apk包名

    Android SDK tools安装 下载连接: https://www.androiddevtools.cn 找到对应mac的版本下载安装即可 AAPT配置 #1. 进入根目录 cd ~ #2. ...

  5. Android自动化测试探索(四)uiautomator2简介和使用

    uiautomator2简介 项目Git地址: https://github.com/openatx/uiautomator2 安装 #1. 安装 uiautomator2 使用pip进行安装, 注意 ...

  6. Android自动化测试探索(一)adb详细介绍

    adb详细介绍 #1. 基本简介 adb,即Android Debug Bridge,它是Android开发/测试人员不可替代的强大工具 #2. Mac上安装adb 安装brew /usr/bin/r ...

  7. 使用 flow.ci 实现 Android 自动化测试与持续集成

    在上篇文章--如何实现 Android 应用的持续部署中,我们使用的是 flow.ci + Github + fir.im 实现 Android 应用的持续部署.对于 Android 开发者,他们可能 ...

  8. Android自动化测试-Robotium(一)简介

    一.Robotium原理 Robotium是一款Android自动化测试框架,主要针对Android平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击.长按.滑动等).查找和断言机制的API ...

  9. 解放双手——Android自动化测试

    解放程序猿宝贵的右手(或者是左手) http://blog.csdn.net/eclipsexys/article/details/45622813 --Android自动化测试技巧 Google大神 ...

随机推荐

  1. Can not find the tag library descriptor for "http://java.sun.com/jsp/jstl/core"

    问题描述 今天写jsp的时候想用JSTL的一些标签,但是引用的时候碰到这个问题. 解决办法 一.看是否引用jstl.jar包,如果没有,则可以下载相应版本的jstr.jar包,并放入WEB-INF的l ...

  2. WD与循环 组合数学

    WD与循环 LG传送门 为什么大家都是先算\(n\)个数的和等于\(m\)的情况再求前缀和? 既然已经想到了插板法,为什么不直接对\(n\)个数的和\(\le m\)的情况做呢? 基本套路没有变:考虑 ...

  3. Verilog设计异步FIFO

    转自http://ninghechuan.com 异步FIFO有两个异步时钟,一个端口写入数据,一个端口读出数据.通常被用于数据的跨时钟域的传输. 同步FIFO的设计.一个时钟控制一个计数器,计数器增 ...

  4. javascript调用ActiveX接口失败的解决方案及使用心得

    前段时间公司做了个比较大的项目,需要用到ocx控件,我厂大部分项目都采用C#.net,而winform程序条用ocx控件接口是相对简单的,但是javascript调用ocx接口,却和winform的用 ...

  5. php ajax登录注册

    用户登录与退出功能应用在很多地方,而在有些项目中,我们需要使用Ajax方式进行登录,登录成功后只刷新页面局部,从而提升了用户体验度.本文将使用PHP和jQuery来实现登录和退出功能. 准备数据库 本 ...

  6. PairWork-电梯调度程序结对编程【附加题】

    1 接口改进 1) 之前判断电梯是否闲置的函数不太好理解,重新修改了,如下所示: //是否停顿状态(停止的以及开门间隔>=0) public bool IsIdle { get { return ...

  7. 【MOOC EXP】Linux内核分析实验七报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 可执行程序的装载 知识点梳理 一.预处 ...

  8. throws和throw抛出异常的使用规则

    一直对java中的throws和throw不太理解.最近一直在查这两个方面的资料,算是能明白一点吧.如果我下面的观点哪有不对,希望指出来,我加以改进.         throw:(针对对象的做法) ...

  9. [日常工作]Oracle新增数据文件的小知识点

    1. 表空间是small file tablespace的 然后数据文件长到了32g左右之后无法再次扩充, 应用报错了 为了性能和最快的处理 使用语句 alter tablespace user ad ...

  10. SQLSERVER安装

    sql server 2008 代理服务提供的凭据无效 sql server 2008 代理服务提供的凭据无效 在Windows Server 2008安装SQL Server 2008出现的问题: ...