【Android测试】【第十五节】Instrumentation——官方译文
◆版权声明:本文出自胖喵~的博客,转载必须注明出处。
转载请注明出处:http://www.cnblogs.com/by-dream/p/5482207.html
前言
前面介绍了不少Android UI自动化测试的东西,这里我们学习一下谷歌对安卓测试的一些理解。顺便做为Instrumentation的预习篇。原文章的链接:http://developer.android.com/intl/zh-cn/tools/testing-support-library/index.html
这篇文章介绍了Android App的关键概念。它假设你已经有了JUnit的测试框架的一些基本知识。
测试结构
Android testing 测试框架是基于JUnit的。一般情况下,一个JUnit是一个方法 语句测试应用程序的一部分。你写一些测试方法到一个类里,就被称做是test case。当然你可进一步的组织这类到测试套件(test suites)。
在JUnit当中,你建立一个或者多个测试类,并使用测试运行器(test runner)来执行它们。在Android中,你需要使用Android Studio(或 Android Plugin for Gradle)去建立一个或多个源文件到一个Android的测试App中。
根据你的环境,你可以选择以下方式之一运行测试:
1、在你本地机器上:编译测试类和使用JUnit test runner去调起他们执行在本地的JVM上。
2、在模拟器或Android设备上:安装测试程序到设备上,然后用Android特有的test runner(例如 AndroidJUnitRunner)去执行你的测试。
你的测试代码和你建立并运行Android Studio中的测试方式的结构取决于测试你正在执行的类型。下表总结了常见Android的测试类型的:
| Type | Subtype | Description |
| Unit tests | Local Unit Tests | Unit tests that run on your local machine only. These tests are compiled to run locally on the JVM to minimize execution time. Use this approach to run unit tests that have no dependencies on the Android framework or have dependencies that mock objects can satisfy. |
| Instrumented unit tests | Unit tests that run on an Android device or emulator. These tests have access toInstrumentation information, such as the Context of the app under test. Use this approach to run unit tests that have Android dependencies which mock objects cannot easily satisfy. | |
| Integration Tests | Components within your app only | This type of test verifies that the target app behaves as expected when a user performs a specific action or enters a specific input in its activities. For example, it allows you to check that the target app returns the correct UI output in response to user interactions in the app’s activities. UI testing frameworks like Espresso allow you to programmatically simulate user actions and test complex intra-app user interactions. |
| Cross-app Components | This type of test verifies the correct behavior of interactions between different user apps or between user apps and system apps. For example, you might want to test that your app behaves correctly when the user performs an action in the Android Settings menu. UI testing frameworks that support cross-app interactions, such as UI Automator, allow you to create tests for such scenarios. |
根据你创建的测试类型,你需要按照《Getting Started with Testing》中描述的在Android Studio中配置你测试代码的路径和项目依赖。
Testing APIs
下面总结了Android测试相关的公共API。
Junit
你在编写单元测试或者集成测试类时需要把它作为Jnit 4的类, JUnit是Java中最流行和广泛使用的单元测试框架。该框架提供了一个方便的方法去在你的应用中调用setup, teardown 和 assertion 。
一个基本JUnit 4测试类是包含一个或多个Java测试类。一个测试方法是以一个@Test的标注开始,代码的内容是就是验证要测试组件的单一功能(也就是一个逻辑单元)。
下面的代码片段显示了使用Espresso API来执行UI元素上点击动作的JUnit 4集成测试的一个例子,这个例子是来检查是否显示了预期的字符串。
@RunWith(AndroidJUnit4.class)
@LargeTest
public class MainActivityInstrumentationTest { @Rule
public ActivityTestRule mActivityRule = new ActivityTestRule<>(
MainActivity.class); @Test
public void sayHello(){
onView(withText("Say hello!")).perform(click()); onView(withId(R.id.textView)).check(matches(withText("Hello, World!")));
}
}
你可以使用Junit的Assert类来验证对象状态的正确性,通过断言的方法来比较值,当实际结果与预期结果不一致的时候抛出异常。更多详细的断言内容可以参考Assertion classes(断言类)。
Instrumentation
Android Instrumentation在安卓系统上是一组控制函数或者是hooks(钩子)。这些钩子在自己的生命周期独立的控制一个安卓组件,他们也控制着安卓如何加载应用程序。
下图总结了Instrumentation的测试框架:

通常情况下,Android的一个组件在运行在系统指定的生命周期中。举个例子,一个Activity对象的生命周期开始就是被Intent激活的时候,系统调用该对象的onCreate()方法,然后调用onResume()方法,当用户在切换到别的应用的时候,系统又调用onPause()方法,如果在Activity的代码中调用finish()方法时,系统则会调用的onDestroy()方法。Android框架的API不提供对你的代码直接调用这些回调函数,但你可以通过Instrumentation来完成。
系统运行一个应用的所有组件都是在同一个进程中,你可以让某些组件(例如content providers)在单独的进程中运行,但是你不能强制让一个应用程序和另一个已经运行的程序运行在同一个进程中。
Instrumentation可以同时加载。一旦你的应用程序和你的测试程序在一个进程当中了,你的测试程序就可以调用组件中的方法,并且在组件中修改和验证变量。
Android Testing Support Library APIs
The Android Testing Support Library 提供了一系列的API,可以让你快速的建立和运行你的测试程序,包括JUnit4和功能层面的用户界面(UI)测试。下面这些库都是基于Instrumentation的,你可以在做自动化测试的时候选择它们:
AndroidJUnitRunner:运行在安卓上的兼容JUnit 4的test runner;
Espresso:UI测试框架,适用于在App内的UI功能测试;
UIAutomator:UI测试框架,适用于跨应用的UI功能测试。
【Android测试】【第十五节】Instrumentation——官方译文的更多相关文章
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
- 第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码
第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码 打码接口文件 # -*- coding: cp936 -*- import sys import os ...
- centos lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress 安装phpmyadmin 定时备份mysql两种方法 第二十五节课
centos lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress 安装phpmyadmin 定时备份mysql两种方法 第二十五节 ...
- 大白话5分钟带你走进人工智能-第十五节L1和L2正则几何解释和Ridge,Lasso,Elastic Net回归
第十五节L1和L2正则几何解释和Ridge,Lasso,Elastic Net回归 上一节中我们讲解了L1和L2正则的概念,知道了L1和L2都会使不重要的维度权重下降得多,重要的维度权重下降得少,引入 ...
- 第四百一十五节,python常用排序算法学习
第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...
- 第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现,回填数据以及错误提示html
第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现 1,配置登录路由 from django.conf.urls import url, include # 导入dja ...
- 第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表、课程机构表、讲师表
第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表.课程机构表.讲师表 创建名称为app_organization的课 ...
- 第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询
第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询 1.elasticsearch(搜索引擎)的查询 elasticsearch是功能 ...
- 第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解
第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解 信号一般使用信号分发器dispatcher.connect(),来设置信号,和信号触发函数,当捕获到信号时执行 ...
- 第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图
第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图 1.基本概念 2.反爬虫的目的 3.爬虫和反爬的对抗过程以及策略 scra ...
随机推荐
- Shell 编程基础之 Until 练习
一.语法 until [ condition ] # 和while相反,当 condition 条件成立时,就终止回圈, 否则就持续进行回圈的程序段 do #执行内容 done 二.练习 输入用户输入 ...
- uva-1339Ancient Cipher
Ancient Roman empire had a strong government system with various departments, including a secret ser ...
- 使用CSS代码修改博客模板
在修改设置使公告栏里的头像更新为新的头像时发现里边还有“页面定制CSS代码”这一选项,查了一下发现这东西可以对页面做一些个性化的调整.正好目前我使用的这个模板标题和导航栏的字体实在难看,顺手修改了一下 ...
- BZOJ 2882 & 后缀数组的傻逼实现
题意: 一个字符环,求一个开头使字典序最小. SOL: 后缀数组打起来...然后居然卡过...10sec的实现我10936ms...居然卡过??? rank倒三...啦啦啦啦啦.... 改个离散化会不 ...
- ACM 寻找最大数
寻找最大数 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=920813467185 ...
- BZOJ3759: Hungergame 博弈论+线性基
学了新的忘了旧的,还活着干什么 题意:一些盒子,每步可选择打开盒子和取出已打开盒子的任意多石子,问先手是否必胜 搬运po姐的题解: 先手必胜的状态为:给出的数字集合存在一个异或和为零的非空子集,则先手 ...
- 转 用JS实现PHP的sprintf函数
函数如下: <script type="text/javascript"> function sprintf() { var arg = arguments, ...
- PHP 高效分布代码转的
在<efficient pagination using mysql>中提出的clue方式. 利用clue方法,给翻页提供一些线索,比如还是SELECT * FROM `csdn` ord ...
- 用GruntJS合并、压缩CSS资源文件
合并.压缩CSS资源文件用到了grunt-contrib-concat.grunt-css插件,自己npm就可以了,下面直接呈上package.json.Gruntfile.js代码 package. ...
- MongoDB设置访问权限、设置用户
MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),今天特地花了一点时间研究了一下,研究成果如下: 注:研究成果基于W ...