Skip to main content

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.