9 - Pruebas automatizadas

Objetivo del tema

Aprenderas a integrar marcos de pruebas populares con Gradle, ejecutar suites automatizadas, interpretar reportes y complementar el pipeline con cobertura de codigo.

Al finalizar, podras definir dependencias de prueba, personalizar el ciclo gradle test, publicar reportes reutilizables y forzar umbrales de calidad con JaCoCo.

9.1 Integracion con JUnit/TestNG

Gradle incluye soporte nativo para JUnit 5 y permite cambiar a TestNG u otros runners con una configuracion minima. Las pruebas viven en src/test/java o src/test/kotlin, separadas del codigo productivo.

plugins {
  id 'java'
}

dependencies {
  testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2'
  testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.2'
}

test {
  useJUnitPlatform()
  testLogging {
    events 'passed', 'skipped', 'failed'
    exceptionFormat 'full'
  }
}

Para TestNG, reemplaza useJUnitPlatform() por useTestNG() y agrega testImplementation 'org.testng:testng:7.9.0'. Puedes filtrar grupos con options.includeGroups('regression').

package com.ejemplo;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

class CalculadoraTest {
  @ParameterizedTest
  @ValueSource(ints = {2, 4, 6})
  @DisplayName("Los numeros pares generan resultado verdadero")
  void esPar(int numero) {
    Assertions.assertTrue(numero % 2 == 0);
  }
}

Incorporar casos parametrizados o pruebas anidadas ayuda a aumentar la cobertura sin duplicar codigo.

9.2 Configuracion de tareas de prueba (gradle test)

La tarea test compila las clases de prueba, ejecuta los casos y produce reportes en build/reports/tests. Puedes ajustar memoria, paralelismo y filtros para obtener retroalimentacion rapida.

test {
  maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2).coerceAtLeast(1)
  maxHeapSize = '512m'
  failFast = true
  systemProperties['env'] = System.getProperty('env', 'local')

  testLogging {
    events 'failed', 'standardError'
    showStandardStreams = project.hasProperty('debugTests')
  }

  reports {
    junitXml.required.set(true)
    html.required.set(true)
  }

  filter {
    includeTestsMatching 'com.ejemplo.*'
    excludeTestsMatching '*Integracion'
  }
}

Comandos utiles:

  • gradle test --tests "com.ejemplo.CalculadoraTest" para ejecutar un conjunto puntual.
  • gradle test --continuous recompila y relanza cuando cambian clases o pruebas.
  • En CI, ejecuta ./gradlew clean test con el wrapper para asegurar la version correcta de Gradle.

9.3 Reportes de pruebas

Gradle genera reportes HTML y XML que pueden subirse a Jenkins, GitLab CI, GitHub Actions u otras plataformas. El informe HTML se encuentra en build/reports/tests/test/index.html e incluye resumen, tiempo de ejecucion y stacktraces.

  • Exporta los XML en build/test-results/test; herramientas de CI los transforman en estadisticas historicas.
  • Puedes cambiar el destino con reports.html.outputLocation.set(layout.buildDirectory.dir("reports/tests/ui")).
  • En proyectos multi-modulo, ejecuta gradle test aggregateTestReports con plugins como report-aggregation para consolidar resultados.

Compartir los reportes en la intranet del equipo evita reproducir fallas manualmente y documenta la estabilidad del build.

9.4 Integracion con herramientas de cobertura (JaCoCo)

El plugin jacoco genera reportes de cobertura y permite definir umbrales minimos obligatorios. Tambien se integra con pipelines para bloquear despliegues cuando la cobertura baja.

plugins {
  id 'java'
  id 'jacoco'
}

jacoco {
  toolVersion = '0.8.11'
}

jacocoTestReport {
  dependsOn test
  reports {
    xml.required.set(true)
    html.required.set(true)
    csv.required.set(false)
  }
}

jacocoTestCoverageVerification {
  dependsOn jacocoTestReport
  violationRules {
    rule {
      limit {
        counter = 'LINE'
        minimum = 0.75
      }
    }
  }
}

check.dependsOn jacocoTestCoverageVerification

// Ejecutar cobertura
// gradle clean test jacocoTestReport jacocoTestCoverageVerification

El reporte HTML queda en build/reports/jacoco/test/html/index.html y el XML se usa para publicar resultados en herramientas externas (por ejemplo SonarQube). Define reglas adicionales para metodos o ramas segun las necesidades del equipo.

Resumen didactico

Las pruebas automatizadas en Gradle refuerzan la calidad continua: combina JUnit o TestNG para ejecutar suites, personaliza la tarea test para obtener feedback veloz, publica reportes visibles y controla la cobertura con JaCoCo para prevenir regresiones.