Quality Gates en CI: coverage mínimo con pytest-cov y bloqueo de merges

Compartir en:

Una vez que un proyecto cuenta con Integración Continua (CI), el siguiente paso para fortalecer la calidad
del software es definir quality gates. Un quality gate establece condiciones objetivas que deben
cumplirse para permitir la integración de cambios a la rama principal del repositorio.

En este artículo se documenta cómo implementar un quality gate basado en cobertura de pruebas
utilizando pytest-cov, y cómo vincularlo a las reglas del repositorio en GitHub para
bloquear merges cuando los criterios de calidad no se cumplen.

¿Qué es un quality gate en Integración Continua?

Un quality gate es un punto de control automático dentro del pipeline de CI. Su función es evaluar
métricas de calidad —como pruebas exitosas, cobertura de código o análisis estático— y determinar si
un cambio puede avanzar en el flujo de integración.

En la práctica, un quality gate se materializa como un status check obligatorio:
si el pipeline falla, el merge queda bloqueado. Esto reduce riesgos y estandariza expectativas de calidad
en el equipo.

Objetivo de esta implementación

  • Medir cobertura de pruebas con pytest-cov.
  • Definir un umbral mínimo de cobertura (80% como referencia).
  • Ejecutar la validación automáticamente en CI.
  • Bloquear merges a main cuando el coverage no cumple el umbral.

Prerrequisitos

  • Repositorio con CI configurado usando GitHub Actions.
  • Pruebas automatizadas ejecutándose con pytest.
  • Rama main protegida mediante Pull Requests.

1) Incorporar pytest-cov al proyecto

Para habilitar la medición de cobertura, se agrega la dependencia pytest-cov.
En el archivo requirements.txt:

pytest==8.3.4
pytest-cov

Luego, se instalan las dependencias:

pip install -r requirements.txt

2) Validar cobertura localmente

Antes de exigir un umbral en CI, es recomendable ejecutar la validación en local.
En Windows PowerShell:

$env:PYTHONPATH="src"
pytest -q --cov=qa_ci_cd_lab --cov-report=term-missing --cov-fail-under=80

Este comando:

  • Ejecuta las pruebas.
  • Muestra las líneas no cubiertas en consola.
  • Falla si la cobertura total es inferior al 80%.

3) Aplicar el quality gate en GitHub Actions

Para que el quality gate sea efectivo, la misma validación debe ejecutarse en el pipeline de CI.
En el workflow de GitHub Actions, se actualiza el step de pruebas:

- name: Run tests with coverage
  run: |
    PYTHONPATH=src pytest -q \
      --cov=qa_ci_cd_lab \
      --cov-report=term-missing \
      --cov-fail-under=80

Con esta configuración, el pipeline falla automáticamente cuando:

  • Alguna prueba no pasa.
  • La cobertura cae por debajo del umbral definido.

4) Bloqueo de merges mediante status checks

Una vez que el workflow se ejecuta correctamente y genera un status check estable, este puede
configurarse como requisito obligatorio para mergear a main.

En GitHub:

  1. Ir a Settings → Rules → Rulesets.
  2. Editar el ruleset que aplica a la rama main.
  3. Activar Require status checks to pass.
  4. Seleccionar el check correspondiente al workflow de CI.

De esta forma, el merge queda bloqueado hasta que el quality gate se cumpla.

Validación del funcionamiento

Para confirmar que el quality gate está correctamente configurado, se puede realizar una prueba
controlada:

  1. Crear un Pull Request que reduzca la cobertura de pruebas.
  2. Verificar que el pipeline de CI falla.
  3. Confirmar que GitHub bloquea el merge automáticamente.

Conclusiones

Los quality gates permiten trasladar criterios de calidad desde la documentación hacia la automatización.
Al exigir cobertura mínima y bloquear merges automáticamente, el repositorio incorpora controles
objetivos que reducen riesgos y mejoran la mantenibilidad del código.

Incluso en proyectos pequeños o personales, esta práctica aporta disciplina técnica y sirve como
evidencia concreta de experiencia en CI y aseguramiento de la calidad.

Repositorio de referencia

La implementación completa utilizada en este artículo está disponible en:

https://github.com/CFontalvo/qa-ci-cd-lab

Siguiente artículo

Publicación de reportes de pruebas y coverage como artifacts en GitHub Actions

Compartir en: