ETH Kipu
  • Ethereum Developer Pack
  • Módulo 1
    • Intro a Smart Contracts
      • Fundamentos de Blockchain
        • Antecedentes
        • Bitcoin
        • Qué es Blockchain
        • Conceptos Clave en Blockchain
        • Cómo funciona la Blockchain
        • Tipos de Blockchain
        • Modelos de Consenso
      • El nuevo Internet
        • Web 3
        • Elementos Fundamentales
        • Impacto de Ethereum en Diversos Sectores
      • Wallets
        • Componentes de una wallet
        • Tipos de Wallet
        • Códigos mnemónicos
      • Ethereum 101
        • Smart Contracts
        • Cuentas
          • Tipos de cuentas
          • Contenido de cuentas
        • Transacciones
          • Componentes
          • Ciclo de vida
        • Gas
        • Solidity
        • EVM
          • La máquina de estados
          • Opcodes
          • Cómo funciona la EVM
          • Clientes de ejecución
          • DApps
      • Blockchain Explorer
        • Funciones de un blockchain explorer
        • Beneficios de utilizar un blockchain explorer
      • Remix
        • Características de Remix
        • Workspaces o espacios de trabajo
        • Cargar y compilar un contrato
        • Desplegar en la máquina virtual de Remix (Remix VM)
        • Interactuando con funciones
        • Desplegar en una red pública
      • Crea tu primer Smart Contract
  • Módulo 2
    • Fundamentos de Solidity
      • Hello World
      • Tipos de Datos
      • Funciones
      • Variables
        • Ejercicio 1
      • Operadores
        • Ejercicio 2
      • Constructor
        • Ejercicio 3
      • Convenciones de nomenclatura
      • Tipos de almacenamiento para variables
      • Estructuras de Control
        • Ejercicio 4
      • Modificadores
      • Eventos
        • Ejercicio 5
      • Tipos de Referencia
        • Arrays
          • Ejercicio 6
        • Mappings
          • Ejercicio 7
        • Structs
          • Ejercicio 8
      • Address Payable
      • Cómo reciben Ether los contratos y funciones
      • Transferencias de Ether
      • Conceptos Avanzados
        • Codificación ABI
        • Hashing
        • This
        • Herencia
        • Abstract
        • Interface
        • Llamadas entre contratos
        • EVM
        • ABI
        • Bytecode
        • Opcodes
  • Módulo 3
    • Estándares, Librerías y Patrones
      • Buenas Prácticas de Diseño
      • Patrones de Diseño
      • EIP y ERC
      • ERC-20
      • ERC-721
      • Open Zeppelin
      • Crea un Token ERC-20
      • Almacenamiento Descentralizado: IPFS
      • Crea un Token ERC-721
      • DeFi
  • Módulo 4
    • Toolkit para desarrollo en Ethereum
      • Requisitos para el módulo 4
        • Terminal
        • Git y Github
        • Node.js y npm
        • Visual Studio Code para Solidity
      • Toolkit
        • JSON-RPC
        • Ethers.js
          • Ejercicio
        • Hardhat
          • Despliegue de un contrato en Hardhat
          • Despliegue de un contrato en una red pública
        • Scaffold-ETH
          • Características
          • Cómo instalar Scaffold-ETH
  • Módulo 5
    • Seguridad, Pruebas y Auditoría
      • Pruebas
        • Importancia de realizar pruebas
        • Métodos para probar contratos inteligentes
          • Pruebas automatizadas
          • Pruebas manuales
        • Conceptos importantes en testing
        • Herramientas para testing
        • Testing con Hardhat
        • Recursos adicionales
      • Seguridad
        • Una mentalidad distinta de diseño
        • Principales vulnerabilidades en smart contracts
          • Reentrancy attack (ataque de reentrada)
          • Replay attack (ataque de repetición)
          • Price Oracle Manipulation (Manipulación de Oráculos de Precios)
          • Missing Access Control (Pérdida de Control de Acceso)
          • Reward Manipulation (Manipulación de Recompensas)
          • Failure to Initialize (Falla al Inicializar)
          • Front-running
          • Invariant Breaks (Ruptura de invariantes)
          • Mishandling of ETH (Mal manejo de ETH)
          • Denial of Service (DoS - Denegación de Servicio)
          • Integer overflow and underflow (desbordamiento y subdesbordamiento de enteros)
          • Phishing y Typosquatting
        • Recursos adicionales
      • Auditoría de smart contracts
        • Proceso de Auditoría
        • Herramientas
        • Cómo prepararse para una auditoría
        • El test Rekt
        • Retos
        • Recursos adicionales
  • Contribuye
    • Kipu Explorer
Powered by GitBook
On this page
  • Mainnet Forking
  • Desarrollo guiado por pruebas
  • Cobertura de pruebas
  • Fixtures

Was this helpful?

  1. Módulo 5
  2. Seguridad, Pruebas y Auditoría
  3. Pruebas

Conceptos importantes en testing

Mainnet Forking

Mainnet forking es una técnica en las pruebas de blockchain donde se toma un número de bloque específico y una referencia a un nodo de blockchain (como Geth), y se copia toda la información de estado relevante hasta ese número de bloque. Este estado clonado permite a los desarrolladores ejecutar pruebas contra él. Esta estrategia se implementa más comúnmente contra mainnet, especialmente cuando se prueban interacciones con código de terceros que ya está desplegado.

Una de las ventajas significativas del mainnet forking es la capacidad de ejecutar todas las pruebas localmente, reduciendo significativamente tanto los riesgos como los costos asociados con las pruebas. Dado que la red local refleja el estado en cadena, también puede revertirse a su estado original después de cada prueba, lo que permite pruebas eficientes y aisladas. Además, el estado local puede manipularse según sea necesario para simular escenarios específicos que podrían no estar presentes en el estado del fork. Mainnet forking es, por lo tanto, una herramienta potente, especialmente para probar escenarios que no están fácilmente cubiertos por las pruebas unitarias y de integración.

Desarrollo guiado por pruebas

El Desarrollo Guiado por Pruebas (Test Driven Developmente - TDD) es una metodología en la que se escriben pruebas antes del código real. Este enfoque intenta asegurar que todo el código se alinee con las especificaciones impuestas por las pruebas. El flujo de trabajo implica escribir pruebas, verificar que están fallando, escribir el código y confirmar que las pruebas pasan. Es importante notar que el código que hace que la prueba pase debe ser la cantidad mínima requerida, evitando así que cualquier código superfluo se infiltre en el proyecto. Si las pruebas fallan, es porque las pruebas o el código contienen un error.

En consecuencia, el proceso se repite después de una ronda de restructuración del código y las pruebas. Al final de una ronda de TDD, es común revisar nuevamente toda la base de código y estructurarla de manera más ordenada, por ejemplo, externalizando el código en bibliotecas o componentes individuales y volviendo a ejecutar el conjunto de pruebas para asegurar que no se han introducido errores. Aunque TDD no puede garantizar un código libre de errores, generalmente proporciona garantías más fuertes que adaptar un conjunto de pruebas a posteriori. También agiliza el proceso de escritura de pruebas, ya que los desarrolladores a menudo escriben pruebas al final del proceso de desarrollo, lo que puede llevar a fatiga y falta de cobertura en los escenarios de prueba. TDD se aplica principalmente a pruebas unitarias, pero también puede utilizarse para pruebas de integración, asumiendo que los componentes están bien definidos y no es probable que cambien. Aunque a menudo se percibe como una desventaja, TDD obliga a los desarrolladores y gerentes de proyecto a reflexionar primero sobre la arquitectura y diseño de sus contratos inteligentes y establecer un conjunto de requisitos de usuario que el sistema necesita cumplir. No obstante, cabe señalar que todas las ventajas de TDD tienen un costo en la velocidad de desarrollo, especialmente cuando los desarrolladores aún no están bien versados en el desarrollo guiado por pruebas.

Cobertura de pruebas

La cobertura de pruebas (test coverage) de contratos inteligentes se refiere a la medida en que el código del contrato ha sido ejecutado y verificado a través de pruebas automatizadas. En términos simples, es una métrica que indica qué porcentaje del código ha sido probado mediante casos de prueba específicos.

Una cobertura de pruebas del 100% es el objetivo, pero es difícil de lograr en la práctica. Sin embargo, los desarrolladores deben aspirar a cubrir todas las funciones y casos de uso críticos del contrato. Las herramientas de cobertura de código, como solidity-coverage, pueden ayudar a medir qué partes del código han sido probadas

Importancia de la cobertura de pruebas

  1. Seguridad:

    • Asegura que todas las partes críticas del contrato han sido verificadas y son seguras contra posibles vulnerabilidades.

  2. Funcionalidad:

    • Verifica que todas las funciones del contrato operen como se espera bajo diversas condiciones y entradas.

  3. Confianza:

    • Proporciona confianza tanto a los desarrolladores como a los usuarios de que el contrato ha sido exhaustivamente probado y es confiable.

  4. Mantenimiento:

    • Facilita el mantenimiento y la actualización del contrato, asegurando que cualquier cambio o adición al código sea también probado adecuadamente.

Tipos de cobertura de pruebas

  1. Cobertura de Líneas:

    • Mide el porcentaje de líneas de código que han sido ejecutadas durante las pruebas.

  2. Cobertura de Funciones:

    • Mide el porcentaje de funciones que han sido llamadas al menos una vez durante las pruebas.

  3. Cobertura de Condiciones:

    • Mide el porcentaje de posibles condiciones booleanas que han sido evaluadas como verdaderas y falsas durante las pruebas.

  4. Cobertura de Ramas:

    • Mide el porcentaje de caminos de ejecución (ramas) que han sido seguidos durante las pruebas, incluyendo las bifurcaciones en las sentencias if, else, switch, etc.

Herramienta para medir la cobertura de pruebas

Fixtures

Los fixtures son escenarios de prueba que se ejecutan una vez y luego son recordados haciendo fotos de la blockchain. Entre los beneficios que ofrecen podemos considerar:

  • Nos liberan de la necesidad de volver a desplegar el contrato antes de hacer una nueva prueba.

  • Garantizan que las pruebas se ejecuten siempre bajo las mismas condiciones iniciales, lo que es crucial para la consistencia y confiabilidad de las pruebas.

  • Permiten que cada prueba se ejecute en un entorno limpio y aislado, evitando que el estado de una prueba afecte a otra.

  • Ayudan a reducir el tiempo de configuración para cada prueba individual al definir un estado inicial común para un grupo de pruebas.

Hardhat permite configurar fixtures en su entorno de pruebas.

PreviousPruebas manualesNextHerramientas para testing

Last updated 8 months ago

Was this helpful?

Una de las herramientas más utilizadas para medir la cobertura de pruebas en contratos inteligentes escritos en Solidity es solidity-coverage. Genera un informe detallado sobre qué partes del código han sido ejecutadas durante las pruebas. Se puede ejecutar de forma independiente o dentro de Hardhat. Puedes encontrar más información en en GitHub.

su repositorio