Testing Button Robolectric

Button_Android

En este ejemplo se vera como testear un Button en Android. Creamos  un nuevo proyecto Android y lo preparamos para poder utilizar Robolectric. Este proyecto constara de dos Activities la primera solo tendrá un Button y la segunda tendrá un EditText, un TextView y un Button.

MainActivity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    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">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Activity"
        android:id="@+id/button"
        android:layout_alignParentStart="true"
        android:layout_marginTop="104dp" />

</RelativeLayout>

SecondActivity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    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="org.aplie.android.robolectrictestbutton.SecondActivity">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/editText"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentEnd="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/textView2"
        android:layout_below="@+id/editText"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="85dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Calculate Size"
        android:id="@+id/button2"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

– Primer Test:

En el primer test vamos a comprobar el funcionamiento del button en la activity MainActivity, cuando se pulse este botón se debe lanzar la segunda activity. Primero vamos a escribir el funcionamiento del boton.

MainActivity.java

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

    Button button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(MainActivity.this,SecondActivity.class);
            startActivity(i);
        }
    });
}

Con el botón ya implementado creamos en nuestro directorio de test la clase MainActivityTest.java donde implementaremos nuestros test. Lo que testearemos es si el intent a sido lanzado, como la clase Activity no guarda los intents que lanza deberemos utilizar la clase ShadowActivity.

Las clases Shadow son clases que modifican o amplían el comportamiento de las clases Android, en este caso utilizaremos un método de la clase shadow, que no existe en la clase activity. La clase ShadowActivity a diferencia de la clase activity almacena en un registro todas las activities que lanza.

Recuperaremos el Intent lanzado y comprobaremos si es correcto. Para indicar que un Button a sido pulsado utilizaremos el método performClick();

MainActivityTest.java

@Test
public void secondActivityStartedOnClick(){
    Button button = (Button) activity.findViewById(R.id.button);
    button.performClick();

    //El intent que esperamos que se lanze cuando pulsemos el boton
    Intent expectedIntent = new Intent(activity, SecondActivity.class);

    //Un Activity de Android no tiene ningun forma de mostrar las activities que lanza
    //ShadowActivity tiene un registro de todas las actividades lanzadas y muestra esa información a traves del metodo getNextStartedActivity
    ShadowActivity shadowActivity = Shadows.shadowOf(activity);
    Intent actualIntent = shadowActivity.getNextStartedActivity();

    assertTrue(actualIntent.filterEquals(expectedIntent));
}

– Segundo Test:

En este segundo test vamos a testear el boton de la clase SecondActivity. En esta clase tenemos tres elementos, un EditText, un TextView y el button. Cuando pulsemos sobre el botón el TextView mostrara el texto escrito en el EditText. Vamos a testear que si el EditText esta vacio en el TextView se muestre la cadena “Sin Texto” indicando que no se escribio nada. Escribimos el funcionamiento de la clase.

SecondActivity.java

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

    final EditText et = (EditText) findViewById(R.id.editText);
    final TextView tv = (TextView) findViewById(R.id.textView2);

    Button button = (Button) findViewById(R.id.button2);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String texto = et.getText().toString();
            int sizeText = texto.length();
            if(sizeText==0){
                tv.setText("Sin texto");
            }else {
                tv.setText(sizeText+"");
            }
        }
    });
}

Creamos la clase para los test SecondActivityTest.java. Esta clase tendrá dos test, en el primero comprobaremos que en el caso de que el EditText no tenga texto aparezca la cadena “Sin texto” en el TextView y en el segundo se comprobara en el texto escrito en el EditText aparezca en el TextView. Para crear estos test lo único que haremos sera recuperar el texto en el TextView después de que se pulse el button y comprobar si es correcto.

SecondActivityTest.java

private SecondActivity 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(SecondActivity.class);
}

@Test
public void withoutEnteringData(){
    EditText et = (EditText) activity.findViewById(R.id.editText);
    TextView tv = (TextView) activity.findViewById(R.id.textView2);
    Button button = (Button) activity.findViewById(R.id.button2);

    button.performClick();

    String result = tv.getText().toString();

    assertEquals("No se muestra el mensaje cuando no se introducen datos","Sin texto",result);
}

@Test
public void withEnteringData(){
    EditText et = (EditText) activity.findViewById(R.id.editText);
    TextView tv = (TextView) activity.findViewById(R.id.textView2);
    Button button = (Button) activity.findViewById(R.id.button2);
    et.setText("Prueba de texto");
    button.performClick();

    String count = tv.getText().toString();

    assertEquals("No se muestra el mensaje cuando no se introducen datos","15",count);
}

Con esto tenemos dos ejemplos sencillos de como testear un botón cuando es pulsado.

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

Anuncios

Publicado el 07/09/2015 en Desarrollo ágil de software, PMM y etiquetado en , , . Guarda el enlace permanente. Comentarios desactivados en Testing Button Robolectric.

Los comentarios están cerrados.

A %d blogueros les gusta esto: