◆版权声明:本文出自胖喵~的博客,转载必须注明出处。
转载请注明出处: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 ...
随机推荐
-
MFC2016.6.8
1.theApp extern声明之后不可以使用?可以用,只是需要extern之后的类名和类名称写对,不要犯得低级错误.2.怎样取出列表控件中的第某列的值?GetItemText(); CListCt ...
-
JavaScript基础之函数与数组
函数 函数的基本概念 为完成某一功能的程序指令(语句)的集合,称为函数.有的程序员把函数称为方法,希望大家不要被这两个名词搞晕了. 函数分为:自定义函数.系统函数(经常查看js帮助手册). j ...
-
【转】Eazfuscator.NET 3.3中混淆化需要注意的一些问题
对于DLL,Eazfuscator.NET默认不会混淆化任何公共成员,因为类库的公共成员很有可能被外界调用,而对于EXE的程序集,所有类型都可能被混淆化.注意上面这句话有一个“可能”,因为Eazfus ...
-
RxJava开发精要2-为什么是Observables?
原文出自<RxJava Essentials> 原文作者 : Ivan Morgillo 译文出自 : 开发技术前线 www.devtf.cn 转载声明: 本译文已授权开发者头条享有独家转 ...
-
图片处理中的Dithering技术
话说二战的时候,美国轰炸机每次执行任务,除了满载着威力强大的炸弹以外,还常常要装配一台计算机,飞机飞行方向和投弹的抛物线的计算都离不开这台机器.可是世界上第一台电子计算机在二战结束后才发明,轰炸机上当 ...
-
Android binder机制---概述
1.进程间通讯的原因 目前操作系统都使用虚拟存储技术,管理内存. 假设是32位机器,0-3G是用户空间,3-4G是系统使用.虚拟内存和逻辑内存都按4K分页.这样虚拟内存和逻辑内存就存在对应关系. 一个 ...
-
关于使用git和github的一点点感想
第二篇博客 首先附上我的第一个java程序github地址: https://github.com/KingsC123456/FirstJavaHello 其次是关于我的github介绍,因为一直使用 ...
-
0x14哈希之兔子兔子
参考链接:https://www.cnblogs.com/wyboooo/p/9813428.html 题目链接:https://www.acwing.com/problem/content/140/ ...
-
PCIE 3.0中使用的动态均衡概念
一.PCIE 3.0中使用的动态均衡概念 因为PCIE 3.0信号的速率可以达到8Gb/s,而且链路通道走线也可能会很长,这可能会导致高速信号衰减过大,在接收端无法得到张开的眼图.因此在PCIE 3. ...
-
20135316王剑桥Linux内核学习笔记第四周
20135316王剑桥 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 1.内核态:在高执行级别,代码可 ...