Creando Primer Test Robolectric

robolectric

Vamos a crear un ejemplo sencillo se como testear un proyecto Android con Robolectic. Utilizaremos Android Studio para este ejemplo, pero Robolectric también se puede utilizar con Eclipse.

Creamos un nuevo proyecto Android, para este ejemplo hemos seleccionado como versión mínima la 5.0 y que cree una actividad en blanco.

  • Primero cambiamos la vista del proyecto,que inicialmente se encuentra en Android, a Project para poder tener una visión completa de todo el contenido del proyecto.

Sin título-1

  • Después abrimos la ventana de Build Variants y cambiamos Test Artifact a Unit Test.

Sin título-2

  • Ahora debemos crear el directorio para nuestras pruebas unitarias, ya que Android Studio no lo crea automáticamente. La ubicación predeterminada para las pruebas unitarias es ‘src/test/java‘.

Sin título-3

  • Para terminar la configuración debemos añadir al app build.gradle la dependencia de Robolectric.

Sin título-4

Ahora crearemos la vista de nuestra actividad a testear. En este ejemplo vamos a hacer una calculadora sencilla con las cuatro operaciones básicas. Tendrá dos editText para introducir los datos, un textView para mostrar los resultados y cuatro botones para las operaciones. Nuestro xml quedaría así:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent" 
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity">

    <TextView android:text="@string/tvfirstNumber"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textStyle="bold"
        android:id="@+id/tvFistNumber"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:ems="10"
        android:id="@+id/etFistNumber" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/tvsecondNumber"
        android:textStyle="bold"
        android:id="@+id/tvSecondNumber" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:ems="10"
        android:id="@+id/etSecondNumber" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/tvresult"
        android:textStyle="bold"
        android:layout_marginTop="20dp"
        android:textSize="20dp"
        android:id="@+id/tvResult" />

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:gravity="center">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/bSuma"
            android:id="@+id/bSumar" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/bResta"
            android:id="@+id/bRestar" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/bMultiplicar"
            android:id="@+id/bMultiplicar" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/bDividir"
            android:id="@+id/bDividir" />
    </LinearLayout>
</LinearLayout>

Con la vista creada podemos realizar nuestro primer test que consistirá en comprobar que los TextView y Button se crean y contienen los textos correctos. Creamos la clase MainActivityTest.java en la carpeta que creamos anteriormente para los Test. Esta clase contendrá dos Test, uno para comprobar los TextView y otro para los Button.

import android.os.Build;
import android.widget.Button;
import android.widget.TextView;
import org.aplie.android.robolectictest.BuildConfig;
import org.aplie.android.robolectictest.MainActivity;
import org.aplie.android.robolectictest.R;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.annotation.Config;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertTrue;
import org.junit.runner.RunWith;
import org.junit.Test;
import org.junit.Before;

@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.LOLLIPOP)
@RunWith(RobolectricGradleTestRunner.class)
public class MainActivityTest {
    private MainActivity activity;

    // @Before => Anotación que especifica que este método se debe ejecutar antes 
de la ejecución de cada prueba.
    // Utilidad para configurar los objetos que son necesarios para la prueba
    @Before
    public void setup() {
        activity = Robolectric.setupActivity(MainActivity.class);
    }

    // @Test => Anotación que especifica que es un test ejecutable
    // Test que comprueba que los TextView existen y contienen el texto correcto.
    @Test
    public void validateTextViewContent() {
        TextView tvFirstNumber = (TextView) activity.findViewById(R.id.tvFistNumber);
        TextView tvSecondNumber = (TextView) activity.findViewById(R.id.tvSecondNumber);
        TextView tvResult = (TextView) activity.findViewById(R.id.tvResult);

        assertNotNull("TextView FirstNumber could not be found", tvFirstNumber);
        assertNotNull("TextView SecondNumber not be found", tvSecondNumber);
        assertNotNull("TextView Result not be found", tvResult);

        assertTrue("TextView FirstNumber contains incorrect text",
                "Introduce el primer número".equals(tvFirstNumber.getText().toString()));
        assertTrue("TextView SecondNumber contains incorrect text",
                "Introduce el segundo número".equals(tvSecondNumber.getText().toString()));
        assertTrue("TextView Result contains incorrect text",
                "Resultado:".equals(tvResult.getText().toString()));
    }

    // @Test => Anotación que especifica que es un test ejecutable
    // Test que comprueba que los Button existen y contienen el texto correcto.
    @Test
    public void validateButtonContent() {
        Button suma = (Button) activity.findViewById(R.id.bSumar);
        Button resta = (Button) activity.findViewById(R.id.bRestar);
        Button multiplicacion = (Button) activity.findViewById(R.id.bMultiplicar);
        Button division = (Button) activity.findViewById(R.id.bDividir);

        assertNotNull("TextView FirstNumber could not be found", suma);
        assertNotNull("TextView SecondNumber not be found", resta);
        assertNotNull("TextView Result not be found", multiplicacion);
        assertNotNull("TextView Result not be found", division);

        assertTrue("TextView FirstNumber contains incorrect text",
                "Sumar".equals(suma.getText().toString()));
        assertTrue("TextView SecondNumber contains incorrect text",
                "Restar".equals(resta.getText().toString()));
        assertTrue("TextView Result contains incorrect text",
                "Multiplicar".equals(multiplicacion.getText().toString()));
        assertTrue("TextView Result contains incorrect text",
                "Dividir".equals(division.getText().toString()));
    }
}

Con la vista ya testeada crearemos una clase Calculadora.java que sera en la que realizaremos las operaciones. La clase quedara así.

public class Calculadora {
    public String suma(int valor1,int valor2){
        return Integer.toString(valor1 + valor2);
    }

    public String resta(int valor1,int valor2){
        return Integer.toString(valor1 - valor2);
    }

    public String multiplicar(int valor1,int valor2){
        return Integer.toString(valor1 * valor2);
    }

    public String dividir(int valor1,int valor2){
        String resutl = "";
        if(valor2 == 0){
            resutl = "No se puede dividir entre 0";
        }else {
            resutl = Integer.toString(valor1 / valor2);
        }

        return resutl;
    }
}

Con la clase Calculadora creada realizaremos los test para comprobar que los métodos de cada operación funcionan, para ello en la carpeta de los test creamos una nueva clase CalculadoraTest.java. Tendra cuatro test, uno para comprobar cada método de la clase.

public class CalculadoraTest {
    private Calculadora calculadora;

    @Before
    public void setup() {
        calculadora = new Calculadora();
    }

    // @Test => Anotación que especifica que es un test ejecutable
    // Test que comprueba el metodo de sumar
    @Test
    public void validateSumaMethod() {
        int valor1 = 5;
        int valor2 = 3;
        String expectedResult = "8";

        String result = calculadora.suma(valor1, valor2);

        assertEquals("The method Suma return incorrect result",expectedResult,result);
    }

    // Test que comprueba el metodo de resta
    @Test
    public void validateRestaMethod() {
        int valor1 = 5;
        int valor2 = 3;
        String expectedResult = "2";

        String result = calculadora.resta(valor1, valor2);

        assertEquals("The method Resta return incorrect result",expectedResult,result);
    }

    // Test que comprueba el metodo de multiplicar
    @Test
    public void validateMutiplicarMethod() {
        int valor1 = 5;
        int valor2 = 3;
        String expectedResult = "15";

        String result = calculadora.multiplicar(valor1, valor2);

        assertEquals("The method Multiplicar return incorrect result",expectedResult,result);
    }

    // Test que comprueba el metodo de dividir
    @Test
    public void validateDividirMethod() {
        int valor1 = 6;
        int valor2 = 2;
        String expectedResult = "3";

        String result = calculadora.dividir(valor1, valor2);
        String resutlZeroDivide = calculadora.dividir(valor1,0);

        assertEquals("The method dividir return incorrect result",expectedResult,result);
        assertEquals("The method dividir return incorrect result","No se puede dividir entre 0",resutlZeroDivide);
    }
}

Con los test creados podemos ya testear la aplicación. Pulsamos sobre cada clase test con el secundario y seleccionamos Run o pulsamos con el secundario sobre la carpeta java que creamos dentro del la carpeta test y seleccionamos Run ‘All Test’ para ejecutar todos los test.

Sin título-2

Sin título-1

Lo único que nos faltaría para terminar nuestra aplicación seria introducir el código correspondiente en los listeners OnClick de los botones en la clase MainActivity.java para darle la funcionalidad correspondiente.

Código completo en Github: https://github.com/ronocid/RobolecticTest.git

Si al ejecutar los test nos aparece la excepción: java.lang.RuntimeException: build\intermediates\bundles\debug\AndroidManifest.xml not found or not a file; it should point to your project’s AndroidManifest.xml, lo podemos solucionar fácilmente, vamos a Run > Edit Configurations y en el campor ‘Working Directory‘ añadimos a la ruta \app.

Anuncios

Publicado el 31/08/2015 en Desarrollo ágil de software, PMM y etiquetado en , , , . Guarda el enlace permanente. Comentarios desactivados en Creando Primer Test Robolectric.

Los comentarios están cerrados.

A %d blogueros les gusta esto: