Hyperledger Fabric Tutorial: Comprehensive Guide – Part 3

Følgende opplæringsserie består av tre artikler som vil lære deg forskjellige aspekter om utvikling av Hyperledger Fabric kjedekode, alt fra CRUD-operasjoner, databeskyttelse og kjettingkodetesting.

Del 1

Del 2

Del 3

Hyperledger Fabric Tutorial: Comprehensive Guide - Part 2

En oversikt over serien:

  • Artikkel 1: Grunnleggende utvikling av kjedekode og lagring av private data i samlinger
  • Artikkel 2: Avanserte kjedekodespørsmål og CouchDB GUI
  • Artikkel 3: En veiledning for å teste kjedekoden din med MockStub

Krav

  • 4 GB RAM (mer er å foretrekke)
  • Docker, Docker-Compose, kodeditor (f.eks. Visual Studio Code), Git
  • NodeJS versjon 8.9+ (Foretrukket er 8.9.4 – Tips: endre versjonen din med en versjonsbehandling som ‘n’)
  • Grunnleggende JavaScript-kunnskaper

Mål

  • Lær deg å teste kjedekodefunksjonene dine
  • Lær å spotte og påkalle funksjoner
  • Sammenlign resultatene med Chai-testing

Introduksjon

I de to foregående artiklene har vi lært å lage begge grunnleggende som mer avanserte kjedekodefunksjoner. Viktigheten av å teste kjedekoden din kan ikke undervurderes. En enkelt feil kan ha dramatiske konsekvenser når det gjelder smarte kontrakter. Derfor vil vi sette kvaliteten på kjedekodefunksjonene våre på prøve.

Kom i gang

Forsikre deg om at du har en kopi av koden som du finner på Github michielmulders / hyperledger-fabric-blockgeeks. Det anbefales å bruke git klon https://github.com/michielmulders/hyperledger-fabric-blockgeeks.git for å opprette en lokal klon av depotet på maskinen din. Bruk git checkout tutorial-3 for å åpne koden for denne opplæringen og sjekke ut den tredje delen av opplæringen med git checkout tutorial-3

Hvis du er ny i denne opplæringen, må du sjekke ut delen ‘Oppsett av kjele’ i den første artikkelen for å komme i gang.

La oss nå navigere med terminalen din til kjedekode / node mappe. Herfra kan vi løpe npm løpstest for å starte testene våre. Selve testene ligger på kjedekode / node / tester / tests.spec.ts. La oss ta en titt på disse testene.

Testing med Mockstub

Jonas Snellinckx fra TheLedger forklarer hva ChaincodeMockStub er, “Denne ChaincodeMockStub er en mock-implementering av stoff-shim-stubben. Dette betyr at du kan teste kjedekoden din uten å starte nettverket. Den implementerer nesten alle funksjoner den faktiske stubben gjør, men i hukommelsen. Bare disse funksjonene støttes (ennå) ikke: getHistoryForKey, getBinding, getTransient, setEvent, getChannelID. ”

Kjettingkodetesting

For å komme i gang, må vi importere ‘forvent’ funksjonaliteten fra Chai testpakke slik at vi kan bruke forskjellige sammenligningsmekanismer som å sammenligne responsobjekter eller statuskoder. Chai er et BDD / TDD påstandsbibliotek for node og nettleser som kan sammenkobles med alle javascript-testrammer.

importere {expect} fra “chai”;

Hvis du tar en titt på tests.spec.ts filen, kan du se at vi grupperer tester sammen med beskrive funksjon, er dette bare en generell kodestil praksis. Deretter bruker vi den funksjon for å definere individuelle tester.

De fleste tester starter med å lage en ny forekomst av kjedekoden vår. Dette er ikke alltid nødvendig da vi også kan definere en global forekomst av kjedekoden vår som vi kan ringe og påkalle funksjoner på fra hver test. Dette avhenger av hvordan og hva du vil teste, for det meste vil vi prøve å skrive enhetstester, bare teste kjernefunksjonaliteten til en funksjon. Mesteparten av tiden vil vi definere en ny kjedekode-forekomst, men vi vil også instantiere en global kjede-kode-forekomst med øyeblikkelig bildata som kan brukes i flere tester. La oss skrive de første testene våre!

1. Innledende kjettingkodefullføring

Test InitLedger

Først og fremst begynner nettverket vårt med å ringe initLedger funksjon som fyller blockchain med bildata. For å sikre at resten av kjedekoden vår fungerer som den skal, må vi teste statusen til denne funksjonen og sjekke om alle data er tilstede i blockchain-tilstanden.

Vi starter med å importere kjedekoden og oppretter en forekomst slik at vi får tilgang til alle funksjonene vi har definert.

importere {MyChaincode} fra ‘../src/MyChaincode’;

const chaincode = ny MyChaincode ();

Deretter kan vi definere vår første testtilfelle, gi den en meningsfull beskrivelse. Som du kan se, definerer vi en ny mockstub-forekomst som vi bare vil bruke i denne testen, ettersom vi vil være sikre på at kjedekoden vår kompileres riktig. De mockInit funksjon initialiserer kjedekoden (kaller initLedger-funksjonen). Vi gir den en unik transaksjons-ID tx1 og passere en tom matrise da den ikke krever noen argumenter. Når kjedekoden initialiseres, vil vi teste kjøringsstatusen og sørge for at alt var vellykket. Den like metoden til Chai forventer funksjonalitet er nyttig for å sammenligne statusen.

den("Bør init uten problemer", asynkronisering () => {

       const stub = ny ChaincodeMockStub ("MyMockStub", kjedekode);

       const respons = avventer stub.mockInit ("tx1", []);

       forvent (respons.status) .to.eql (200)

});

Begge mockInit og mockInvoke funksjon returner følgende løfteobjekt:

Love<{

   status: nummer;

   melding: streng;

   nyttelast: Buffer;

}>

Bekreft initialiserte data

For øyeblikket er vi sikre på at kjedekoden er kompilert og initialisert riktig. Vi er imidlertid ikke sikre på om alle dataene er riktig lagt til vår blockchain-tilstand. La oss teste spørsmålet om all funksjonalitet for å sammenligne de returnerte bilobjektene med de forventede bilene.

Denne gangen lager vi en global forekomst av kjedekoden mockstub.

den("Skal kunne starte og spørre alle biler", asynkronisering () => {

       stubWithInit = ny ChaincodeMockStub ("MyMockStub", kjedekode);

       …

}

Denne gangen, den mockInvoke funksjonen brukes til å påkalle queryAllCars-funksjonen i kjedekoden. De queryResponse.payload inneholder en buffer som vi kan bruke i vår sammenligningsfunksjon. TheLedger har levert en hjelper som konverterer en buffernyttelast til et JSON-objekt ved hjelp av Forvandle hjelper fra @ theledger / stoff-mock-stub. Forventningsfunksjonen inneholder en dyp metode som kan sammenligne JSON-objekter helt. Vi sammenligner resultatet med de første objektene vi har definert i initLedger funksjon.

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

forvent (Transform.bufferToObject (queryResponse.payload)). til.deep.eq ([

           {

               merke: ‘Toyota’,

               modell: ‘Prius’,

               farge: ‘blå’,

               eier: ‘Tomoko’,

               docType: ‘bil’,

               nøkkel: ‘CAR0’

           },

       ])

   });

2. Test Lag bil

La oss påkalle skap bilobjektet i en ny prøvesak. Dette er et godt eksempel, da det lærer oss hvordan vi kan føre argumenter til mockInvoke-funksjonaliteten. Denne testen består av to komponenter. Først legger vi til den nye bilen i blockchain-tilstand, neste blir bilen spurt om å sammenligne begge objektene.

const stub = ny ChaincodeMockStub ("MyMockStub", kjedekode);

const respons = avventer stub.mockInvoke ("tx1", [‘createCar’, JSON.stringify ({

      nøkkel: ‘CAR0’,

      gjøre: "prop1",

      modell: "prop2",

      farge: "prop3",

      eier: ‘eier’

})]);

forvent (respons.status) .to.eql (200)

Som du kan se, kan vi overføre et fullstendig JSON-objekt til mockInvoke funksjon som inneholder alle egenskapene for å lage det nye bilobjektet. Etter å ha opprettet bilen, bekrefter vi utførelsesstatusen.

Nå er bilen lagt til, vi kan spørre den igjen for å bruke den i vår sammenligningsfunksjonalitet. Vi passerer nøkkelen til bilen vi nettopp har opprettet ‘CAR0’ og utfører en dyp-like.

3. Testing av private samlinger

Ok, vi har gått inn i den siste delen av denne opplæringen der vi vil teste datainnsikt private samlinger. Igjen har mockstuben et alternativ i minnet for private samlinger, slik at vi ikke trenger å starte vårt Hyperledger Fabric-nettverk.

Igjen, det første vi vil gjøre er å sende argumentene for å lage vår private bil via createPrivateCar funksjon.

const stub = ny ChaincodeMockStub ("MyMockStub", kjedekode);

const respons = avventer stub.mockInvoke ("tx1", [‘createPrivateCar’, JSON.stringify ({

    nøkkel: ‘CAR0’,

    gjøre: "prop1",

    modell: "prop2",

    farge: "prop3",

    eier: ‘eier’

})]);

forvent (respons.status) .to.eql (200);

Ok, la oss sammenligne det forventede objektet med objektet fra den private samlingen i minnet. Stubben er smart nok til å lage samling i minnet når du påkaller kjedekodefunksjonen. De stub.privateCollections har en rekke med alle private datasamlinger, og vi spesifiserer hvilken samling vi ønsker og hvilket objekt som skal hentes fra denne samlingen. Dette objektet kan matches med det forventede bilobjektet.

forvent (Transform.bufferToObject (stub.privateCollections ["privateCarCollection"] ["CAR0"til.deep.eq ({

           ‘make’: ‘prop1’,

           ‘modell’: ‘prop2’,

           ‘farge’: ‘prop3’,

           ‘eier’: ‘eier’,

           ‘docType’: ‘bil’

       })

Kjør alle testene

Ok, det er på tide å kjøre testene våre igjen, bruk npm løpstest. Hvis alt går bra, bør du se en fin oversikt over hva som skjedde for hver test og resultatet. Koden skal gi 8 bestemte resultater som vist nedenfor.

Hva lærte vi?

ChaincodeMockStub er veldig nyttig, da det lar en utvikler teste kjedekoden sin uten å starte nettverket hver gang. Dette reduserer utviklingstiden da han kan bruke en testdrevet utviklingsmetode (TDD) der han ikke trenger å starte nettverket (dette tar + – 40-80 sekunder, avhengig av spesifikasjonene på datamaskinen). Å få tilgang til private minnesamlinger er veldig grei via stub.privateCollections array. Du trenger bare noen få av Chai’s testfunksjoner, som dypet, for å teste kjedekoden din riktig.

Kode Cheatsheet

  1. Opprett forekomst av kjedekode som kaller initLedger-funksjonen.

venter på stub.mockInit ("tx1", []);

  1. Påkalle en normal funksjon og passere argumenter.

    const respons = avventer stub.mockInvoke ("tx1", [‘createCar’, JSON.stringify ({

          CarObject…

    })]);

    3. Påkalle en kjedekodefunksjon som bruker private samlinger og sender argumenter.

venter på stub.mockInvoke ("tx1", [‘createPrivateCar’, JSON.stringify ({

    CarObject…

})]);

  1. Standard responsløfte returnert fra begge mockInit og mockInvoke:

Love<{

   status: nummer;

   melding: streng;

   nyttelast: Buffer;

}>

Videre leser

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