【Android测试】【第十八节】Espresso——环境搭建
◆版权声明:本文出自胖喵~的博客,转载必须注明出处。
转载请注明出处:http://www.cnblogs.com/by-dream/p/5604642.html
前言
首先还是老规矩,看看官方文档吧。为了防止我读完后再写遗漏什么,因此直接把我翻译的也写出来。
官方原文参考地址:https://developer.android.com/topic/libraries/testing-support-library/index.html#Espresso
Espresso译文
Espresso提供了一系类API可以让用户在App的内部通过UI测试来完成测试。这些API能够让UI自动化写起来简单并且运行起来也可靠。Espresso特别的适合做白盒测试,尤其是测试代码在能够知道应用程序的代码实现细节后来进行测试。
Espresso框架的主要功能包括:
1、灵活的API可以匹配到当前应用程序的view和adapter;
2、丰富的API可以自动化的来模拟UI操作;
3、UI线程同步,提高了测试的可靠性。
当然需要Requires Android 2.2 (API level 8) 或之上的版本才可以支持。
View macthing
Espresso.onView()这个方法可以让你在目标程序上访问一个UI组件,并且和它交互。该方法接收一个Matcher参数并且搜索视图层次结构来查找满足一定要求的视图实例。你可以指定这样的标准来细化搜索:
1、The class name of the view
2、The content description of the view
3、The R.id of the view
4、Text displayed in the view
例如有一个id为imy_button的按钮,我们就可以用这样的方式来指定matcher:
onView(withId(R.id.my_button));
如果搜索成功,onView()就会返回一个引用,你可以用它来模拟用户的动作或者是做断言操作。
Adapter matching
在AdapterView的布局中,都是运行的过程中动态的填充子view。如果你的目标view是AdapterView的子类(例如 ListView 或 GridView),onview()方法就可能失效了,因为只有布局的视图的子集才可以加载到当前的视图层次结构。
取而代之的,你使用 Espresso.onData() 方法就可以访问到view的元素。该方法同样返回一个引用,并且可以让你模拟用户动作并且在AdapterView当中对元素做断言。
Action APIs
通常情况下,你测试一个应用程序就是去执行一些用户操作,你可以很容易在使用ViewActions的API来完成一些操作,例如下面的这些:
1、View clicks
2、Swipes
3、Key and button presses
4、Typing text
5、Opening a link 打开一个链接
例如要模拟输入一些字符串,并且模拟点击操作,你就可以编写一个这样的自动化脚本:
// 给 EditText 输入一段文本后,关闭软键盘
onView(withId(R.id.editTextUserInput))
.perform(typeText(STRING_TO_BE_TYPED), closeSoftKeyboard()); // 按下按钮
onView(withId(R.id.changeTextBt)).perform(click());
UI线程同步
我们在Android设备上做测试的时候,经常会因为时间问题而导致失败。这种问题经常被称作是是test flakiness。在Espresso问世之前,大多数的解决方案是添加一个足够长的sleep时间或者是添加代码来进行重试失败的操作。Espresso测试框架处理同步是在Instrumentation和UI线程之间进行的,这消除了之前的计时解决办法的必要性,并确保测试操作执行和运行的断言更可靠。
如果想学习更多的话,请参考 API 和 一个简单的搭建过程。
环境搭建
读完上面是否已经对Espresso有一些了解了,下面我们看看环境搭建吧。
首先在使用Espresso之前,请确保你的测试工程和源开发工程的依赖关系是正确的,如果我们使用的是Android Stutio的工程的话,在创建该工程的时候,就会自动生成AndroidTest的目录,我们的代码就在这个目录结构下:

接着在Android程序模块的build.gradle(app) 文件中,必须对Espresso加入依赖引用:
dependencies {
// Other dependencies ...
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
}
注意gradle文件有很多,不要加错了地方:
接着需要在自己设备 “开发者选项” 中关闭三个动画 “窗口缩放动画(Window animation scale)” “过渡动画缩放(Transition animation scale)” “动画程序时长缩放(Animator duration scale)”

稍微解释一下这三个动画:
"Window animation scale",作用于非Activity窗口。比如,Dialog、toast、自定义浮窗、输入法等窗口都是该选项的作用目标;
"Transition animation scale",作用于Activity窗口。Activity窗口是该选项作用目标;
为了防止动画对于测试过程中的影响,谷歌建议关闭这三个动画效果。
下面介绍如何使用JUnit 4来编写Espresso的测试代码,同时使用 ActivityTestRule可以减少代码共用同样的模板结构。通过使用ActivityTestRule,测试框架在用@Test注释的每个测试方法之前都会拉起Activity,并且会执行@Before的内容,在执行完@Test函数后,会执行@After的方法。
package com.example.android.testing.espresso.BasicSample; import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith; import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
... @RunWith(AndroidJUnit4.class)
@LargeTest
public class ChangeTextBehaviorTest { private String mStringToBetyped; @Rule
public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(
MainActivity.class); @Before
public void initValidString() {
// 初始化一个字符串
mStringToBetyped = "Espresso";
} @After
public void tearDown() {
// 测试结束
mStringToBetyped = "";
} @Test
public void changeText_sameActivity() {
// 给edit控件输入文本Espresso,然后按下按钮
onView(withId(R.id.editTextUserInput))
.perform(typeText(mStringToBetyped), closeSoftKeyboard());
onView(withId(R.id.changeTextBt)).perform(click()); // 检验文字是否被改变
onView(withId(R.id.textToBeChanged))
.check(matches(withText(mStringToBetyped)));
}
}
这里的一个注意点就是注解要写对,其次就是启动的Activity需要指定为自己应用的Activity的名称。
当然这些需要引入JUnit的一些依赖,我的工程中加入了如下内容:

并且加入了AndroidJUnitRunner:
android {
......
defaultConfig {
applicationId "....."
minSdkVersion 15
targetSdkVersion 23
......
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
......
}
这样当我们在写完代码之后,只需按照Instrumentation的方式来启动运行即可。

有没有发现Espresso的执行速度非常非常的话,没错这就是Espresso的牛逼之处。这节就讲到这里,如果想了解Espresso的一些其他用法,可以参看下一节。
【Android测试】【第十八节】Espresso——环境搭建的更多相关文章
- 【转】Xamarin.Android 入门之:Xamarin+vs2015 环境搭建
Xamarin.Android 入门之:Xamarin+vs2015 环境搭建 一.前言 此篇博客主要写了如何使用搭建xamarin开发的环境,防止我自己万一哪天电脑重装系统了,可以直接看这篇博客 ...
- Android基础-系统架构分析,环境搭建,下载Android Studio,AndroidDevTools,Git使用教程,Github入门,界面设计介绍
系统架构分析 Android体系结构 安卓结构有四大层,五个部分,Android分四层为: 应用层(Applications),应用框架层(Application Framework),系统运行层(L ...
- Android开发使用控件入门--环境搭建
Android开发使用控件入门--环境搭建 软件名称(,梦,,想.CAD ,控件) 1. 环境搭建: 3 1.1. 安装Eclipse 3 1.2. 下载JDK 3 1.3. 下载Android S ...
- 基于 Android NDK 的学习之旅-----环境搭建
工欲善其事 必先利其器 , 下面介绍下 Eclipse SDK NDK Cygwin CDT 集成开发环境的搭建. 1.Android 开发环境搭建 Android开发环境搭建不是重点,相信看此文章的 ...
- 【定有惊喜】android程序员如何做自己的API接口?php与android的良好交互(附环境搭建),让前端数据动起来~
一.写在前面 web开发有前端和后端之分,其实android还是有前端和后端之分.android开发就相当于手机app的前端,一般都是php+android或者jsp+android开发.androi ...
- Android NDK 开发(一)--环境搭建【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41800955 Android下的NDK开发是Android开发中不可或缺的一部分, ...
- 零基础Android学习笔记-01 安卓开发环境搭建
安卓开发环境搭建. 1.首先准备JDK,从官网找到JDK下载地址,原来做.NET不熟悉JAVA,干脆用最新的,下载了JDK 1.7的版本.原来装过1.5还要配置环境变量什么的.但1.7好像很给力,装好 ...
- jni 入门 android的C编程之旅 --->环境搭建&&helloworld
需要进行jni的开发有一下几个条件: 1:能初步使用C/C++如果不会,请参读 谭浩强的 C编程语言 2:android应用开发已经基本入门,如果没有,请先行学习 这两个条件基本满足后,我们开始了: ...
- Xamarin.Android 入门之:Xamarin+vs2015 环境搭建
一.前言 此篇博客主要写了如何使用搭建xamarin开发的环境,防止我自己万一哪天电脑重装系统了,可以直接看这篇博客. 二.准备工作 在安装之前需要下载好xamarin所需要的软件并一个个安装他们: ...
随机推荐
- UVa1161 Objective: Berlin(最大流)
题目 Source https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- Android权限(转)
http://www.cnblogs.com/classic/archive/2011/06/20/2085055.html 访问登记属性 android.permission.ACCESS_CHEC ...
- 定位absolute使内联支持宽高(块属性变为内联,内容默认撑开)margin auto 失效
relative 没脱离文档流 absdute 完全脱离文档流 margin :auto 失效 相对整个文档偏离 相对父级定位 fixed 脱离文档流 与绝对定位特性一致 3.P标快不能包块级标签 ...
- Loadrunner脚本录制常见问题整理
1.LoadRunner录制脚本时为什么不弹出IE浏览器? 当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面的方法来解决. 启动浏览器,打开Inter ...
- IOS 蓝牙相关-连接外设的代码实现(2)
我们具体说明一下中心模式的应用场景.主设备(手机去扫描连接外设,发现外设服务和属性,操作服务和属性的应用.一般来说,外设(蓝牙设备,比如智能手环之类的东西), 会由硬件工程师开发好,并定义好设备提供的 ...
- 树莓派(Raspberry Pi)修改时区
1.安装ntp sudo apt-get install ntpdate 2.修改时区 tzselect 3.选择自己的时区 1)选择大洲 2)选择国家 3)选择城市 4)选择YES 5)或者使用命令 ...
- 李洪强iOS经典面试题123
1.static 关键字的作用: (1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次, 因此其值在下次调用时仍维持上次的值; (2)在模块内的 s ...
- Linux下配置SVN
1.安装svn yum -y install subversion 2.创建SVN版本库目录 mkdir -p /var/svn/svnrepos (-p参数:如果没有这个目录,则创建这个目录) 3. ...
- ZK 使用Clients.response
参考: http://stackoverflow.com/questions/11416386/how-to-access-au-response-sent-from-server-side-at-c ...
- bootstrap学习笔记之四(javascript插件)
下面展现四个插件的用法,一般插件的功能可以用两种方法实现,一种是引入bootstrap.js后,通过添加data属性实现,另一种则是通过js代码是实现. 第一个插件:下拉菜单的实现 第一种方法:dat ...