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
maincuando el coverage no cumple el umbral.
Prerrequisitos
- Repositorio con CI configurado usando GitHub Actions.
- Pruebas automatizadas ejecutándose con
pytest. - Rama
mainprotegida 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:
- Ir a Settings → Rules → Rulesets.
- Editar el ruleset que aplica a la rama
main. - Activar Require status checks to pass.
- 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:
- Crear un Pull Request que reduzca la cobertura de pruebas.
- Verificar que el pipeline de CI falla.
- 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

