10. Pruebas Unitarias - SistemasTecTlaxiaco/Academy GitHub Wiki

Objetivo de la practica

Implementar y ejecutar pruebas unitarias en un contrato inteligente desarrollado en Soroban, con el fin de validar que sus funciones principales trabajen correctamente y devuelvan los resultados esperados.

Materiales

• Computadora con sistema operativo compatible

• Soroban CLI instalado

• Lenguaje Rust y gestor de paquetes Cargo

• Editor de código (como Visual Studio Code)

• Terminal o consola de comandos

• Proyecto de contrato inteligente en Soroban

¿Qué es una prueba unitaria?

Una prueba unitaria es un tipo de verificación automatizada que se utiliza para comprobar que una función o componente individual de un programa en este caso, un contrato inteligente escrito en Rust para la red Stellar mediante el framework Soroban se comporta correctamente y produce los resultados esperados de forma aislada.

Aplicación

En el contexto específico del contrato en Soroban, una prueba unitaria: • Simula un entorno de ejecución blockchain local usando Env::default(), lo que permite probar el contrato sin desplegarlo en la red real.

• Ejecuta funciones individuales del contrato como insert_estudiante, buscar_materia, eliminar_documento, etc.

• Evalúa el comportamiento usando sentencias como assert_eq!() y assert!() para comparar los resultados reales con los resultados esperados.

• Está contenida dentro de una función marcada con el atributo #[test], que indica a Rust que se trata de una prueba unitaria.

• Se encuentra encapsulada dentro del bloque #![cfg(test)], lo que garantiza que solo se compile y ejecute durante los procesos de prueba.

Metodología

  1. Primeramente, en el archivo test.rs modificaremos a consideración de nuestro contrato así que crearemos pruebas individuales para comprobar su funcionamiento.

image

  1. Esta parte del código es una prueba automatizada para un contrato inteligente desarrollado con el SDK de Soroban, el cual se ejecuta sobre la red Stellar. Comienza con una directiva que indica que el bloque solo se compilará al ejecutar pruebas, lo que permite mantener el código de testing separado del de producción. Se importan elementos necesarios como el entorno de ejecución (Env), una versión especial de cadenas (String) y una macro para símbolos cortos (symbol_short). A continuación, se define una función de prueba llamada test_estudiante_operations, donde se inicializa un entorno simulado con Env::default(), luego se registra una instancia del contrato para obtener un identificador que permita operar con él dentro de ese entorno. Finalmente, se crea un cliente del contrato, el cual servirá para invocar sus funciones durante la prueba. Este fragmento representa la estructura base sobre la cual se construirán las pruebas específicas de funcionalidad del contrato, como agregar o consultar datos, aunque estas aún no están implementadas en el fragmento mostrado

image

  1. Aquí, se utiliza el cliente del contrato (client) para insertar un estudiante con ID "1", nombre "Carlos" y correo "[email protected]", empleando String::from_str(&env,) para crear cadenas compatibles con el entorno simulado de Soroban. Luego, se recupera al estudiante mediante el método get_estudiante usando el mismo ID. Para validar que la inserción fue exitosa, (assert para verificar que el resultado no sea None), y luego se extraen los datos del estudiante con unwrap(). Finalmente, se comprueba que tanto el nombre como el correo electrónico coincidan exactamente con los valores insertados, usando assert_eq junto con symbol_short para acceder a los campos del mapa de datos retornado. Este código asegura que la operación de inserción en el contrato se realizó correctamente y que los datos se almacenaron con fidelidad.

image

  1. Este bloque de código realiza una prueba automatizada para verificar que la función de edición de un estudiante en un contrato inteligente de Soroban funcione correctamente. Utilizando el cliente del contrato (client), se llama al método edit_estudiante para modificar los datos del estudiante con ID "1", actualizando su nombre a "Carlos Gómez" y su correo electrónico a "[email protected]". Los valores se construyen como cadenas compatibles con el entorno Soroban mediante String::from_str(&env, ...). Luego, se consulta nuevamente al estudiante usando get_estudiante, y se valida que la información haya sido efectivamente actualizada. Primero se asegura que el estudiante existe (is_some()), y luego, mediante assert_eq!, se comprueba que el nombre y el correo electrónico coinciden con los nuevos valores usando claves cortas (symbol_short!) para acceder a los datos.

image

  1. Este fragmento de código completa una serie de pruebas funcionales sobre un contrato inteligente en Soroban, enfocándose en la búsqueda y eliminación de un estudiante. Primero, se llama al método buscar_estudiantes pasando como parámetro el nombre "Carlos Gómez", y se verifica que la búsqueda haya retornado algún resultado usando assert!(search_result.is_some()). Luego, se invoca el método delete_estudiante para eliminar al estudiante con ID "1" del contrato. Finalmente, se realiza una llamada a get_estudiante con el mismo ID para confirmar que el registro fue eliminado correctamente, validando que el resultado sea None mediante assert!(deleted_estudiante.is_none()). Este bloque garantiza que el contrato no solo permite insertar y editar estudiantes.

image

  1. Este fragmento de código define una prueba automatizada para verificar las operaciones de carga y adquisición de un documento en un contrato inteligente utilizando el entorno de Soroban. En la función test_cargar_y_adquirir_documento, primero se crea un entorno simulado (Env::default()), y luego se preparan tres cadenas: un identificador del documento ("doc1"), un título ("Título de prueba") y un contenido ("Contenido de prueba"), todas formateadas como String compatibles con el entorno de Soroban. A continuación, se invoca la función cargar_documento pasando el entorno y los datos preparados, lo que simula guardar el documento en el contrato. Posteriormente, se llama a adquirir_documento con el mismo identificador para obtener el documento guardado; se utiliza unwrap() para asegurar que el documento exista. Finalmente, se validan los campos del documento retornado comprobando que tanto el título como el contenido coincidan exactamente con los valores que se cargaron inicialmente, usando claves cortas (symbol_short!) y la macro assert_eq!.

image

  1. Y como se mostraba en el procedimiento de usuario o estudiante se realiza una inserción de datos de prueba para poder compilar las pruebas.

image

  1. En la siguiente imagen se muestra la búsqueda del documento, es decir que buscara el documento subido recientemente.

image

  1. Y de la misma manera se registrará, editara y eliminará una materia

image

image

image

  1. Para el caso de docente se utilizó la misma lógica de programación para poder realizar su inserción, edición y eliminación.

  2. Para el caso de cursos no se utilizo como tal la prueba ya que requiere operaciones complejas que aun no se pueden desarrollar completamente por lo que solamente nos limitamos a realizar la transacción de un curso mediante la wallet.

image

12.Por lo que nomas se mostraran los elementos y funciones de un curso.

image

13.Esta imagen muestra la operación de eliminar de dicho curso.

image

image

image

14.Para certificados se utilizó la misma lógica que un curso para poder imprimir el documento.

image

image

  1. Y por último cuando ejecutemos el archivo test con “Cargo test” nos deberá de mostrar el siguiente mensaje que corresponde a la prueba realizada con éxito.

image