Introducción
En esta Guía de testing automatizado para contribuciones a Bitcoin Core encontrarás los pasos detallados para configurar tu entorno, escribir pruebas unitarias y funcionales, y integrarlas en el proceso de revisión continua. El objetivo es garantizar la calidad, detectar regresiones y facilitar la colaboración en el desarrollo de Bitcoin Core.
Configuración del entorno de testing
Requisitos previos
Sistema operativo: Linux o macOS (Ubuntu 20.04 , Debian 10 , macOS 10.15 ).
Compilador: GCC ≥ 9.3 o Clang ≥ 10 con soporte C 17.
Dependencias: OpenSSL, libevent, ZeroMQ (opcional para pruebas de RPC). Consulta la documentación oficial en build-unix.md.
Python: Versión 3.8 para el framework de pruebas funcionales.
Compilación de Bitcoin Core con soporte de testing
Activa las opciones de prueba al configurar:
./autogen.sh
./configure –enable-debug –enable-functional-tests
make
La opción –enable-functional-tests habilita el directorio test/functional y sus dependencias Python.
Tipos de pruebas automatizadas
Pruebas unitarias (C )
Se ubican en src/test/ y usan el framework Boost.Test. Cada archivo de prueba termina con _tests.cpp.
Pruebas funcionales (Python)
Scripts ubicados en test/functional/ que arrancan nodos bitcoind, envían RPC y verifican comportamientos end-to-end.
Pruebas de integración RPC
Similan pruebas funcionales, pero enfocadas en llamadas específicas del JSON-RPC. Se pueden escribir en C o Python.
Estructura del directorio de tests
src/test/: Pruebas unitarias en C .
test/functional/: Pruebas funcionales en Python.
test/lint/: Scripts de lint para estilo de código.
Escribiendo tu primera prueba
Prueba unitaria en C
Ejemplo mínimo en src/test/foo_tests.cpp:
#include ltboost/test/unit_test.hppgt
BOOST_AUTO_TEST_SUITE(foo_tests)
BOOST_AUTO_TEST_CASE(addition){ BOOST_CHECK_EQUAL(1 1, 2) }
BOOST_AUTO_TEST_SUITE_END()
Prueba funcional en Python
Ejemplo en test/functional/foo_test.py:
from test_framework.test_framework import BitcoinTestFramework
class FooTest(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 1
def run_test(self):
balance = self.nodes[0].getbalance()
assert(balance == 50)
if __name__ == __main__:
FooTest().main()
Ejecución de pruebas
Tests unitarios
Ejecuta todas las pruebas unitarias con:
src/test/test_bitcoin
Tests funcionales
Arranca el conjunto completo:
test/functional/test_runner.py
O ejecuta un caso específico:
test/functional/test_runner.py –tests foo_test
Integración continua (CI)
Bitcoin Core utiliza GitHub Actions y Travis CI. Cada PR activa un pipeline que incluye:
Compilación con distintas configuraciones.
Ejecución de pruebas unitarias y funcionales.
Lint y chequeos de estilo.
Consulta el archivo de configuración en .github/workflows/ci.yml.
Mejores prácticas y consejos
Atomicidad: Cada prueba debe verificar una única funcionalidad.
Aislamiento: Evita dependencias entre tests para facilitar la paralelización.
Documentación: Añade comentarios claros en casos complejos.
Revisiones frecuentes: Ejecuta tests localmente antes de subir tu PR.
Actualizaciones del framework: Mantente al día con cambios en test/functional revisando los commits del repositorio.
Recursos adicionales
src/test – Código de pruebas unitarias.
test/functional – Framework de pruebas Python.
Developer Testing – Documentación oficial en bitcoincore.org.