El proyecto de Stress Testing tiene como objetivo evaluar el rendimiento y la estabilidad de la API de estadísticas de juegos.
-
Requisitos Previos:
- Microsoft Visual Studio 2022 o una versión compatible.
- Paquetes NuGet instalados: Xunit, FluentAssertions, Moq.
-
Configuración del Entorno:
- Clonar el repositorio del proyecto.
- Abrir la solución en Visual Studio.
- Instalar los paquetes mencionados anteriormente.
-
Ejecución de las Pruebas:
La clase GameStatisticsSmokeTest
es un conjunto de pruebas (fixture) que contiene un conjunto de métodos de prueba para evaluar la funcionalidad de una API de estadísticas de juegos. Utiliza el marco de pruebas xUnit y la biblioteca FluentAssertions para las afirmaciones. La clase incluye métodos para verificar la disponibilidad de la API, recuperar datos del juego, publicar nuevos datos del juego, actualizar datos del juego y eliminar datos del juego.
// Configurar la prueba
var smokeTest = new GameStatisticsSmokeTest();
smokeTest.Setup();
// Verificar la disponibilidad de la API
await smokeTest.CheckApiAvailability();
// Obtener datos del juego y afirmar que devuelve OK
await smokeTest.GetGameData_ShouldReturnOkUnderMinimalLoadAsync();
// Obtener datos del juego por ID y afirmar que devuelve OK
await smokeTest.GetValidGameDataByID_ShouldReturnOkUnderMinimalLoadAsync();
// Publicar nuevos datos del juego y afirmar que devuelve Creado
await smokeTest.PostValidGameData_ShouldReturnCreatedUnderMinimalLoadAsync();
// Actualizar datos del juego y afirmar que devuelve NoContent
await smokeTest.PutValidGameData_ShouldReturnNoContentUnderMinimalLoadAsync();
// Eliminar datos del juego por ID y afirmar que devuelve NoEncontrado (NotFound)
await smokeTest.DeleteUnvalidGameDataByID_ShouldReturnNotFoundUnderMinimalLoadAsync();
// Desmontar la prueba
smokeTest.TearDown();
- Verificar la disponibilidad de la API
- Recuperar datos del juego y afirmar que devuelve OK
- Recuperar datos del juego por ID y afirmar que devuelve OK
- Publicar nuevos datos del juego y afirmar que devuelve Creado
- Actualizar datos del juego y afirmar que devuelve NoContent
- Eliminar datos del juego por ID y afirmar que devuelve NoEncontrado (NotFound)
- NOTA: En caso que algún test salte una excepción de Object.Reference ejecuta el test en modo prueba/depuración, esta excepción suponemos es por los threadings
Setup()
: Inicializa el cliente HTTP con la URL base de la API y el número de veces que se llamará a la API durante las pruebas.CheckApiAvailability()
: Envía una solicitud GET al endpoint/gamedata
de la API y verifica que el código de estado de la respuesta sea OK.TearDown()
: Libera los recursos del cliente HTTP.GetGameData_ShouldReturnOkUnderMinimalLoadAsync()
: Envía múltiples solicitudes GET al endpoint/gamedata
en paralelo y verifica que el código de estado de cada respuesta sea OK y el contenido de la respuesta sea JSON válido.GetValidGameDataByID_ShouldReturnOkUnderMinimalLoadAsync()
: Envía múltiples solicitudes GET al endpoint/gamedata/{ID}
con IDs válidos en paralelo y verifica que el código de estado de cada respuesta sea OK y el contenido de la respuesta sea JSON válido.PostValidGameData_ShouldReturnCreatedUnderMinimalLoadAsync()
: Envía múltiples solicitudes POST al endpoint/gamedata
con datos de juego válidos en paralelo y verifica que el código de estado de cada respuesta sea Creado y el contenido de la respuesta sea JSON válido.PutValidGameData_ShouldReturnNoContentUnderMinimalLoadAsync()
: Envía múltiples solicitudes PUT al endpoint/gamedata/{ID}
con datos de juego válidos en paralelo y verifica que el código de estado de cada respuesta sea NoContent.DeleteUnvalidGameDataByID_ShouldReturnNotFoundUnderMinimalLoadAsync()
: Envía múltiples solicitudes DELETE al endpoint/gamedata/{ID}
con IDs no válidos en paralelo y verifica que el código de estado de cada respuesta sea NotFound.
_client
: Una instancia de la claseHttpClient
utilizada para enviar solicitudes HTTP a la API._times
: El número de veces que se llamará a la API durante las pruebas.
La clase Program
es una aplicación de consola en C# que permite al usuario seleccionar y llamar a diferentes puntos finales de una API de datos de juegos. Ofrece opciones para realizar pruebas de carga manuales y automáticas en los puntos finales de la API.
// Selecciona un punto final para llamar
// Presiona las flechas arriba o abajo para navegar por las opciones
// Presiona Enter para seleccionar una opción
// Selecciona un tipo de prueba (manual o automática)
// Presiona las flechas arriba o abajo para navegar por las opciones
// Presiona Enter para seleccionar un tipo de prueba
// Para pruebas manuales de carga:
// Presiona las flechas arriba o abajo para aumentar o disminuir el número de solicitudes por segundo
// Presiona Enter para enviar las solicitudes
// Para pruebas automáticas de carga:
// Presiona las flechas arriba o abajo para aumentar o disminuir el número de solicitudes por segundo
// Las solicitudes se enviarán automáticamente sin presionar Enter
// Presiona Esc para salir de la aplicación
- Permite al usuario seleccionar y llamar a diferentes puntos finales de una API de datos de juegos
- Ofrece opciones para pruebas de carga manuales y automáticas en los puntos finales de la API
SelectEndpointCall()
: Permite al usuario seleccionar un punto final para llamarSelectTestType()
: Permite al usuario seleccionar un tipo de prueba (manual o automática)RunLoadTest()
: Ejecuta una prueba de carga manual enviando solicitudes al punto final seleccionadoRunAutomaticLoadTest()
: Ejecuta una prueba de carga automática enviando continuamente solicitudes al punto final seleccionadoCallSelectedEndpoint()
: Llama al punto final seleccionado según la elección del usuarioUpdateConsole()
: Actualiza la consola con el número actual de solicitudes y el tiempo de respuestaRunLoadTestIteration()
: Ejecuta una única iteración de la prueba de carga enviando múltiples solicitudes a la APIMakeRequest()
: Envía una única solicitud a la APICallGetApiEndpoint()
: Llama al punto final GET de la APICallGetByIdApiEndpoint()
: Llama al punto final GET por ID de la APICallPostApiEndpoint()
: Llama al punto final POST de la APICallPutApiEndpoint()
: Llama al punto final PUT de la APICallDeleteApiEndpoint()
: Llama al punto final DELETE de la APIHandleError()
: Maneja cualquier error que ocurra durante las llamadas a la APIEvaluateResponseTime()
: Evalúa el tiempo de respuesta y determina su calidad
nRequest
: El número de solicitudes que se enviarán por segundoiRequest
: El valor de incremento o decremento para el número de solicitudeselapsedSeconds
: El tiempo transcurrido en segundos para cada solicitudstartTimes
: Una lista de tiempos de inicio para cada solicitudapiUrl
: La URL de la API de datos de juegosid
: El ID a utilizar en las llamadas a la APIselectedEndpointCall
: El índice del punto final seleccionado
La clase SpikeTest
es un conjunto de pruebas diseñado para evaluar el comportamiento de un punto final de API relacionado con datos de juegos. Contiene varios métodos de prueba que envían solicitudes HTTP al punto final de la API y verifican las respuestas esperadas.
// Crea una instancia de la clase `SpikeTest`
var spikeTest = new SpikeTest();
// Configura el cliente HTTP con la URL base de la API
spikeTest.Setup();
// Verifica la disponibilidad de la API enviando una solicitud GET al punto final /gamedata
spikeTest.CheckApiAvailability();
// Envía múltiples solicitudes GET en paralelo al punto final /gamedata y verifica las respuestas
spikeTest.GetValidGameData_ShouldReturnOkUnderPikeLoadAsync();
// Envía múltiples solicitudes GET en paralelo al punto final /gamedata/{ID} y verifica las respuestas
spikeTest.GetValidGameDataByID_ShouldReturnOkUnderPikeLoadAsync();
// Envía múltiples solicitudes PUT en paralelo al punto final /gamedata/{ID} y verifica las respuestas
spikeTest.PutValidGameData_ShouldReturnNoContentUnderPikeLoadAsync();
// Envía múltiples solicitudes DELETE en paralelo al punto final /gamedata/{ID} y verifica las respuestas
spikeTest.DeleteUnvalidGameDataByID_ShouldReturnNotFoundUnderPikeLoadAsync();
// Envía múltiples solicitudes POST en paralelo al punto final /gamedata y verifica las respuestas
spikeTest.PostValidGameData_ShouldReturnCreatedUnderPikeLoadAsync();
// Limpia los recursos utilizados por el cliente HTTP
spikeTest.TearDown();
- Configurar el cliente HTTP con la URL base de la API.
- Verificar la disponibilidad de la API enviando una solicitud GET al punto final /gamedata.
- Enviar múltiples solicitudes HTTP en paralelo a los puntos finales de la API y verificar las respuestas esperadas.
- Limpiar los recursos utilizados por el cliente HTTP.
- NOTA: En caso que algún test salte una excepción de Object.Reference ejecuta el test en modo prueba/depuración, esta excepción suponemos es por los threadings
Setup()
: Configura el cliente HTTP con la URL base de la API.CheckApiAvailability()
: Verifica la disponibilidad de la API enviando una solicitud GET al punto final /gamedata y verifica que el código de estado de la respuesta sea OK.TearDown()
: Limpia los recursos utilizados por el cliente HTTP.GetValidGameData_ShouldReturnOkUnderPikeLoadAsync()
: Envía múltiples solicitudes GET en paralelo al punto final /gamedata y verifica que el código de estado de la respuesta sea OK para cada solicitud.GetValidGameDataByID_ShouldReturnOkUnderPikeLoadAsync()
: Envía múltiples solicitudes GET en paralelo al punto final /gamedata/{ID} y verifica que el código de estado de la respuesta sea OK para cada solicitud.PutValidGameData_ShouldReturnNoContentUnderPikeLoadAsync()
: Envía múltiples solicitudes PUT en paralelo al punto final /gamedata/{ID} y verifica que el código de estado de la respuesta sea NoContent para cada solicitud.DeleteUnvalidGameDataByID_ShouldReturnNotFoundUnderPikeLoadAsync()
: Envía múltiples solicitudes DELETE en paralelo al punto final /gamedata/{ID} y verifica que el código de estado de la respuesta sea NotFound para cada solicitud.PostValidGameData_ShouldReturnCreatedUnderPikeLoadAsync()
: Envía múltiples solicitudes POST en paralelo al punto final /gamedata y verifica que el código de estado de la respuesta sea Created para cada solicitud.
_client
: Una instancia de la claseHttpClient
utilizada para enviar solicitudes HTTP a la API.
Para instalar y ejecutar este proyecto, debes seguir los siguientes pasos:
- Clona o descarga el repositorio de GitHub en tu computadora. Puedes usar el botón verde "Code" que aparece en la parte superior derecha de la página del repositorio, o puedes usar el siguiente comando en una terminal:
git clone https://github.com/AlexRmCreative/CirsaHackathon.git
- Instalar los siguientes paquetes en cada solución en su administrador de paquetes NuGGet:
- Average Load
Install-Package System.Net.Http
Install-Package Newtonsoft.Json
- Smoke Test
coverlet.collector
FluentAssertions.Json
FluentAssertions
NUnit
- Spike Test
FluentAssertions.Json
NUnit
- Seguir el paso a paso de uso de cada solución que se encuentra en la parte superior, explicando cada test y programa en detalle
Si tienes alguna pregunta o feedback sobre el proyecto, por favor contactanos. Estaremos agradecidos 😊