Foundry para principiantes: una inmersión profunda en las pruebas de contratos inteligentes

Analyzing_part2_13

El desarrollo en Web3 se ha convertido recientemente en una fuerte tendencia, captando la atención de muchos desarrolladores de Web2. Sin embargo, estos nuevos desarrolladores, especialmente aquellos que trabajan en empresas que buscan integrar contratos inteligentes en sus productos, pueden introducir inadvertidamente errores de lógica y seguridad.

Una de las principales razones de estos errores es la falta de pruebas exhaustivas o la dependencia de herramientas que no aprovechan completamente las capacidades de Solidity, como Hardhat. Aunque Hardhat es una herramienta útil, no siempre maximiza el potencial de Solidity para un desarrollo de contratos inteligentes eficiente y seguro.

En Vottun, hemos elegido Foundry para nuestras pruebas de contratos inteligentes. Si eres nuevo en el desarrollo de Web3, puede que no estés familiarizado con ella, pero Foundry es una herramienta crucial a considerar. Este artículo está dirigido a los desarrolladores más nuevos de Solidity, por lo que no profundizaré demasiado en las tecnicidades de Foundry. En pocas palabras, Foundry es una herramienta que te permite escribir pruebas usando el propio Solidity, lo cual es una gran ventaja porque puedes usar el mismo lenguaje tanto para el desarrollo como para las pruebas. También ofrece potentes características para simular diversos entornos, escenarios y condiciones, haciendo tus contratos inteligentes más robustos.

Primero, veamos cómo empezar a crear pruebas en Solidity usando Foundry. Necesitarás una función en tu archivo de contrato que se vea así:

El punto clave aquí es que el nombre de la función debe ser setUp. El compilador de Foundry reconoce esta función especial y ejecutará todo lo que haya dentro de ella antes de cada caso de prueba individual.

Definir pruebas es entonces bastante sencillo:

Deberás definir los nombres de tus funciones de prueba de esta manera: test_WhateverYouWant(). Foundry recomienda algunas mejores prácticas para la nomenclatura, que puedes encontrar aquí. La convención de nombres es importante porque, a medida que escribas más pruebas, necesitarás entender rápidamente qué hace cada prueba y si una falla indica un error o un comportamiento esperado.

One of the most frequently used functionalities is vm.startPrank(owner); and vm.stopPrank();.

First, you’ll create an address using vm.addr(«ADMIN»); to use with vm.startPrank(createdAddress). Place all the function calls and logic you want to test within your smart contract between startPrank and stopPrank. This way, all the calls will be made as if they were from the created account. Without startPrank and stopPrank, calls are made using a default account that Foundry automatically provides.

If you only want to test one specific function, you can use vm.prank(createdAddress); directly before the function call you’re testing.

Another function you’ll likely use frequently is vm.warp(targetTime). This function allows you to manipulate the blockchain’s timestamp, fast-forwarding time to test features in your smart contracts that depend on time passing, such as staking lock-up periods.

You can get the current timestamp in seconds using uint256 currentTime = block.timestamp;

Note that we use block.timestamp directly, as it returns the timestamp in seconds. The vm.unixTime() function, while available, returns the time in milliseconds.

So if you want to do comparisons between dates, you will have to keep this in mind: the underscore in a number like ‘1_000’ is just a way to define numbers in Solidity for visual clarity. The underscore itself doesn’t change the value of the number.

Finally, once you’ve written your tests, simply execute forge test -vv. The -vv parameter enables verbose output, which is useful if you have console.log statements in your tests and want to see their results. For more information on Foundry commands, refer to the Foundry Book.

These are some of the most basic functionalities of Foundry. It might seem straightforward, but as you start writing tests, you’ll discover many more features that can help you thoroughly test your contracts and explore various scenarios.