Android单元和instrumentation单元測试

Developing Android unit and instrumentation tests

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

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

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

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 dependenciestestCompile 'junit:junit:4.12'// Set this dependency if you want to use the Hamcrest matcher librarytestCompile 'org.hamcrest:hamcrest-library:1.3'// more stuff, e.g., Mockito
} 

1.1 执行方法

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

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

測试报告在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 {@Testpublic void testConvertFahrenheitToCelsius() throws Exception {}@Testpublic void testConvertCelsiusToFahrenheit() throws Exception {}
}

改动文件ConverterUtilTest.java:

package com.vogella.android.temperatureconverter;import static org.junit.Assert.*;import org.junit.Test;public class ConverterUtilTest {@Testpublic void testConvertFahrenheitToCelsius() {float actual = ConverterUtil.convertCelsiusToFahrenheit(100);// expected value is 212float expected = 212;// use this method because float is not preciseassertEquals("Conversion from celsius to fahrenheit failed", expected,actual, 0.001);}@Testpublic void testConvertCelsiusToFahrenheit() {float actual = ConverterUtil.convertFahrenheitToCelsius(212);// expected value is 100float expected = 100;// use this method because float is not preciseassertEquals("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 stufftestInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}dependencies {// Unit testing dependenciesandroidTestCompile 'junit:junit:4.12'// Set this dependency if you want to use the Hamcrest matcher libraryandroidTestCompile '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 teststestCompile 'org.mockito:mockito-core:1.+'// required if you want to use Mockito for Android instrumentation testsandroidTestCompile '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 plaincopy
  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 plaincopy
  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单元測试

转载于:https://www.cnblogs.com/wzjhoutai/p/7228450.html

(4.5.4)Android測试TestCase单元(Unit test)測试和instrumentationCase单元測试相关推荐

  1. ansys,单元体转换以及如何查看当前单元体的类型,一些指令讲解。

    首先,感谢哔哩哔哩张晔老师以及汉泰科技的视频对我的帮助(https://www.bilibili.com/video/BV1u4411B7Fo?p=23)(https://www.bilibili.c ...

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

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

  3. excel 某个单元格不是等于空值_excel 单元格为空与不存在

    Q3:Excel单元格为空怎么表示啊 一.在EXCEL中判断单元格是否为空单元可以用ISBLANK函数,也可以用某单元格是否=""来进行判断. 比如要判断A1单元格是否为空单元格, ...

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

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

  5. ppwjs之bootstrap表格:String.到表头单元格元素 和 String.到表格单元格元素

    2019独角兽企业重金招聘Python工程师标准>>> <!DOCTYPT html> <html><head><meta http-equ ...

  6. asp.net gridview删除 获取到第一行第一列的单元格内容_VBA中的常用单元格引用方式...

    VBA编程经常和"对象"打交道,其中最频繁的对象大概就是"单元格"了.(听说您还没有对象?那--我想你大概需要一份Excel,包邮988--) 今天我们就来聊一 ...

  7. Java黑皮书课后题第8章:*8.23(游戏:找到翻转的单元格)假定给定一个填满0和1的6*6矩阵,所有的行和列都有偶数个1。让用户翻转一个单元,编写一个程序找到哪个单元格被翻转了

    *8.23(游戏:找到翻转的单元格)假定给定一个填满0和1的6*6矩阵,所有的行和列都有偶数个1.让用户翻转一个单元,编写一个程序找到哪个单元格被翻转了 题目 题目描述与运行示例 破题 代码 题目 题 ...

  8. table合并单元格_制作课程表3——合并单元格

    由于浏览器兼容问题,. 以及 很少被使用, 所以我们将课程表依然使用tr.td元素,结合样式实现出前面案例中效果 原来代码: 课程1 课程2 课程3 课程4 课程5 课程1 课程2 课程3 课程4 课 ...

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

    返回ABP系列 ABP是"ASP.NET Boilerplate Project (ASP.NET样板项目)"的简称. ASP.NET Boilerplate是一个用最佳实践和流行 ...

最新文章

  1. TabStrip within ASP.NET 2.0 in C# with Design Time Support
  2. Scala父类和父特质的执行顺序
  3. matplotlib简介-高质量图形输出
  4. RestTemplate 发送 Https 请求调用
  5. 工业以太网交换机常见故障排除的三种方法
  6. Delta3d插件机制
  7. stl::vector排序二例
  8. SQL Server自定义函数(Table-valued Functions)
  9. susmote个人网站博客论坛(TexTec | 关注互联网技术,传播极客精神)
  10. python实现取出一个列表或者多个列表中的公共前缀
  11. comsol光学仿真03
  12. Ubuntu录制gif动态图
  13. swiper5 点击图换下一张_软网推荐:骗倒社交好友 制作另类隐藏图
  14. 一文搞懂 RabbitMQ 延时队列(订单定时取消为例)
  15. OAuth2.0公钥私钥授权技术
  16. 谷歌人机图像识别接口
  17. php 验证邮箱 php验证手机号码 ph验证身份证
  18. JavaScript学习笔记(九)(验证框架,layer弹出层)
  19. java 为新员工分配部门
  20. 【贪心 / 线段树模拟费用流增广】BZOJ4977 [Lydsy八月月赛] 跳伞求生

热门文章

  1. linux异构内存,Linux内核添加异构内存管理(HMM)将带来加速GPU的新方式,还有可能带来其他类型的机器学习硬件。...
  2. 区块链java语言,基于Java语言构建区块链(一)—— 基本原型
  3. python︱大规模数据存储与读取、并行计算:Dask库简述
  4. Eviews 9.0新功能——估计方法(ARDL、面板自回归、门限回归)
  5. Ansible入门使用
  6. 机器学习系列------1. GBDT算法的原理
  7. Java:JSON解析工具-org.json
  8. 网络常用协议 SSH、SSL
  9. LSTM网络(Long Short-Term Memory )
  10. J2EE 架构师之路