10. Testing de Contratos Inteligentes

html




Testing de Contratos Inteligentes en Solidity

10. Testing de Contratos Inteligentes

El testing de contratos inteligentes es una parte fundamental del ciclo de desarrollo. Dado que los contratos inteligentes una vez desplegados en la blockchain son inmutables, es crucial asegurar que el código esté libre de errores y se comporte según lo esperado. Vamos a explorar en detalle cómo implementar tests para contratos inteligentes en Solidity, utilizando herramientas como Hardhat y Mocha.

Configuración del Entorno de Pruebas

Para realizar pruebas en Solidity, necesitamos configurar un entorno de desarrollo. Utilizaremos Hardhat, una herramienta robusta para la compilación, despliegue, depuración y prueba de contratos inteligentes en Ethereum. Asegúrate de tener instalado Node.js y npm antes de comenzar.

Instalación de Hardhat

Primero, instalemos Hardhat. Ejecuta los siguientes comandos en tu terminal:

npm init -y
npm install --save-dev hardhat
npx hardhat
    

Selecciona Create a basic sample project en el asistente de configuración de Hardhat.

Escritura de Pruebas en JavaScript

Hardhat utiliza Mocha y Chai para escribir y ejecutar pruebas. Mocha es un framework de pruebas, y Chai es una biblioteca de aserciones que facilita la validación de los resultados de las pruebas.

Plantilla de Contrato Inteligente para Pruebas

A continuación, un ejemplo de un contrato simple de Solidity que implementa un contador:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0

contract Counter {
    uint256 private count

    event CountIncremented(uint256 newCount)

    function increment() public {
        count  = 1
        emit CountIncremented(count)
    }

    function getCount() public view returns (uint256) {
        return count
    }
}
    

Escribiendo Pruebas

Ahora, vamos a escribir pruebas para el contrato Counter. Creamos un archivo llamado test/counter.js:

const { expect } = require(chai)

describe(Counter contract, function () {
    let Counter
    let counter
    let owner

    beforeEach(async function () {
        Counter = await ethers.getContractFactory(Counter)
        [owner] = await ethers.getSigners()
        counter = await Counter.deploy()
        await counter.deployed()
    })

    it(Should return the initial count as zero, async function () {
        expect(await counter.getCount()).to.equal(0)
    })

    it(Should increment the count, async function () {
        await counter.increment()
        expect(await counter.getCount()).to.equal(1)
    })

    it(Should emit an event when incrementing the count, async function () {
        await expect(counter.increment()).to.emit(counter, CountIncremented).withArgs(1)
    })
})
    

Explicación del Código de Test

  1. Configuración del Contrato y Signers: Utilizamos beforeEach para desplegar una nueva instancia del contrato Counter antes de cada prueba. Esto asegura que cada prueba se ejecute en un estado del contrato limpio.

  2. Prueba Inicial: La primera prueba valida que el contador inicial es cero.

  3. Incremento del Contador: La segunda prueba llama a la función increment y verifica que el valor del contador haya aumentado a uno.

  4. Eventos: La tercera prueba verifica que se emite el evento CountIncremented con el valor correcto cuando se llama a la función increment.

Ejecutando las Pruebas

Para ejecutar las pruebas, utilizamos el siguiente comando en la terminal:

npx hardhat test
    

Si todo está configurado correctamente, deberías ver una salida en la consola indicando que todas las pruebas han pasado correctamente.

Conclusión

La escritura de tests para tus contratos inteligentes es una práctica esencial para garantizar la seguridad y funcionalidad correcta de tus contratos en producción. Utilizando Hardhat, Mocha y Chai, puedes crear un entorno de pruebas robusto que te permita identificar y corregir errores antes de desplegar tus contratos en la blockchain.


AnteriorSiguiente

[mwai_chat]

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *