Los artefactos de pruebas—casos de prueba, scripts de automatización, datos de prueba y documentación—son activos críticos del proyecto que evolucionan continuamente. Tratar la documentación de pruebas como código con control de versiones adecuado habilita colaboración, rastreo de cambios y gestión de calidad.
Filosofía de Documentación como Código
Documentación como Código (DocsAsCode) aplica prácticas de desarrollo de software a la documentación de pruebas: control de versiones, code reviews, builds automatizados e integración continua.
Beneficios del Control de Versiones de Artefactos
beneficios_control_versiones:
trazabilidad:
- Rastrear quién cambió qué y cuándo
- Vincular cambios a requisitos y bugs
- Pista de auditoría para cumplimiento
- Análisis de responsabilidad para problemas
colaboracion:
- Múltiples testers trabajan simultáneamente
- Reviews de pull request para calidad
- Compartir conocimiento a través del historial
- Coordinación de equipo remoto
gestion_cambios:
- Rollback a versiones anteriores
- Comparar versiones en el tiempo
- Fusionar cambios de diferentes fuentes
- Branching para trabajo paralelo
automatizacion:
- Integración CI/CD
- Ejecución automatizada de pruebas en commit
- Builds de documentación desde fuente
- Puertas de calidad en pull requests
Estrategias Git para Artefactos de Prueba
Estructura de Repositorio
# Estructura de Repositorio de Artefactos de Prueba
test-automation/
├── .git/
├── .github/
│ └── workflows/ # Pipelines CI/CD
├── tests/
│ ├── unit/ # Pruebas unitarias
│ ├── integration/ # Pruebas de integración
│ ├── e2e/ # Pruebas end-to-end
│ └── performance/ # Pruebas de rendimiento
├── test-cases/
│ ├── manual/ # Casos de prueba manuales (Markdown)
│ └── automated/ # Scripts de prueba
├── test-data/
│ ├── fixtures/ # Datos de prueba estáticos
│ ├── generators/ # Scripts de generación de datos
│ └── schemas/ # Esquemas de validación
├── test-plans/
│ └── projects/
├── docs/
│ ├── test-strategy.md
│ └── contributing.md
├── .gitignore
├── README.md
└── CHANGELOG.md
.gitignore para Proyectos de Prueba
# .gitignore para proyecto de automatización de pruebas
# Artefactos de ejecución de pruebas
test-results/
test-output/
screenshots/
videos/
logs/
*.log
# Entorno y secretos
.env
*.key
credentials.json
secrets.yaml
# Archivos IDE
.idea/
.vscode/
.DS_Store
# Dependencias
node_modules/
venv/
__pycache__/
# Pero rastrear datos de muestra
!test-data/samples/
!test-data/fixtures/*.json
Estrategias de Branching
Git Flow para Desarrollo de Pruebas
# Modelo de Branching de Artefactos de Prueba
## Tipos de Branches
### main (o master)
- Artefactos de prueba listos para producción
- Branch protegido, requiere aprobación de PR
- Etiquetado para releases
### develop
- Branch de integración para desarrollo continuo de pruebas
- Todos los feature branches se fusionan aquí primero
- Ejecuta integración continua
### feature/* (ej: feature/payment-tests)
- Nuevos casos de prueba o suites de pruebas
- Branch desde: develop
- Fusionar a: develop
- Ejemplo: feature/checkout-automation
### bugfix/* (ej: bugfix/flaky-login-test)
- Correcciones para pruebas rotas o flaky
- Branch desde: develop
- Fusionar a: develop
### release/* (ej: release/2.5)
- Preparar artefactos de prueba para release
- Branch desde: develop
- Fusionar a: main y develop
## Ejemplo de Flujo de Trabajo
1. Crear feature branch:
```bash
git checkout develop
git pull origin develop
git checkout -b feature/payment-edge-cases
Desarrollar pruebas:
git add tests/payment/edge-cases.spec.js git commit -m "Add: Pruebas de casos edge de pago para reembolsos"
Push y crear PR:
git push -u origin feature/payment-edge-cases # Crear Pull Request en GitHub/GitLab
Preparación de release:
git checkout develop git checkout -b release/2.5 # Ejecutar suite de regresión completa git commit -m "Preparar release 2.5"
Release a producción:
git checkout main git merge release/2.5 git tag -a v2.5.0 -m "Release 2.5.0" git push origin main --tags
## Resolución de Conflictos de Merge
### Escenarios de Conflicto Comunes
```markdown
# Manejo de Conflictos en Artefactos de Prueba
## Escenario 1: Cambios Conflictivos en Casos de Prueba
### Conflicto:
```diff
<<<<<<< HEAD (tus cambios)
test('Login de usuario con credenciales válidas', () => {
cy.visit('/login')
cy.get('#username').type('testuser@example.com')
cy.get('#login-button').click()
})
=======
test('Login de usuario con credenciales válidas', () => {
cy.visit('/auth/login') # URL cambió
cy.get('[data-testid="username"]').type('testuser@example.com') # Selector cambió
cy.get('[data-testid="login-btn"]').click() # Selector cambió
})
>>>>>>> feature/update-selectors
Resolución:
// Mantener ambas actualizaciones de URL y selector
test('Login de usuario con credenciales válidas', () => {
cy.visit('/auth/login') // Aceptar nueva URL
cy.get('[data-testid="username"]').type('testuser@example.com') // Aceptar nuevo selector
cy.get('[data-testid="login-btn"]').click() // Aceptar nuevo selector
})
Mejores Prácticas para Resolución
- Entender Ambos Cambios: Leer ambas versiones completamente
- Comunicar: Preguntar a autores originales sobre intención
- Probar Después de Fusionar: Ejecutar pruebas afectadas
- Documentar Decisión: Agregar mensaje de commit explicando resolución
## Documentación como Código
### Markdown para Documentación de Pruebas
```markdown
# Caso de Prueba: Registro de Usuario
**ID**: TC-AUTH-001
**Prioridad**: Alta
**Categoría**: Funcional
## Objetivo
Verificar que usuarios pueden registrarse exitosamente con credenciales válidas.
## Precondiciones
- Base de datos de usuarios accesible
- Servicio de email configurado
## Pasos de Prueba
| Paso | Acción | Resultado Esperado |
|------|--------|-------------------|
| 1 | Navegar a /register | Formulario de registro mostrado |
| 2 | Ingresar email válido | Campo acepta input |
| 3 | Ingresar contraseña | Indicador muestra "Fuerte" |
| 4 | Click en "Registrar" | Mensaje de éxito mostrado |
| 5 | Verificar email | Email de verificación recibido |
## Resultado Esperado
Cuenta creada, email de verificación enviado, cuenta activada al hacer click en link.
## Estado
✅ Pass | ❌ Fail | ⏸️ Blocked
Integración CI/CD
GitHub Actions Workflow
# .github/workflows/test-docs-validation.yml
name: Validación de Documentación de Pruebas
on:
pull_request:
paths:
- 'test-cases/**'
- 'docs/**'
push:
branches: [main, develop]
jobs:
validate-markdown:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Lint archivos Markdown
uses: articulate/actions-markdownlint@v1
- name: Verificar enlaces rotos
uses: gaurav-nelson/github-action-markdown-link-check@v1
run-automated-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Ejecutar pruebas automatizadas
run: npm test
- name: Subir resultados
uses: actions/upload-artifact@v3
with:
name: test-results
path: test-results/
Mejores Prácticas
Guías de Mensaje de Commit
# Formato de Mensaje de Commit
<tipo>(<scope>): <asunto>
## Tipos
- **feat**: Nuevo caso de prueba o suite
- **fix**: Corrección de bug en prueba
- **docs**: Cambios de documentación
- **refactor**: Reestructuración de código
- **test**: Agregar o actualizar pruebas automatizadas
## Ejemplos
feat(checkout): Agregar pruebas de casos edge para reembolsos de pago
- Probar reembolsos de valor cero
- Probar reembolsos parciales
- Probar reembolso a método de pago original
Closes #4532
fix(login): Resolver timeout flaky en prueba de login
La prueba de login tenía timeout intermitente debido a delays de animación. Agregado wait explícito para completar animación.
Fixes #4521
Conclusión
El control de versiones de artefactos de pruebas con Git aporta rigor de ingeniería de software a la documentación de pruebas. Al implementar estrategias adecuadas de branching, resolver conflictos sistemáticamente, tratar la documentación como código e integrar con pipelines CI/CD, los equipos pueden gestionar activos de prueba tan profesionalmente como el código de producción.