Test Unitarios

Las pruebas unitarias son una parte crucial del desarrollo de software, ya que ayudan a garantizar la correcta funcionalidad del código y permiten detectar cualquier error o problema en una fase temprana del proceso de desarrollo.

En esta sección, exploraremos el proceso de ejecución de pruebas unitarias dentro de un contrato inteligente CosmWasm.

Escribir pruebas unitarias

Para escribir pruebas unitarias en Rust para contratos inteligentes CosmWasm, es necesario utilizar el atributo #test para marcar las funciones de prueba. Estas funciones deben colocarse en un módulo de pruebas dentro del código fuente de tu contrato inteligente, normalmente utilizando un atributo #cfg(test) para compilarlas sólo durante las pruebas. Puedes usar macros como assert!, assert_eq!, y assert_ne! para validar el comportamiento de tu código contra los resultados esperados.

Correr test unitarios

Ejecute el siguiente comando para realizar las pruebas unitarias disponibles:

RUST_BACKTRACE=1 cargo unit-test

Después de algunos pasos de compilación, debería observar:

running 15 tests
test coin_helpers::test::assert_sent_sufficient_coin_works ... ok
test tests::test_module::fails_on_register_insufficient_fees ... ok
test tests::test_module::fails_on_register_wrong_fee_denom ... ok
test tests::test_module::proper_init_no_fees ... ok
test tests::test_module::fails_on_register_already_taken_name ... ok
test tests::test_module::fails_on_transfer_insufficient_fees ... ok
test tests::test_module::proper_init_with_fees ... ok
test tests::test_module::register_available_name_and_query_works ... ok
test tests::test_module::fails_on_transfer_non_existent ... ok
test tests::test_module::fails_on_transfer_from_nonowner ... ok
test tests::test_module::register_available_name_fails_with_invalid_name ... ok
test tests::test_module::register_available_name_and_query_works_with_fees ... ok
test tests::test_module::returns_empty_on_query_unregistered_name ... ok
test tests::test_module::transfer_works ... ok
test tests::test_module::transfer_works_with_fees ... ok

test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

El uso de RUST_BACKTRACE=1 le proporcionará trazas de pila completas para cualquier error, lo cual es extremadamente útil. Esto sólo funciona para las pruebas unitarias (que prueban el código nativo de Rust, no el wasm compilado). Además, si tienes curiosidad sobre el origen de cargo wasm y cargo unit-test, son simplemente alias definidos en el archivo .cargo/config localizado en el directorio del proyecto. Examinar el contenido del archivo te dará una mejor comprensión de las banderas de cargo.

Mocking

La simulación y la inyección de dependencias son técnicas que pueden ayudarte a aislar partes específicas de tu contrato inteligente para las pruebas. Con la simulación, creas objetos o funciones ficticios que sustituyen a las dependencias reales de tu contrato inteligente, lo que te permite controlar su comportamiento durante las pruebas. La inyección de dependencias implica pasar estas dependencias simuladas como argumentos a las funciones de tu contrato inteligente, lo que te permite simular diferentes condiciones y escenarios sin afectar al estado real del contrato o a las dependencias.

Mejores practicas

Algunas de las mejores prácticas para escribir pruebas unitarias son

  • Organice las pruebas colocándolas en módulos o archivos separados, agrupados por la funcionalidad que comprueban.

  • Siga las convenciones de nomenclatura, como utilizar un nombre descriptivo que indique lo que la prueba está comprobando, como test_transfer_funds_success o test_invalid_name_rejection.

  • Escribe pruebas claras y concisas que se centren en componentes individuales del contrato inteligente, evitando pruebas demasiado complejas o sin relación entre sí.

  • Prueba los casos límite y los posibles escenarios de fallo para asegurarte de que tu contrato inteligente puede hacer frente a diferentes situaciones. Mantén las pruebas independientes entre sí, para que el fallo de una no afecte a las demás.

Last updated