Probando UI App con API 21/22 Android (Básico)

Standard

Muy buen día, hoy me propongo a hablarles un poco de lo que son pruebas en android.

El objetivo es dar una pequeña muestra de cómo podemos utilizar las herramientas proporcionadas por google para probar nuestras apps.

Esta primera versión está basada en la guía oficial que podemos encontrar aquí.

Pues a lo que vamos, lo primero que vamos a hacer es crear una app nueva con un activity vacío. Para este ejemplo llamaré a la app “ApplicationTest” y al activity “MainActivity”.

Ahora que ya tenemos nuestro proyecto vamos a validar que tengamos instalada Testing Support Library.

Para conseguir lo anterior es bastante simple, vamos y abrimos nuestro “Android SDK Manager”, para esto simplemente damos click en el ícono correspondiente Screen Shot 2015-12-17 at 14.01.39 con lo cual se nos mostrará la siguiente imagen.

Screen Shot 2015-12-17 at 14.02.40 (Asegurarte de estar en la pestaña “SDK Tools”).

Una vez en esta pantalla, buscaremos “Android Support Repository“, los seleccionamos e instalamos.

Después procederemos a agregar las dependencias necesarias. Para lograrlo abrimos nuestro archivo “build.gradle”, aquí hay que tener cuidado de editar el de nuestro módulo y no es del proyecto completo. Una vez editado se verá algo así, nótese que la parte seleccionada es lo que se ha agregado.

Screen Shot 2015-12-17 at 14.07.47

Código:

 androidTestCompile 'com.android.support:support-annotations:23.0.1'
androidTestCompile 'com.android.support.test:runner:0.4.1'
androidTestCompile 'com.android.support.test:rules:0.4.1'
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'

Una vez listas las dependencias vamos a especificar que se utilice “AndroidJUnitRunner” para ejecutar nuestras pruebas.

Screen Shot 2015-12-17 at 14.11.41

Código:

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

Ahora vamos a darle sincronizar a nuestro archivo gradle para instalar las dependencias. La teoría nos dice que esto debería ser suficiente, pero si al igual que yo, utilizan el api < 23 es muy probable que les indique un error.

Warning:Conflict with dependency ‘com.android.support:support-annotations’. Resolved versions for app (22.2.1) and test app (23.0.1) differ. See http://g.co/androidstudio/app-test-app-conflict for details.

Si compilan con este error, puede que compile, pero al momento de ejecutar va a marcar error. La causa de este inconveniente es que “espresso” que es la herramienta para pruebas usa una versión de “support-annotations” más actual que la que nuestra api soporta, para esto vamos a agregar un par de líneas.

Screen Shot 2015-12-17 at 14.21.51

configurations.all { resolutionStrategy { force ‘com.android.support:support-annotations:22.+’ } }

Sincronizamos de nuevo y el mensaje deberá haber desaparecido.

Ahora vamos a modificar nuestra app para que se vea algo así:

Screen Shot 2015-12-17 at 14.36.58(No se entrarán en detalles sobre cómo hacer esto ya que es básico, pero si tienen duda pueden preguntar con toda confianza.)

Y nuestro código de nuestra clase “MainActivity” se vería algo así:

package com.example.hunabsys.testingapp;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView text = (TextView) findViewById(R.id.textView);
                text.setText("Hola, Mundo");
            }
        });
    }
}

Ahora vamos a correr nuestra app y debería cambiar el texto al dar click en el botón. Básicamente estamos haciendo la prueba manual, lo siguiente es automatizarla.

Procedemos a crear el archivo “MyFirstTest.java” dentro de nuestra carpeta de pruebas (Debe encontrarse donde está el archivo “ApplicationTest.java”). Y llenamos el archivo con el contenido:

package com.example.hunabsys.testingapp;

import android.test.ActivityInstrumentationTestCase2;

import org.junit.Before;

/**
 * Created by hunabsys on 12/17/15.
 */
public class MyFirstTest extends ActivityInstrumentationTestCase2{
    private MainActivity mActivity;
    public MyFirstTest(){
        super(MainActivity.class);
    }
    @Before
    public void setUp()throws Exception{
        super.setUp();
        mActivity = getActivity();
    }
}

Con esto aun no se está probando nada, simplemente es el contenido básico.

Ahora agregamos nuestra primera prueba.

 
@UiThreadTest
public void testClickButton(){
        TextView nameView = (TextView)mActivity.findViewById(R.id.textView);
        assertEquals("Hello, World!",nameView.getText().toString());
        Button button = (Button) mActivity.findViewById(R.id.button);
        button.callOnClick();
        assertEquals("Hola, Mundo!",nameView.getText().toString());


    }

Es importante que tomes en cuenta que el nombre de la prueba debe empezar con la palabra “test”.

Ahora vamos a correr nuestra prueba, dando click derecho en el archivo y seleccionando la opción “Run”. Si el código es exactamente igual nos va a decir que ocurrió el siguiente error:

“junit.framework.ComparisonFailure: expected:<Hello[,] World!> but was:<Hello[] World!>”, como podemos ver, nosotros indicamos que debe haber una “,” separando las palabras, vamos a solucionar esto, modificando nuestra vista. Bastará con editar la el texto y agregar la coma.

Volvemos a correr la prueba. Y ahora el error es prácticamente igual sólo que nos pide un “!”. Para solucionarlo vamos a nuestro evento “onClick” y realizamos el cambio.

text.setText("Hola, Mundo");

Debe ser ahora.

text.setText("Hola, Mundo!");

Volvemos a correr otra vez nuestra prueba y veremos que nuestros errores se han ido.

De igual manera cada vez que se ejecutan las pruebas podemos ver cómo se llevan a cabo.

No me cansaré de repetir lo importante que son las pruebas, no las tomen a la ligera ya que son una herramienta muy importante para garantizar la calidad de nuestras aplicaciones y de que las modificaciones que hagamos no afecten funcionalidad terminada.

Pues bueno, eso es todo por el día de hoy, más adelante me tomaré el tiempo para hacer una app más compleja donde podamos utilizar pruebas más completas.

Saludos.

Leave a Reply

Your email address will not be published. Required fields are marked *