Android单元和instrumentation单元測试

Android的单元測试是基于JUnit的。可分为:

  • 1、本地单元測试 - 能够在JVM上执行測试(速度快,优先考虑)。
  • 2、Instrumented单元測试 - 须要Android系统

Android的Gradle插件支持在JVM上运行Andr​​oid单元測试。它使用特殊版本号的android.jar(也称为 Android mockable jar)支持单元測试,使全部字段,方法和类可用。不论什么调用到Android mockable JAR默认都是异常。高速可是不能測试安卓相关内容。Instrumented可測试Android API。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

project结构和測试目录

建议:

app/src/main/java - 源码

app/src/test/java - 本地測试

app/src/androidTest/java - Instrumented单元測试

假设你这些约定。Android构建系统会自己主动在JVM上执行单元測试、在Android设备上执行安卓測试。  当然你额也能够不依照找个建立,自己拟定文件夹。

 1、JVM单元測试( unit test)

Android使用unit test这个术语描写叙述本地JVM而非Android Runtime上执行的測试。

unit test測试组件功能。比如如果Android activity的一个button用于启动还有一个activity。单元測试确定是否发出对应的intent,但部保证还有一个activity已启动。

unit test依靠改动后的android.jar运行,这个jar文件里全部的final修饰符都被去掉。改动后同意使用mock库,如Mockito。默认这个android.jar中的全部方法抛出异常。这样的缺省行为保证单元測试仅仅会測试自己代码,不会依赖Android平台的不论什么特定行为。

假设想使用Android平台的特定行为,能够使用mock框架替换对应调用。

单元測试约定的位置:app/src/test/文件夹,并须要加入对应配置到Gradle构建文件里:

dependencies {
// Unit testing dependencies
testCompile 'junit:junit:4.12'
// Set this dependency if you want to use the Hamcrest matcher library
testCompile 'org.hamcrest:hamcrest-library:1.3'
// more stuff, e.g., Mockito
}

1.1 执行方法

1、可在相应test文件上右键选择  直接执行   注意此处么没实用虚拟机就可以測试方法

2、在顶部的 run工具处左側 自己定义+UnitTest

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

測试报告在app/build/reports/tests/debug/文件夹。

index.html是測试概述,它链接到单个測试页。

也能够配置Gradle构建系统,让android.jar中的方法均返回缺省值而不是抛出异常:

android {
// ...
testOptions {
unitTests.returnDefaultValues = true
}
}

1.2 创建步骤

1.2.1  app/build.gradle中加入JUnit依赖【似乎有时候不须要】

在 app/build.gradle中加入JUnit依赖。“testCompile 'junit:junit:4.12'” 与 "compile 'junit:junit:4.12'"

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.0'
compile 'junit:junit:4.12'
}

1.2.2 为某个类创建Test(使用IDE自己主动生成test模板)或者自己手工编写

1.2.3 编辑生成的模板

生成的文件ConverterUtilTest.java例如以下:

package com.vogella.android.temperatureconverter;

import junit.framework.TestCase;

import org.junit.Test;

import static org.junit.Assert.*;

/**
* Created by andrew on 15-11-8.
*/
public class ConverterUtilTest extends TestCase { @Test
public void testConvertFahrenheitToCelsius() throws Exception { } @Test
public void testConvertCelsiusToFahrenheit() throws Exception { }
}

改动文件ConverterUtilTest.java:

package com.vogella.android.temperatureconverter;

import static org.junit.Assert.*;

import org.junit.Test;

public class ConverterUtilTest {

    @Test
public void testConvertFahrenheitToCelsius() {
float actual = ConverterUtil.convertCelsiusToFahrenheit(100);
// expected value is 212
float expected = 212;
// use this method because float is not precise
assertEquals("Conversion from celsius to fahrenheit failed", expected,
actual, 0.001);
} @Test
public void testConvertCelsiusToFahrenheit() {
float actual = ConverterUtil.convertFahrenheitToCelsius(212);
// expected value is 100
float expected = 100;
// use this method because float is not precise
assertEquals("Conversion from celsius to fahrenheit failed", expected,
actual, 0.001);
} }

2、 Instrumentation - 底层的Andr​​oid測试API

Android的測试API提供钩子到Android的组件和应用生命周期。这些钩子即instrumentation API。它同意你的測试控制的生命周期和用户交互事件。

在正常情况下应用仅仅反应生命周期和用户交互事件。比如Android的创建activity会调用onCreate()方法被调用您的活动。或用户按button或一个密钥和对应的代码被调用。通过instrumentation API这些事件。

InstrumentationTestRunner是Android測试的基础。

它启动并载入測试方法。它通过instrumentation API与Android系统进行通信。

假设你開始Android应用測试,Android系统杀死被測应用,然后载入一个新的实例。它不启动应用程序。这是的測试方法的责任。測试方法控制的应用组件的生命周期。TestRunner初始化时调用应用和在正常情况下应用仅仅反应生命周期和用户交互事件。

比如Android的创建activity会调用onCreate的onCreate()方法 和活动的onCreate()方法。

通常是调用Espresso,非常少直接使用 instrumentation API。

依赖配置:

defaultConfig {
..... more stuff
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
} dependencies {
// Unit testing dependencies
androidTestCompile 'junit:junit:4.12'
// Set this dependency if you want to use the Hamcrest matcher library
androidTestCompile 'org.hamcrest:hamcrest-library:1.3'
// more stuff, e.g., Mockito
}

建议測试加入注解@RunWith(AndroidJUnit4.class)。 AndroidJUnit4扩展JUnit4,纯Junit4语法和ActivityTestRule没必要的。可是Espresso測试混合ActivityTestRule须要。

gradle的运行方式“gradlew connectedCheck"。

Android
Studio的Build Variants窗体的设置例如以下:

要执行单元測试。应保证选择的是”Android Instrumentation Tests”。右击待測试的类然后选择”Run”。測试报告输出到 app/build/reports/androidTests/connected/,index.html是測试概述。它链接到单个測试页。

加入mockito支持:

dependencies {
testCompile 'junit:junit:4.12'
// required if you want to use Mockito for unit tests
testCompile 'org.mockito:mockito-core:1.+'
// required if you want to use Mockito for Android instrumentation tests
androidTestCompile 'org.mockito:mockito-core:1.+'
androidTestCompile "com.google.dexmaker:dexmaker:1.2"
androidTestCompile "com.google.dexmaker:dexmaker-mockito:1.2"
}

2.1、測试代码

我在这个test目录中加入了一个类EexampleTest。该类派生自InstrumentationTestCase,并写了一个方法,完整代码例如以下:

[java] view
plain
 copy

  1. public class ExampleTest extends InstrumentationTestCase {
  2. public void test() throws Exception {
  3. final int expected = 1;
  4. final int reality = 1;
  5. assertEquals(expected, reality);
  6. }
  7. }

注意:在android studio中,全部的測试代码必须以test-作为前缀,不然android studio无法识别它为測试代码。

2.2、測试

在android studio一排button的最上层,点击“执行”旁边的配置button

打开配置对话框,选择Android Test

右側Module选择你的project名。这里是app

Test: 部分选择All in Package

Package:选择当前新建的test目录

总体配置好之后是这种

执行出结果:

測试通过的结果是这样子的:

假设我们把test()的代码改成这样子:

[java] view
plain
 copy

  1. public void test() throws Exception {
  2. final int expected = 1;
  3. final int reality = 3;
  4. assertEquals(expected, reality);
  5. }

明显1不等于3,所以assertEquals肯定会出错!

所以出错的结果是这样子的:(在中间窗体logcat中能够定位到出错位置)


 JVM单元測试

(4.5.4)Android測试TestCase单元(Unit test)測试和instrumentationCase单元測试的更多相关文章

  1. ABP理论学习之工作单元(Unit of Work)

    返回总目录 本篇目录 公共连接和事务管理方法 ABP中的连接和事务管理 仓储类 应用服务 工作单元 工作单元详解 关闭工作单元 非事务的工作单元 工作单元方法调用其它 工作单元作用域 自动保存 IRe ...

  2. 基于DDD的.NET开发框架 - ABP工作单元(Unit of Work)

    返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...

  3. StringGrid 实例4 本例功能: 1、给每个单元格赋值 2、调整当前单元格位置:上下左右;

    实例4 本例功能:1.给每个单元格赋值 2.调整当前单元格位置:上下左右: 运行效果图:

  4. Swift - 可编辑表格样例(可直接编辑单元格中内容、移动删除单元格)

    (本文代码已升级至Swift3)   本文演示如何制作一个可以编辑单元格内容的表格(UITableView). 1,效果图 (1)默认状态下,表格不可编辑,当点击单元格的时候会弹出提示框显示选中的内容 ...

  5. Excel_通过单元格的值来引用以单元格值命名的sheet

    1.通过单元格的值来引用以单元格值命名的sheet,在做多个类似sheet的统计结果时效率比较高 当一项测试中有很多个模块,每个模块中有很多条测试用例 将以上测试用例整理在Excel中,每个模块一个s ...

  6. 「BUAA OO Unit 4 HW16」第四单元总结与课程回顾

    「BUAA OO Unit 4 HW16」第四单元总结与课程回顾 目录 「BUAA OO Unit 4 HW16」第四单元总结与课程回顾 Part 0 第四单元作业架构设计 架构设计概要 AppRun ...

  7. 【Android开发-6】了解内情,我们须要一些调试和測试手段

    前言:人生不可能十全十美,总会有些遗憾存在,经历过遗憾,我们才懂的什么是生活. 程序也一样.追求完美,就必定会有经历bug存在的时候. 经历过不断的bug磨练.我们技术才会不断的成长.对于调试bug, ...

  8. 自己主动化測试程序之中的一个自己定义键盘的模拟測试程序(C语言)

    一.測试程序编写说明 我们做的终端设备上运行的是QT应用程序.使用自己定义的键盘接口.经过測试人员长时间的人机交互測试,来确认系统的功能是否满足需求. 如今须要编写一个自己主动化的測试程序,能够依照预 ...

  9. Android测试:Building Local Unit Tests

    原文:https://developer.android.com/training/testing/unit-testing/local-unit-tests.html 如果你的单元测试没有依赖或者只 ...

随机推荐

  1. CF 148D Bag of mice【概率DP】

    D. Bag of mice time limit per test 2 seconds memory limit per test 256 megabytes Promblem descriptio ...

  2. sublime 常用快捷键备忘

    转一篇sublime常用的快捷键备忘 sublime常用快捷键 选择类Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本.Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本 ...

  3. 在C#用进程打开cmd与直接手动打开cmd是不一样的

    网上找不着答案,想了一下觉得可能是不同的用户,用set看了一下环境变量果然是不同用户,要改一下 按以下方法改: http://www.cnblogs.com/babycool/p/3569183.ht ...

  4. HRBUST 1211 火车上的人数【数论解方程/模拟之枚举+递推】

    火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人.从第3站起(包括第3站 ...

  5. 提升开发效率的一款mybatis开发神器

    文末附有完整案例的代码内容!! 以前在开发的时候,使用mybatis的时候,经常都需要先配置xml映射文件,然后每条sql操作都需要自己进行手动编写,对于一些复杂的sql这么来操作确实有必要,但是如果 ...

  6. mysql事物中行锁与表锁

    事物与锁 什么叫不支持事物: 首先要了解数据库里的事务是什么意思.事务在计算机数据库里 :在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit).在关系数据库中,一个事务可以 ...

  7. 查看tomcat启动文件都干点啥---Bootstrap.java

    在上一章查看tomcat启动文件都干点啥---catalina.bat,说了在catalina.bat中都走了什么流程,最重要的是,我们得出了如下这段命令: _EXECJAVA=start " ...

  8. RTC实时时钟驱动

    RTC(Real-Time Clock)实时时钟为操作系统提供了一个可靠的时间,并且在断电的情况下,RTC实时时钟也可以通过电池供电,一直运行下去. RTC通过STRB/LDRB这两个ARM指令向CP ...

  9. ubuntu 添加用户

    sudo useradd 用户名 创建用户 sudo passwd 用户名 修改用户密码 添加sudo权限 sudo usermod -aG sudo(要添加的用户组,也可以是root) 用户名 su ...

  10. 2016.6.20 tomcat安装出现No Java Virtual Machine found in..

    安装tomcat时,选择安装路径为自定义路径,但是出现提示: No Java Virtual Machine found in.. 心想这和java虚拟机什么关系啊.百度了之后发现,安装过程中有一步是 ...