Introducción

En este módulo, aprenderás sobre la importancia de las pruebas en el desarrollo de aplicaciones Android. Nos enfocaremos en dos tipos principales de pruebas: pruebas unitarias y pruebas de interfaz de usuario (UI). Las pruebas unitarias aseguran que las unidades individuales de código funcionen correctamente, mientras que las pruebas de UI verifican que la interfaz de usuario de la aplicación funcione como se espera.

Pruebas Unitarias

¿Qué son las Pruebas Unitarias?

Las pruebas unitarias son pruebas automatizadas que verifican el comportamiento de una unidad de código, generalmente una función o un método. Estas pruebas son esenciales para asegurar que cada parte de tu aplicación funcione correctamente de manera aislada.

Herramientas para Pruebas Unitarias en Android

  • JUnit: Es el framework más común para escribir pruebas unitarias en Java y Android.
  • Mockito: Es una biblioteca de simulación que permite crear objetos simulados para pruebas.

Configuración de JUnit y Mockito

Para empezar a escribir pruebas unitarias, necesitas agregar las siguientes dependencias a tu archivo build.gradle:

dependencies {
    testImplementation 'junit:junit:4.13.2'
    testImplementation 'org.mockito:mockito-core:3.11.2'
}

Ejemplo de Prueba Unitaria

Supongamos que tienes una clase Calculator con un método add:

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}

Puedes escribir una prueba unitaria para este método de la siguiente manera:

import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class CalculatorTest {
    @Test
    public void testAdd() {
        Calculator calculator = new Calculator();
        int result = calculator.add(2, 3);
        assertEquals(5, result);
    }
}

Ejercicio Práctico

Ejercicio: Escribe una prueba unitaria para un método subtract en la clase Calculator.

Solución:

public class Calculator {
    public int subtract(int a, int b) {
        return a - b;
    }
}

import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class CalculatorTest {
    @Test
    public void testSubtract() {
        Calculator calculator = new Calculator();
        int result = calculator.subtract(5, 3);
        assertEquals(2, result);
    }
}

Pruebas de Interfaz de Usuario (UI)

¿Qué son las Pruebas de UI?

Las pruebas de UI verifican que la interfaz de usuario de tu aplicación funcione como se espera. Estas pruebas interactúan con la aplicación de la misma manera que lo haría un usuario real.

Herramientas para Pruebas de UI en Android

  • Espresso: Es una biblioteca de pruebas de UI proporcionada por Google que facilita la escritura de pruebas de UI.

Configuración de Espresso

Agrega las siguientes dependencias a tu archivo build.gradle:

androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'

Ejemplo de Prueba de UI

Supongamos que tienes una actividad con un EditText y un Button. Cuando el botón es presionado, el texto del EditText se muestra en un TextView.

<!-- activity_main.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter text" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Submit" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="" />
</LinearLayout>
// MainActivity.java
public class MainActivity extends AppCompatActivity {
    private EditText editText;
    private TextView textView;

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

        editText = findViewById(R.id.editText);
        textView = findViewById(R.id.textView);
        Button button = findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String text = editText.getText().toString();
                textView.setText(text);
            }
        });
    }
}

Puedes escribir una prueba de UI para esta actividad de la siguiente manera:

import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.rule.ActivityTestRule;

import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.typeText;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;

@RunWith(AndroidJUnit4.class)
public class MainActivityTest {
    @Rule
    public ActivityTestRule<MainActivity> activityRule =
            new ActivityTestRule<>(MainActivity.class);

    @Test
    public void testButton_click() {
        // Type text in the EditText
        onView(withId(R.id.editText)).perform(typeText("Hello World"));

        // Click the button
        onView(withId(R.id.button)).perform(click());

        // Check if the TextView displays the correct text
        onView(withId(R.id.textView)).check(matches(withText("Hello World")));
    }
}

Ejercicio Práctico

Ejercicio: Escribe una prueba de UI para verificar que el TextView se vacía cuando se presiona un botón de "Clear".

Solución:

Primero, agrega un botón de "Clear" en tu activity_main.xml:

<Button
    android:id="@+id/buttonClear"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Clear" />

Luego, actualiza tu MainActivity.java:

// MainActivity.java
public class MainActivity extends AppCompatActivity {
    private EditText editText;
    private TextView textView;

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

        editText = findViewById(R.id.editText);
        textView = findViewById(R.id.textView);
        Button button = findViewById(R.id.button);
        Button buttonClear = findViewById(R.id.buttonClear);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String text = editText.getText().toString();
                textView.setText(text);
            }
        });

        buttonClear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textView.setText("");
            }
        });
    }
}

Finalmente, escribe la prueba de UI:

import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.rule.ActivityTestRule;

import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.typeText;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;

@RunWith(AndroidJUnit4.class)
public class MainActivityTest {
    @Rule
    public ActivityTestRule<MainActivity> activityRule =
            new ActivityTestRule<>(MainActivity.class);

    @Test
    public void testButton_click() {
        // Type text in the EditText
        onView(withId(R.id.editText)).perform(typeText("Hello World"));

        // Click the button
        onView(withId(R.id.button)).perform(click());

        // Check if the TextView displays the correct text
        onView(withId(R.id.textView)).check(matches(withText("Hello World")));
    }

    @Test
    public void testButtonClear_click() {
        // Type text in the EditText
        onView(withId(R.id.editText)).perform(typeText("Hello World"));

        // Click the button
        onView(withId(R.id.button)).perform(click());

        // Click the clear button
        onView(withId(R.id.buttonClear)).perform(click());

        // Check if the TextView is empty
        onView(withId(R.id.textView)).check(matches(withText("")));
    }
}

Conclusión

En esta sección, hemos cubierto los conceptos básicos de las pruebas unitarias y las pruebas de interfaz de usuario en Android. Aprendiste a configurar JUnit y Mockito para pruebas unitarias y Espresso para pruebas de UI. Además, vimos ejemplos prácticos y ejercicios para reforzar los conceptos. Las pruebas son una parte crucial del desarrollo de software, ya que aseguran que tu aplicación funcione correctamente y te ayudan a detectar errores antes de que lleguen a los usuarios finales.

En el próximo módulo, profundizaremos en la publicación de tu aplicación en Google Play, asegurando que esté lista para ser distribuida a una audiencia más amplia.

© Copyright 2024. Todos los derechos reservados