(4.5.4)Android測试TestCase单元(Unit test)測试和instrumentationCase单元測试

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。


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



測试报告在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窗体的设置例如以下:

test artifact

要执行单元測试。应保证选择的是”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
 在CODE上查看代码片派生到我的代码片
  1. public class ExampleTest extends InstrumentationTestCase {  
  2.   
  3.         public void test() throws Exception {  
  4.             final int expected = 1;  
  5.             final int reality = 1;  
  6.             assertEquals(expected, reality);  
  7.         }  
  8. }  
注意:在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
 在CODE上查看代码片派生到我的代码片
  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单元測试
posted @ 2017-07-24 13:25  wzjhoutai  阅读(364)  评论(0编辑  收藏  举报