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
:
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.
Curso de Android Studio
Módulo 1: Introducción a Android Studio
- Introducción a Android Studio
- Configuración de Android Studio
- Entendiendo la interfaz de Android Studio
- Creando tu primer proyecto Android
Módulo 2: Desarrollo básico de Android
- Entendiendo la estructura del proyecto Android
- Introducción a los diseños XML
- Componentes básicos de la interfaz de usuario
- Introducción a las actividades
- Ejecutando tu aplicación en un emulador
Módulo 3: Desarrollo intermedio de Android
- Introducción a los Intents
- Trabajando con Fragmentos
- Manejo de la entrada del usuario
- Usando RecyclerView
- Redes en Android
Módulo 4: Desarrollo avanzado de Android
- Persistencia de datos con SQLite
- Usando Room para la gestión de bases de datos
- Componentes avanzados de la interfaz de usuario
- Vistas personalizadas y Canvas
- Trabajando con tareas en segundo plano
Módulo 5: Desarrollo profesional de Android
- Implementando la arquitectura MVVM
- Inyección de dependencias con Dagger
- Pruebas unitarias y pruebas de interfaz de usuario
- Publicando tu aplicación en Google Play
- Optimización del rendimiento