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
