7. Lineamientos de Pruebas Unitarias con JUnit 5
Este apartado define los lineamientos para la implementación de pruebas unitarias en los proyectos Android usando JUnit 5, asegurando calidad, mantenibilidad y confiabilidad del software desarrollado.
7.1 Objetivos
- Validar la lógica de negocio sin dependencia del framework Android.
- Detectar errores funcionales de forma temprana.
- Automatizar la ejecución de pruebas en CI/CD.
- Asegurar una cobertura mínima del 85%.
7.2 Configuración de JUnit 5
Agregar las siguientes dependencias en el archivo build.gradle.kts:
testImplementation("org.junit.jupiter:junit-jupiter-api:5.10.0")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.10.0")
testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3")
testImplementation("io.mockk:mockk:1.13.7")
Habilitar la plataforma JUnit 5:
tasks.withType<Test> {
useJUnitPlatform()
}
7.3 Organización de pruebas
project/
└── src/
└── test/
└── kotlin/
└── com/alpura/appname/
├── usecases/
├── repositories/
└── viewmodels/
7.4 Estructura de un test típico
@ExtendWith(MainCoroutineExtension::class)
class ObtenerUsuarioUseCaseTest {
private lateinit var useCase: ObtenerUsuarioUseCase
private val mockRepository: UsuarioRepository = mockk()
@BeforeEach
fun setup() {
useCase = ObtenerUsuarioUseCase(mockRepository)
}
@Test
fun `cuando se obtiene usuario, retorna información válida`() = runTest {
val usuarioMock = Usuario(id = 1, nombre = "Juan")
coEvery { mockRepository.obtenerUsuario(any()) } returns usuarioMock
val result = useCase(1)
assertEquals("Juan", result.nombre)
}
}
7.5 Buenas prácticas
✅ Usar @BeforeEach para setup de test
✅ Separar pruebas de usecases, viewmodels, repositories
✅ Nombrar los tests de forma descriptiva
✅ Usar MockK para dependencias
✅ Ejecutar pruebas en CI antes de cada merge
✅ Validar que todos los tests pasen en local antes de subir código
7.6 Cobertura mínima requerida
- La cobertura global del módulo debe ser igual o superior al 85%.
- Debe medirse con JaCoCo:
plugins {
id("jacoco")
}
jacoco {
toolVersion = "0.8.10"
}
Generar el reporte:
./gradlew jacocoTestReport
7.7 Pruebas de ViewModel y Compose
- Utilizar
createAndroidComposeRule()para pruebas de UI - Validar interacción con estado, recomposición y eventos de UI
@get:Rule
val composeTestRule = createComposeRule()
@Test
fun muestraTituloCorrecto() {
composeTestRule.setContent {
PantallaUsuario(nombre = "Juan")
}
composeTestRule.onNodeWithText("Juan").assertIsDisplayed()
}
7.8 Integración con CI
- Las pruebas deben ejecutarse automáticamente en el pipeline CI
- El pipeline debe bloquear merges si las pruebas fallan
- El reporte de cobertura debe estar visible para el equipo
Aplicar estas prácticas asegura un desarrollo orientado a calidad, minimizando regresiones y errores lógicos antes de pasar a entornos de QA o producción.