Fase 5: Implementación de Pruebas e Integración Continua
Objetivo
Agregar pruebas unitarias y de integración para asegurar la funcionalidad del sistema. Configurar un flujo de integración continua (CI) usando GitHub Actions para garantizar que los cambios en el código no rompan la aplicación.
Conceptos Clave
- Pruebas Unitarias: Validan funcionalidades específicas de componentes individuales del sistema.
- Pruebas de Integración: Aseguran que los componentes interactúen correctamente entre sí.
- Integración Continua (CI): Automatiza la ejecución de pruebas en cada cambio del código mediante herramientas como GitHub Actions.
Instrucciones
1. Configurar un entorno de pruebas
Asegúrate de que tienes las siguientes dependencias instaladas:
pip install pytest pytest-mock
Crea un archivo requirements.txt para incluir las dependencias de desarrollo:
pytest
pytest-mock
Agrega este archivo al control de versiones:
git add requirements-dev.txt
git commit -m "Añadido archivo requirements-dev.txt para dependencias de desarrollo"
2. Escribir pruebas unitarias para el servidor
Crea un directorio tests/ y un archivo tests/test_server.py para las pruebas del servidor:
"""
Pruebas unitarias para server.py
"""
import socket
import threading
import pytest
from src.server import ChatServer
@pytest.fixture
def server():
"""
Configura una instancia del servidor para pruebas.
"""
= ChatServer("127.0.0.1", 12345)
chat_server =chat_server.start, daemon=True).start()
threading.Thread(targetreturn chat_server
def test_server_initialization(server):
"""
Prueba que el servidor se inicializa correctamente.
"""
assert server.host == "127.0.0.1"
assert server.port == 12345
assert server.clients == []
def test_client_connection(server):
"""
Prueba que un cliente puede conectarse al servidor.
"""
= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket connect((server.host, server.port))
client_socket.assert client_socket
client_socket.close()
3. Escribir pruebas para el cliente
Crea el archivo tests/test_client.py:
"""
Pruebas unitarias para client.py
"""
import pytest
from src.client import ChatClientGUI
@pytest.fixture
def client():
"""
Configura un cliente de chat para pruebas.
"""
return ChatClientGUI("127.0.0.1", 12345)
def test_client_initialization(client):
"""
Prueba que el cliente se inicializa correctamente.
"""
assert client.host == "127.0.0.1"
assert client.port == 12345
assert client.nickname == ""
4. Ejecutar las pruebas
Ejecuta las pruebas localmente para verificar que todo funcione correctamente:
pytest tests/
Si todo está correcto, verás un resultado como este:
========================= test session starts =========================
collected 3 items
tests/test_client.py .. [ 66%]
tests/test_server.py .. [100%]
========================== 3 passed in 0.10s =========================
5. Configurar integración continua con GitHub Actions
Crea el archivo .github/workflows/ci.yml con la siguiente configuración:
name: CI Pipeline
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: "3.12"
- name: Install dependencies
run: |
python -m venv venv
. venv/bin/activate
pip install -r requirements.txt
pip install -r requirements-dev.txt
- name: Run tests
run: |
. venv/bin/activate pytest tests/
Sube los cambios al repositorio:
git add .github/workflows/ci.yml
git commit -m "Añadido pipeline de CI con GitHub Actions"
git push origin main
Verifica en GitHub que las pruebas se ejecuten automáticamente al hacer un push o pull request.
Pruebas y Validación
- Realiza cambios controlados en el código y verifica que GitHub Actions detecta errores.
- Asegúrate de que las pruebas pasen tanto localmente como en el flujo de CI.
Conclusiones
La incorporación de pruebas unitarias e integración continua asegura la calidad del software y evita errores al integrar cambios. Este flujo refleja prácticas profesionales utilizadas en la industria.