Plan de pruebas
Pruebas de backend
Pruebas de Integración
En este tipo de pruebas se comprueban procesos completos para verificar la existencia de errores.
El sistema de testing empleado en el código se basa en pruebas automatizadas utilizando pytest
y pytest_asyncio
para garantizar la calidad y el correcto funcionamiento del software.
Se han realizado pruebas de integración para cada uno de los diferentes endpoints de la API desarrollada con FastApi utilizando MongoDb como sistema de base de datos. Estas pruebas han sido diseñadas para realizarse simultáneamente con las diferentes features a implementar, lo que asegura el correcto funcionamiento de los endpoints previamente al mergeo de los mismos.
Se han establecido estándares para la realización de todos los test de la aplicación, generando test con nombres fáciles de entender para facilitar el entendimiento de los mismos.
Ejemplo de inserción de objetos en la base de datos y testeo de endpoints:
# Fixture para insertar intervenciones en la base de datos
@pytest_asyncio.fixture
async def insert_interventions_mongo(mongo_db: Database):
# Código para insertar intervenciones en la base de datos
yield result
Ejemplo de testeo de endpoints:
# Test para obtener detalles de una intervención
def test_get_intervention_detail(
app_client: TestClient,
insert_interventions_mongo):
# Código de prueba para obtener detalles de una intervención
assert ... # Assertions
Pruebas de Carga
Las pruebas de carga simulan el comportamiento de varios usuarios que acceden al sistema simultáneamente, reproduciendo el rendimiento, la estabilidad y la funcionalidad del sistema web en condiciones reales.
Ejemplo de configuración de prueba de carga con Locust:
from locust import HttpUser, task, between
class WebsiteUser(HttpUser):
wait_time = between(5, 15)
@task
def index(self):
self.client.get("/")
El código proporcionado es un ejemplo de cómo configurar una prueba de carga utilizando Locust, una herramienta de pruebas de rendimiento de código abierto. Define una clase
WebsiteUser
que hereda deHttpUser
de Locust. La variablewait_time
se configura para simular un tiempo de espera aleatorio entre 5 y 15 segundos entre las tareas. La tareaindex
simula una solicitud GET a la página de inicio ("/"). Este tipo de pruebas son útiles para evaluar cómo un sistema maneja múltiples solicitudes simultáneas.
Estos son algunos ejemplos de test de cargas realizados sobre los endpoints mas "exigentes" del sistema siendo los que mas recursos consumen:
![Request stats](\img\testplan\pCargas.png)
![Resquest per second](\img\testplan\pCargasGraphs.png)
Esto indica que nuestra aplicación va a ser perfectamente capaz de mantener una usabilidad excelente para un número menor a 10 usuarios concurrentes.
Pruebas de frontend
El plan de pruebas para el desarrollo frontend se basa en Jest, una biblioteca de pruebas de JavaScript.
Se utilizan Jest y @testing-library/react para escribir y ejecutar pruebas de manera eficiente. Se emplea "mocking" para simular funciones externas, como las llamadas a API, lo que facilita el enfoque en la lógica interna del componente que se está probando.
Las pruebas unitarias ayudan a encontrar y solucionar errores de forma temprana, resultando en un código más sólido y mantenible.
Ejemplo de prueba unitaria con Jest:
import { render, waitFor, screen } from '@testing-library/react'
import { test, expect, describe, jest } from '@jest/globals'
import InterventionPage from '../../app/interventions/page'
import { fetchDataInterventions } from '../../app/interventions/fetchIntervention.js'
jest.mock('../../app/interventions/fetchIntervention.js')
jest.mock('next/navigation', () => ({
useRouter: () => ({
push: jest.fn()
}),
useSearchParams: () => ({
get: jest.fn()
}),
usePathname: () => ({
get: jest.fn()
})
}))
describe('InterventionList', () => {
test('Renderizar', async () => {
const datos = [
{
id: 1,
intervention_date: '2018-05-08T16:29:31.591Z',
patient: 'John Doe'
},
{
id: 2,
intervention_date: '2018-05-08T16:29:31.591Z',
patient: 'Jane Doe'
}
]
fetchDataInterventions.mockResolvedValue(datos)
const data = await fetchDataInterventions()
expect(data).toEqual(datos)
waitFor(async () => {
render(<InterventionPage />)
expect(screen.getByText('John Doe')).toBeInTheDocument()
expect(screen.getByText('Jane Doe')).toBeInTheDocument()
})
})
})