版权声明:本文出自胖喵~的博客,转载必须注明出处。

转载请注明出处: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——官方译文的更多相关文章

  1. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  2. 第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码

    第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码 打码接口文件 # -*- coding: cp936 -*- import sys import os ...

  3. centos lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress 安装phpmyadmin 定时备份mysql两种方法 第二十五节课

    centos  lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress  安装phpmyadmin  定时备份mysql两种方法  第二十五节 ...

  4. 大白话5分钟带你走进人工智能-第十五节L1和L2正则几何解释和Ridge,Lasso,Elastic Net回归

    第十五节L1和L2正则几何解释和Ridge,Lasso,Elastic Net回归 上一节中我们讲解了L1和L2正则的概念,知道了L1和L2都会使不重要的维度权重下降得多,重要的维度权重下降得少,引入 ...

  5. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  6. 第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现,回填数据以及错误提示html

    第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现 1,配置登录路由 from django.conf.urls import url, include # 导入dja ...

  7. 第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表、课程机构表、讲师表

    第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表.课程机构表.讲师表 创建名称为app_organization的课 ...

  8. 第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询

    第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询 1.elasticsearch(搜索引擎)的查询 elasticsearch是功能 ...

  9. 第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解

    第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解 信号一般使用信号分发器dispatcher.connect(),来设置信号,和信号触发函数,当捕获到信号时执行 ...

  10. 第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图

    第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图 1.基本概念 2.反爬虫的目的 3.爬虫和反爬的对抗过程以及策略 scra ...

随机推荐

  1. JavaScript定时器

    定时器 开启定时器 Setinterval间隔型    每隔一段时间重复的执行 SetTimeout延时型   只执行一次 两种定时器的区别 <!DOCTYPE html> <htm ...

  2. CF# 334 Moodular Arithmetic

    B. Moodular Arithmetic time limit per test 1 second memory limit per test 256 megabytes input standa ...

  3. Android系统中的6种模式

    Android系统中的6种模式 1:一般启动模式(normal mode):    功能是正常启动手机,方法为关机状态下按电源键启动. 2:安全模式(safe mode):    此模式和正常启动一样 ...

  4. android 第三方 图表

    1.XCL-Charts 直接利用Canvas api画出图形,各有好处. XCL-Chart尽量把图的绘制逻辑封装在类中,而把绘制相关的各 个元素开放出来,目的是在保证开发效率的同时,给程序员足够多 ...

  5. Codeforces Round #253 (Div. 2) A. Anton and Letters

    题目很简单,只需要注意带空格的输入用getline即可 #include <iostream> #include <vector> #include <algorithm ...

  6. NOI模拟 热身赛T1

    设p(m)的值为m的正因数个数(包括1和m本身)给定n,求满足p(x)=n的最小x. 简直弱到不行了... VW做法: 其实蛮简单的,然而想的时候忽略了指数是不增的 然后你以为做完了吗? 愚蠢的贡献了 ...

  7. BZOJ4515: [Sdoi2016]游戏

    Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,Alice 会 ...

  8. BZOJ3992: [SDOI2015]序列统计

    Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S. 小C用这个生成器生成了许多这样的数列. ...

  9. 三、图像移动《苹果iOS实例编程入门教程》

    该app为应用的功能为动态移动动画 现版本 SDK 8.4 Xcode 运行Xcode 选择 Create a new Xcode project ->Single View Applicati ...

  10. Linux多线程实例练习 - pthread_cancel()

    Linux多线程实例练习 - pthread_cancel 1.代码 xx_pthread_cancel.c #include <pthread.h> #include <stdio ...