Proyecto de pruebas automatizadas para bases de datos MySQL usando pytest.
Este proyecto incluye tests para dos bases de datos:
| Base de Datos | Descripción | Tests |
|---|---|---|
test_database |
Base de datos de prueba con tablas users, products, orders | 65 tests |
sakila |
Base de datos de ejemplo de MySQL (tienda de DVD) | 91 tests |
Total: 156 tests
sql_testing_project/
├── config/
│ ├── __init__.py
│ └── db_config.py # Configuración para test_database y sakila
├── data/
│ ├── __init__.py
│ ├── test_data.py # Datos para test_database
│ └── sakila_test_data.py # Datos para sakila
├── database/
│ ├── __init__.py
│ └── db_connector.py # Conector MySQL
├── tests/
│ ├── __init__.py
│ ├── conftest.py # Fixtures de pytest
│ ├── test_crud_operations.py # Tests CRUD (test_database)
│ ├── test_data_integrity.py # Tests integridad (test_database)
│ ├── test_performance.py # Tests rendimiento (test_database)
│ ├── test_sakila_schema.py # Tests schema (sakila)
│ ├── test_sakila_data.py # Tests datos (sakila)
│ ├── test_sakila_queries.py # Tests queries (sakila)
│ └── test_sakila_performance.py # Tests rendimiento (sakila)
├── reports/
├── .env
├── .env.example
├── .gitignore
├── pytest.ini
├── requirements.txt
└── README.md
- Python 3.10+
- MySQL Server 8.0+
- PyCharm IDE (recomendado)
- Base de datos Sakila instalada (con datos)
git clone <repo-url>
cd sql_testing_projectPyCharm lo crea automáticamente al abrir el proyecto.
pip install -r requirements.txtConectar a MySQL y ejecutar:
CREATE DATABASE IF NOT EXISTS test_database;Sakila debe estar instalada con datos. Verificar:
USE sakila;
SELECT COUNT(*) FROM actor; -- Debe mostrar 200Si no está instalada o no tiene datos, descargar de: https://dev.mysql.com/doc/index-other.html
# Importar schema y datos
mysql -u root -p < sakila-schema.sql
mysql -u root -p < sakila-data.sqlEditar .env:
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=tu_password
DB_NAME=test_databasepytestpytest tests/test_crud_operations.py tests/test_data_integrity.py tests/test_performance.pypytest -m sakilapytest -m crud # Operaciones CRUD
pytest -m integrity # Integridad de datos
pytest -m performance # Rendimiento
pytest -m schema # Validación de schema
pytest -m data # Validación de datos
pytest -m queries # Validación de queriespytest --html=reports/report.html --self-contained-htmlValida operaciones CRUD básicas:
| Clase | Tests | Descripción |
|---|---|---|
| TestCreateOperations | 7 | INSERT simple, múltiple, duplicados |
| TestReadOperations | 8 | SELECT, filtros, ORDER BY, LIMIT, COUNT |
| TestUpdateOperations | 5 | UPDATE simple, múltiple, condicional |
| TestDeleteOperations | 5 | DELETE, CASCADE, TRUNCATE |
Valida integridad y constraints:
| Clase | Tests | Descripción |
|---|---|---|
| TestSchemaIntegrity | 6 | Existencia de tablas y columnas |
| TestConstraints | 8 | UNIQUE, NOT NULL, FOREIGN KEY, ENUM |
| TestDataTypes | 5 | DECIMAL, INT, BOOLEAN, VARCHAR, TIMESTAMP |
| TestReferentialIntegrity | 4 | JOINs, CASCADE DELETE |
| TestDataConsistency | 3 | Defaults, timestamps automáticos |
Mide tiempos de ejecución:
| Clase | Tests | Descripción |
|---|---|---|
| TestQueryPerformance | 5 | SELECT, filtros, JOINs |
| TestBulkOperationPerformance | 4 | INSERT masivo, UPDATE, DELETE |
| TestStressTests | 3 | Operaciones repetidas, mixtas |
| TestConnectionPerformance | 2 | Conexión, context manager |
| Columna | Tipo | Descripción |
|---|---|---|
| id | INT | Primary key, auto increment |
| username | VARCHAR(50) | Único, no nulo |
| VARCHAR(100) | Único, no nulo | |
| password_hash | VARCHAR(255) | No nulo |
| first_name | VARCHAR(50) | Nombre |
| last_name | VARCHAR(50) | Apellido |
| age | INT | Edad |
| is_active | BOOLEAN | Default TRUE |
| created_at | TIMESTAMP | Auto generado |
| updated_at | TIMESTAMP | Auto actualizado |
| Columna | Tipo | Descripción |
|---|---|---|
| id | INT | Primary key, auto increment |
| name | VARCHAR(100) | No nulo |
| description | TEXT | Descripción |
| price | DECIMAL(10,2) | No nulo |
| stock | INT | Default 0 |
| category | VARCHAR(50) | Categoría |
| is_available | BOOLEAN | Default TRUE |
| created_at | TIMESTAMP | Auto generado |
| Columna | Tipo | Descripción |
|---|---|---|
| id | INT | Primary key, auto increment |
| user_id | INT | FK → users(id), CASCADE |
| product_id | INT | FK → products(id), CASCADE |
| quantity | INT | No nulo |
| total_price | DECIMAL(10,2) | No nulo |
| status | ENUM | pending, processing, shipped, delivered, cancelled |
| order_date | TIMESTAMP | Auto generado |
users ──────< orders >────── products
│ │
│ [user_id]
│ [product_id]
│ │
└──────────────┘
CASCADE DELETE
Valida la estructura de la base de datos:
- Existencia de las 16 tablas
- Existencia de las 7 vistas
- Columnas de cada tabla
- Primary keys y foreign keys
- Constraints (ENUM, NOT NULL)
Valida los datos existentes:
- Conteo de registros por tabla
- Valores válidos (categorías, ratings, idiomas)
- Integridad referencial
- Datos no nulos donde se requiere
Valida queries complejas:
- SELECTs básicos y filtrados
- JOINs de múltiples tablas
- Agregaciones (COUNT, SUM, AVG)
- Subqueries
Mide tiempos de ejecución:
- SELECT en tablas grandes
- JOINs complejos
- Agregaciones
- Vistas
| Tabla | Registros | Descripción |
|---|---|---|
| actor | 200 | Actores de películas |
| film | 1000 | Catálogo de películas |
| customer | 599 | Clientes de la tienda |
| rental | 16044 | Historial de alquileres |
| payment | 16049 | Pagos realizados |
| inventory | 4581 | Inventario por tienda |
| category | 16 | Categorías de películas |
| language | 6 | Idiomas disponibles |
| store | 2 | Tiendas |
| staff | 2 | Empleados |
customer_list- Lista de clientes con direcciónfilm_list- Películas con categoría y actoressales_by_film_category- Ventas por categoríasales_by_store- Ventas por tiendastaff_list- Lista de empleadosactor_info- Actores con sus películasnicer_but_slower_film_list- Lista detallada de películas
customer ──< rental >── inventory ──< film
│ │ │
│ │ ├──< film_actor >── actor
│ │ │
│ │ └──< film_category >── category
│ │
└───< payment
from database.db_connector import DatabaseConnector
# Usando context manager (recomendado)
with DatabaseConnector() as db:
# Insert
user_id = db.insert('users', {'username': 'test', 'email': 'test@test.com', 'password_hash': 'hash'})
# Select
users = db.select('users', condition='is_active = %s', condition_params=(True,))
# Update
db.update('users', {'email': 'new@email.com'}, 'id = %s', (user_id,))
# Delete
db.delete('users', 'id = %s', (user_id,))
# Custom query
result = db.execute_query("SELECT COUNT(*) as count FROM users")from data.test_data import TestDataGenerator
# Generar un usuario aleatorio
user = TestDataGenerator.generate_user()
# Generar múltiples usuarios
users = TestDataGenerator.generate_users(10)
# Generar datos para insert_many
columns, data = TestDataGenerator.generate_bulk_users_tuple(100)
db.insert_many('users', columns, data)CREATE DATABASE test_database;# Descargar sakila
wget https://downloads.mysql.com/docs/sakila-db.zip
unzip sakila-db.zip
cd sakila-db
# Importar
mysql -u root -p < sakila-schema.sql
mysql -u root -p < sakila-data.sqlSolo importaste el schema. Necesitas importar los datos:
mysql -u root -p sakila < sakila-data.sqlVerificar credenciales en .env
Cambiar column_name por COLUMN_NAME en los tests de schema.
Usar la ruta completa:
/usr/local/mysql/bin/mysql -u root -pLa documentación completa de casos de prueba y análisis de testing está disponible en Google Sheets:
📊 SQL Testing Project - Documentación QA
📄 SQL Testing Project - Plan de Pruebas
| Hoja | Descripción |
|---|---|
| Resumen | Información general del proyecto |
| Test Cases - test_database | 65 casos de prueba detallados |
| Test Cases - Sakila | 70 casos de prueba detallados |
| Clases de Equivalencia | Análisis de clases de equivalencia y valores límite |
| Checklist | Lista de verificación con 60 items |
| Matriz de Trazabilidad | Mapeo de requisitos a casos de prueba |
Los archivos CSV originales están en la carpeta docs/:
docs/
├── 00_summary.csv # Resumen del proyecto
├── test_cases_test_database.csv # Casos de prueba test_database
├── test_cases_sakila.csv # Casos de prueba Sakila
├── equivalence_classes_boundary_values.csv # Clases de equivalencia
├── verification_checklist.csv # Checklist de verificación
└── traceability_matrix.csv # Matriz de trazabilidad
MIT License