Tutorial de Hyperledger Fabric: Guía completa – Parte 3

La siguiente serie de tutoriales consta de tres artículos que le enseñarán varios aspectos sobre el desarrollo de códigos de cadena de Hyperledger Fabric que van desde operaciones CRUD, protección de datos y pruebas de código de cadena.

Parte 1

Parte 2

Parte 3

Tutorial de Hyperledger Fabric: Guía completa - Parte 2

Una descripción general de la serie:

  • Artículo 1: Desarrollo de chaincode básico y almacenamiento de datos privados en colecciones
  • Artículo 2: consultas de código de cadena avanzadas y la GUI de CouchDB
  • Artículo 3: Un tutorial para probar su código de cadena con MockStub

Requisitos

  • 4GB de RAM (se prefiere más)
  • Docker, Docker-Compose, editor de código (por ejemplo, Visual Studio Code), Git
  • NodeJS versión 8.9+ (la preferida es 8.9.4 – Consejo: cambie su versión con un administrador de versiones como “norte’)
  • Conocimientos básicos de JavaScript

Objetivos

  • Aprenda a probar las funciones de su código de cadena
  • Aprenda a simular e invocar funciones
  • Compare los resultados con las pruebas de Chai

Introducción

En los dos artículos anteriores, hemos aprendido a crear funciones de código de cadena tanto básicas como avanzadas. No se puede subestimar la importancia de probar su código de cadena. Un solo error puede tener consecuencias dramáticas cuando se trata de contratos inteligentes. Por lo tanto, pondremos a prueba la calidad de nuestras funciones de código de cadena..

Empezar

Asegúrese de tener una copia del código que se puede encontrar en Github michielmulders / hyperledger-fabric-blockgeeks. Se recomienda usar clon de git https://github.com/michielmulders/hyperledger-fabric-blockgeeks.git para crear un clon local del repositorio en su máquina. Utilizar tutorial de git checkout-3 para abrir el código de este tutorial y ver la tercera parte del tutorial con tutorial de git checkout-3

Si es nuevo en este tutorial, asegúrese de consultar la sección “Configuración estándar” en el primer artículo para comenzar a utilizarlo..

Ahora, naveguemos con su terminal al código de cadena / nodo carpeta. Desde aquí podemos correr prueba de ejecución npm para comenzar nuestras pruebas. Las pruebas en sí están ubicadas en chaincode / node / tests / tests.spec.ts. Echemos un vistazo a estas pruebas.

Prueba usando Mockstub

Jonas Snellinckx de TheLedger explica qué es ChaincodeMockStub, “Este ChaincodeMockStub es una implementación simulada del talón de calzas de tela. Esto significa que puede probar su código de cadena sin realmente iniciar su red. Implementa casi todas las funciones que hace el stub real, pero en la memoria. Solo estas funciones no son (todavía) compatibles: getHistoryForKey, getBinding, getTransient, setEvent, getChannelID “.

Prueba de encadenamiento

Para comenzar, debemos importar la funcionalidad “espera” de la Chai paquete de prueba para que podamos usar diferentes mecanismos de comparación como comparar objetos de respuesta o códigos de estado. Chai es una biblioteca de aserciones BDD / TDD para el nodo y el navegador que se puede emparejar deliciosamente con cualquier marco de prueba de JavaScript.

importar {esperar} de “chai”;

Si echa un vistazo a la tests.spec.ts archivo, puede ver que agrupamos las pruebas junto con el describir función, esto es solo una práctica general de estilo de código. A continuación, usamos el eso función para definir pruebas individuales.

La mayoría de las pruebas comienzan con la creación de una nueva instancia de nuestro código de cadena. Esto no siempre es necesario, ya que también podemos definir una instancia global de nuestro código de cadena al que podemos llamar e invocar funciones desde cada prueba. Esto depende de cómo y qué desee probar, principalmente intentaremos escribir pruebas unitarias, solo probando la funcionalidad principal de una función. La mayoría de las veces, definiremos una nueva instancia de código de cadena, pero también crearemos una instancia de código de cadena global con datos de automóvil instanciados que se pueden usar en múltiples pruebas. Escribamos nuestras primeras pruebas!

1. Finalización del código de cadena inicial

Prueba InitLedger

En primer lugar, nuestra red comienza llamando al initLedger función que llena nuestra cadena de bloques con datos de coches. Para asegurarnos de que el resto de nuestro código de cadena funcione correctamente, debemos probar el estado de esta función y verificar si todos los datos están presentes en el estado de la cadena de bloques..

Empezamos importando el chaincode y creamos una instancia para poder acceder a todas las funciones que hemos definido.

importar {MyChaincode} desde ‘../src/MyChaincode’;

const chaincode = new MyChaincode ();

A continuación, podemos definir nuestro primer caso de prueba, darle una descripción significativa. Como puede ver, definimos una nueva instancia de mockstub que solo usaremos en esta prueba ya que queremos estar seguros de que nuestro código de cadena se compila correctamente. los mockInit función inicializa el código de cadena (llama a la función initLedger). Le damos un ID de transacción único tx1 y pasar una matriz vacía ya que no requiere ningún argumento. Cuando se inicializa el código de cadena, queremos probar el estado de ejecución y asegurarnos de que todo fue exitoso. El método de igualdad de la funcionalidad de espera de Chai es útil para comparar el estado.

eso("Debería iniciar sin problemas", async () => {

       const stub = nuevo ChaincodeMockStub ("MyMockStub", código de cadena);

       respuesta constante = espera stub.mockInit ("tx1", []);

       esperar (response.status) .to.eql (200)

});

Ambos mockInit y mockInvoke función devuelve el siguiente objeto de promesa:

Promesa<{

   estado: número;

   mensaje: cadena;

   payload: Buffer;

}>

Verificar datos inicializados

En este momento, estamos seguros de que el código de cadena se ha compilado e inicializado correctamente. Sin embargo, no estamos seguros de si todos los datos se adjuntan correctamente al estado de nuestra cadena de bloques. Probemos toda la funcionalidad de la consulta para comparar los objetos de automóvil devueltos con los automóviles esperados..

Esta vez, crearemos una instancia global del código de cadena mockstub.

eso("Debería poder iniciar y consultar todos los coches", async () => {

       stubWithInit = nuevo ChaincodeMockStub ("MyMockStub", código de cadena);

       …

}

Esta vez, el mockInvoke La función se utiliza para invocar la función queryAllCars en el código de cadena. los queryResponse.payload contiene un búfer que podemos usar en nuestra función de comparación. TheLedger ha proporcionado un ayudante que convierte una carga útil de búfer en un objeto JSON utilizando Transformar ayudante de @ theledger / fabric-mock-stub. La función de espera contiene un método profundo que puede comparar objetos JSON por completo. Comparamos el resultado con los objetos iniciales que hemos definido en el initLedger función.

const queryResponse = aguardar stubWithInit.mockInvoke ("txID2", ["queryAllCars"]);

esperar (Transform.bufferToObject (queryResponse.payload)). to.deep.eq ([

           {

               hacer: ‘Toyota’,

               modelo: ‘Prius’,

               color azul’,

               propietario: ‘Tomoko’,

               docType: ‘coche’,

               clave: ‘CAR0’

           },

       ])

   });

2. Prueba Create Car

Invoquemos el objeto Create Car en un nuevo caso de prueba. Este es un buen ejemplo, ya que nos enseña cómo pasar argumentos a la funcionalidad mockInvoke. Esta prueba consta de dos componentes. Primero, agregamos el auto nuevo al estado blockchain, luego, se consulta el auto para comparar ambos objetos.

const stub = nuevo ChaincodeMockStub ("MyMockStub", código de cadena);

respuesta constante = espera stub.mockInvoke ("tx1", [‘createCar’, JSON.stringify ({

      clave: ‘CAR0’,

      hacer: "prop1",

      modelo: "prop2",

      color: "prop3",

      propietario: ‘propietario’

})]);

esperar (response.status) .to.eql (200)

Como puede ver, podemos pasar un objeto JSON completo en cadena al mockInvoke función que contiene todas las propiedades para crear el nuevo objeto Car. Después de crear el auto, verificamos el estado de ejecución..

Ahora que se agrega el automóvil, podemos consultarlo nuevamente para usarlo en nuestra funcionalidad de comparación. Pasamos la llave del coche que acabamos de crear “CAR0” y realizamos un profundo-igual.

3. Prueba de colecciones privadas

Muy bien, hemos entrado en la última parte de este tutorial donde probaremos colecciones privadas de información sobre datos. Nuevamente, el mockstub tiene una alternativa en memoria para colecciones privadas, por lo que no tenemos que iniciar nuestra red Hyperledger Fabric.

De nuevo, lo primero que haremos será pasar los argumentos para crear nuestro coche privado a través del createPrivateCar función.

const stub = nuevo ChaincodeMockStub ("MyMockStub", código de cadena);

respuesta constante = espera stub.mockInvoke ("tx1", [‘createPrivateCar’, JSON.stringify ({

    clave: ‘CAR0’,

    hacer: "prop1",

    modelo: "prop2",

    color: "prop3",

    propietario: ‘propietario’

})]);

esperar (response.status) .to.eql (200);

Ok, comparemos el objeto esperado con el objeto de la colección privada en memoria. El stub es lo suficientemente inteligente como para crear la colección en memoria cuando invoca la función de código de cadena. los stub.privateCollections contiene una matriz de todas las colecciones de datos privados y especificamos qué colección queremos y qué objeto recuperar de esta colección. Este objeto puede coincidir con el objeto Coche esperado.

esperar (Transform.bufferToObject (stub.privateCollections ["privateCarCollection"] ["CAR0"])). to.deep.eq ({

           ‘hacer’: ‘prop1’,

           ‘modelo’: ‘prop2’,

           ‘color’: ‘prop3’,

           ‘propietario’: ‘propietario’,

           ‘docType’: ‘coche’

       })

Ejecuta todas las pruebas

Ok, es hora de ejecutar nuestras pruebas nuevamente, use prueba de ejecución npm. Si todo va bien, debería ver una buena descripción general de lo que sucedió en cada prueba y su resultado. El código debe generar 8 resultados aprobados como se muestra a continuación.

Que aprendimos?

El ChaincodeMockStub es realmente útil ya que permite a un desarrollador probar su código de cadena sin iniciar la red cada vez. Esto reduce el tiempo de desarrollo, ya que puede usar un enfoque de desarrollo impulsado por pruebas (TDD) en el que no necesita iniciar la red (esto toma + – 40-80 segundos, dependiendo de las especificaciones de la computadora). Además, acceder a colecciones privadas en memoria es muy sencillo a través del stub.privateCollections formación. Solo necesita algunas de las funcionalidades de prueba de Chai, como deep equal, para probar correctamente su código de cadena.

Hoja de referencia de código

  1. Crea una instancia de chaincode que llama a la función initLedger.

aguardar stub.mockInit ("tx1", []);

  1. Invocar una función normal y pasar argumentos.

    respuesta constante = espera stub.mockInvoke ("tx1", [‘createCar’, JSON.stringify ({

          CarObject…

    })]);

    3. Invoque una función de código de cadena que use colecciones privadas y pase argumentos.

aguardar stub.mockInvoke ("tx1", [‘createPrivateCar’, JSON.stringify ({

    CarObject…

})]);

  1. Promesa de respuesta estándar devuelta por ambos mockInit y mockInvoke:

Promesa<{

   estado: número;

   mensaje: cadena;

   payload: Buffer;

}>

Lecturas adicionales

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me