Soporte para test unitarios con JUnit 4 en Android Studio

jueves, 13 de agosto de 2015



Desde la versión 1.1 de Android Studio existe, lo que han llamado desde google, soporte para test unitarios. Esto quiere decir que podemos ejecutar test unitarios sin necesidad de desplegar en un dispositivo o emulador, se van a ejecutar en la maquina virtual de java.

Estos test untarios se conocen también como test locales o test de jvm (java virtual machine).

Cuando creamos un proyecto mediante una de las plantillas de Android Studio, por defecto los test unitarios que vienen son de JUnit 3, vamos a ver que pasos debemos seguir para ejecutar test de JUnit 4.

Configuración de dependencias

Para poder crear test unitarios con junit 4 tenemos que añadir las dependencias de JUnit al fichero gradle del módulo de la aplicación. Cómo es habitual utilizar objetos dobles, lo normal es añadir también una dependencia de una librería de mocks como Mockito, que es muy popular en Android.

dependencies {
    //Tests
    testCompile 'junit:junit:4.12'
    testCompile 'org.mockito:mockito-core:1.10.19'
}    

Plugin de Gradle

Para que todo funcione correctamente necesitamos utilizar el plugin de gradle 1.1 o superior configurado en el fichero gradle del proyecto.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}   

Carpeta para los test unitarios

El siguiente paso es crear una carpeta para los test unitarios con la siguiente ruta: src/test/java/[nombre del paquete]

Creando test unitarios

Ya podemos crear test unitarios con la sintaxis de junit 4, utilizando anotaciones etc..

@Test
public void text_is_expected() {

    String text = "test1"; 

    assertThat(text, is("test1"));
}

Android.jar para test unitarios

Cuando se ejecutan test unitarios se arranca un android.jar que no tiene el código real de la librería como cuando se ejecuta en dispositivos o emuladores, en su lugar todos los métodos devuelven una excepción. De esta forma Android Studio se asegura que no se va a invocar ningún método de android en un test de JVM.

Vamos a ver que pasa si lo hacemos, modificamos el test y accedemos a la clase Log dentro del test.

@Test
public void text_is_expected() {

    String text = "test1"; 

    Log.d("ExampleTest","executing test");

    assertThat(text, is("test1"));
}


Si ahora ejecutamos el test obtenemos el siguiente error:



No podemos utilizar el framework de android en nuestras clases que luego vamos a verificar con test unitarios, de esta forma es problemático utilizar clases como Log y TestUtils.

Las clases sobre las que deberiamos de crear test unitarios son clases de tipo POJO sin ninguna dependencia, dependiendo de la arquitectura de nuestra aplicación las clases sobre las que haremos este tipo de test unitarios pueden ser por ejemplo modelos de la capa de dominio, si estamos utilizando el patrón MVP, los presenters es otro buen ejemplo.

Como hemos visto el comportamiento por defecto del android.jar que arranca con test untarios es lanzar una excepción, este es su comportamiento por defecto. Sin embargo existe una configuración que podemos añadir al fichero gradle para cambiar el comportamiento por defecto y que no se lance la excepción.
android {
  // ...
  testOptions { 
    unitTests.returnDefaultValues = true
  }
}    


Pero hay que tener cuidado con esta configuración ya que lo deseable es que en nuestras clases, donde vamos a verificar su comportamiento con test unitarios, no tengamos dependencias de android. Siempre podemos utilizar abstracciones que hagan de wrappers de estas clases del framework de android y en los test unitarios utilizar objetos dobles con mockito.

Test Artifact

Para poder ejecutar test unitarios tenemos que ir a la pestaña build variants y en el combo test artifact debemos seleccionar unit test. Desde este momento cuando se ejecute un test lo será en modo test de la maquina virtual de java.

Ejecutando los test desde el menu

Ya tenemos la configuración necesaria y ejecutar el test.

Ejecutando los test desde el terminal

Para poder ejecutar los test unitarios del proyecto desde el terminal podemos utilizar el comando gradlew test.


Esto nos genera un informe en la ruta app\build\reports\tests\debug\index.html.

Libros relacionados

Mockito Cookbook

Practical Unit Testing with JUnit and Mockito
Mastering Unit Testing Using Mockito and JUnit

No hay comentarios:

Publicar un comentario