Sljedeća tutorial serija sastoji se od tri članka koja će vas naučiti različitim aspektima razvoja lančanog koda Hyperledger Fabric, od CRUD operacija, zaštite podataka i testiranja lančanog koda.

1. dio

2. dio

3. dio

Vodič za tkanine Hyperledger: Sveobuhvatan vodič - 2. dio

Pregled serije:

  • Članak 1.: Razvoj osnovnog lančanog koda i čuvanje privatnih podataka u zbirkama
  • Članak 2: Napredni upiti lančanog koda i CouchDB GUI
  • Članak 3: Vodič za testiranje vašeg lančanog koda s MockStubom

Zahtjevi

  • 4 GB RAM-a (preferira se više)
  • Docker, Docker-Compose, uređivač koda (npr. Visual Studio Code), Git
  • NodeJS verzija 8.9+ (Poželjna je 8.9.4 – Savjet: promijenite verziju upraviteljem verzija poput “n’)
  • Osnovno JavaScript znanje

Ciljevi

  • Naučite testirati svoje funkcije lančanog koda
  • Naučite se rugati i prizivati ​​funkcije
  • Usporedite rezultate s Chai testiranjem

Uvod

U prethodna dva članka naučili smo stvoriti obje osnovne kao naprednije funkcije lančanog koda. Važnost testiranja vašeg lančanog koda ne može se podcijeniti. Jedna jedina pogreška može imati dramatične posljedice kada se radi o pametnim ugovorima. Stoga ćemo testirati kvalitetu naših funkcija lančanog koda.

Započnite

Obavezno imajte kopiju koda na kojoj se nalazi Github michielmulders / hyperledger-fabric-blockgeeks. Preporuča se koristiti git klon https://github.com/michielmulders/hyperledger-fabric-blockgeeks.git stvoriti lokalni klon spremišta na vašem računalu. Koristiti git checkout tutorial-3 da biste otvorili kôd za ovu lekciju i pogledali treći dio lekcije sa git checkout tutorial-3

Ako ste novi u ovom vodiču, provjerite odjeljak “Postavljanje bojlera” u prvom članku da biste pokrenuli i pokrenuli.

Idemo sada putem vašeg terminala do lančani kod / čvor mapu. Odavde možemo trčati npm test rada za početak naših testova. Sami testovi nalaze se na lančani kod / čvor / testovi / testovi.spec.ts. Pogledajmo ove testove.

Testiranje pomoću Mockstub-a

Jonas Snellinckx iz TheLedger objašnjava što je ChaincodeMockStub: „Ovaj ChaincodeMockStub je lažna implementacija štitnika od tkanine. To znači da možete testirati svoj lančani kod a da zapravo niste pokrenuli svoju mrežu. Provodi gotovo svaku funkciju koju stvarni stub radi, ali u memoriji. Samo ove funkcije (još nisu) podržane: getHistoryForKey, getBinding, getTransient, setEvent, getChannelID. “

Ispitivanje lančanog koda

Da bismo započeli, moramo uvesti funkcionalnost ‘očekuj’ iz Chai paket za testiranje kako bismo mogli koristiti različite mehanizme usporedbe poput usporedbe objekata odgovora ili statusnih kodova. Chai je BDD / TDD knjižnica tvrdnji za čvor i preglednik koji se može divno upariti s bilo kojim okvirom za testiranje javascripta.

uvoz {očekivati} iz “chai”;

Ako pogledate testovi.spec.ts datoteku, možete vidjeti da testove grupiramo zajedno s opisati funkcija, ovo je samo općenita praksa u stilu koda. Dalje koristimo to funkcija za definiranje pojedinačnih testova.

Većina testova započinje stvaranjem nove instance našeg lančanog koda. To nije uvijek potrebno, jer također možemo definirati globalnu instancu našeg lančanog koda koju možemo pozivati ​​i pozivati ​​funkcije iz svakog testa. To ovisi o tome kako i što želite testirati, uglavnom ćemo pokušati napisati jedinične testove, samo testirajući osnovnu funkcionalnost funkcije. Većinu vremena definirat ćemo novu instancu lančanog koda, ali također ćemo instancirati globalnu instancu lančanog koda s instanciranim podacima o automobilu koji se mogu koristiti u više testova. Napišimo naše prve testove!

1. Dovršenje lančanog koda

Testirajte InitLedger

Prije svega, naša mreža započinje pozivanjem mreže initLedger funkcija koja ispunjava naš blockchain podacima automobila. Da bismo provjerili radi li ostatak našeg lančanog koda ispravno, moramo testirati status ove funkcije i provjeriti jesu li svi podaci prisutni u stanju blockchaina.

Počinjemo s uvozom lančanog koda i stvaramo instancu kako bismo mogli pristupiti svim funkcijama koje smo definirali.

uvoz {MyChaincode} iz ‘../src/MyChaincode’;

const chaincode = novi MyChaincode ();

Dalje, možemo definirati svoj prvi testni slučaj i dati mu smislen opis. Kao što vidite, definiramo novu mockstub instancu koju ćemo koristiti samo u ovom testu jer želimo biti sigurni da se naš lančani kod pravilno kompajlira. The mockInit funkcija inicijalizira lančani kod (poziva funkciju initLedger). Dajemo mu jedinstveni ID transakcije tx1 i proslijedite prazan niz jer ne zahtijeva nikakve argumente. Kada se lančani kod inicijalizira, želimo testirati status izvršenja i osigurati da je sve uspješno. Jednaka metoda Chai očekivane funkcionalnosti dobro dolazi za usporedbu statusa.

to("Treba pokrenuti bez problema", async () => {

       const stub = novi ChaincodeMockStub ("MyMockStub", kod lanca);

       odgovor const = pričekaj stub.mockInit ("tx1", []);

       očekivati ​​(response.status) .to.eql (200)

});

Oboje mockInit i mockInvoke funkcija vraća sljedeći objekt obećanja:

Obećanje<{

   status: broj;

   poruka: niz;

   nosivost: pufer;

}>

Provjerite inicijalizirane podatke

U ovom smo trenutku sigurni da je lančani kod pravilno sastavljen i inicijaliziran. Međutim, nismo sigurni jesu li svi podaci ispravno dodani našem stanju blockchaina. Isprobajmo upit svih funkcionalnosti kako bismo usporedili vraćene predmete automobila s očekivanim automobilima.

Ovaj put stvorit ćemo globalnu instancu lažnog koda.

to("Trebali biste moći pokretati i ispitivati ​​sve automobile", async () => {

       stubWithInit = novi ChaincodeMockStub ("MyMockStub", kod lanca);

       …

}

Ovaj put, mockInvoke funkcija koristi se za pozivanje funkcije queryAllCars u lančanom kodu. The queryResponse.payload sadrži međuspremnik koji možemo koristiti u našoj funkciji usporedbe. TheLedger je pružio pomoćnika koji pretvara korisni teret međuspremnika u JSON objekt pomoću Transformirati pomoćnik iz @ theledger / fabric-mock-stub. Funkcija očekivanja sadrži dubinsku metodu koja može u potpunosti usporediti JSON objekte. Rezultat uspoređujemo s početnim objektima koje smo definirali u initLedger funkcija.

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

očekujte (Transform.bufferToObject (queryResponse.payload)). to.deep.eq ([

           {

               make: ‘Toyota’,

               model: ‘Prius’,

               boja: ‘plava’,

               vlasnik: ‘Tomoko’,

               docType: ‘auto’,

               tipka: ‘CAR0’

           },

       ]))

   });

2. Testirajte Stvori automobil

Pozovimo objekt za stvaranje automobila u novom testnom slučaju. Ovo je dobar primjer jer nas uči kako prosljeđivati ​​argumente u funkcionalnost mockInvoke. Ovaj se test sastoji od dvije komponente. Prvo dodajemo novi automobil u stanje blockchaina, a zatim se traži upit automobila radi usporedbe oba objekta.

const stub = novi ChaincodeMockStub ("MyMockStub", kod lanca);

odgovor const = pričekaj stub.mockInvoke ("tx1", [‘createCar’, JSON.stringify ({

      tipka: ‘CAR0’,

      napraviti: "oslonac1",

      model: "oslonac2",

      boja: "prop3",

      owner: ‘vlasnik’

})]);

očekivati ​​(response.status) .to.eql (200)

Kao što vidite, možemo proslijediti puni stringificirani JSON objekt na mockInvoke funkcija koja sadrži sva svojstva za stvaranje novog objekta automobila. Nakon stvaranja automobila provjeravamo status izvršenja.

Sada je automobil dodan, možemo ga ponovno upitati kako bismo ga koristili u našoj funkciji usporedbe. Prolazimo u ključ automobila koji smo upravo stvorili ‘CAR0’ i izvodimo dubokog jednaka.

3. Testiranje privatnih kolekcija

Dobro, ušli smo u posljednji dio ovog vodiča gdje ćemo testirati uvid u privatne zbirke. Opet, mockstub ima alternativu u memoriji za privatne kolekcije, tako da ne moramo pokretati mrežu Hyperledger Fabric.

Opet, prva stvar koju ćemo učiniti je prosljeđivanje argumenata za stvaranje našeg privatnog automobila putem createPrivateCar funkcija.

const stub = novi ChaincodeMockStub ("MyMockStub", kod lanca);

odgovor const = pričekaj stub.mockInvoke ("tx1", [‘createPrivateCar’, JSON.stringify ({

    tipka: ‘CAR0’,

    napraviti: "oslonac1",

    model: "oslonac2",

    boja: "prop3",

    owner: ‘vlasnik’

})]);

očekivati ​​(response.status) .to.eql (200);

Ok, usporedimo očekivani objekt s objektom iz privatne kolekcije u memoriji. Stab je dovoljno pametan za stvaranje zbirke u memoriji kada pozivate funkciju lančanog koda. The stub.privatneZbirke sadrži niz svih privatnih zbirki podataka i mi određujemo koju zbirku želimo i koji objekt dohvatiti iz ove zbirke. Ovaj se objekt može uskladiti s očekivanim objektom automobila.

očekivati ​​(Transform.bufferToObject (stub.privateCollections ["privateCarCollection"] ["CAR0"])). to.deep.eq ({

           ‘make’: ‘prop1’,

           ‘model’: ‘prop2’,

           ‘color’: ‘prop3’,

           ‘owner’: ‘vlasnik’,

           ‘docType’: ‘automobil’

       })

Pokrenite sve testove

Ok, vrijeme je da ponovno pokrenete naše testove, upotrijebite npm test rada. Ako sve bude u redu, trebali biste vidjeti lijep pregled onoga što se dogodilo za svaki test i njegove rezultate. Kôd bi trebao prikazati 8 proslijeđenih rezultata kao što je prikazano u nastavku.

Što smo naučili?

ChaincodeMockStub je zaista koristan jer programeru omogućuje da testira svoj lančani kod bez pokretanja mreže svaki put. To smanjuje vrijeme razvoja jer može koristiti testni razvojni pristup (TDD) gdje ne treba pokretati mrežu (to traje + – 40-80 sekundi, ovisno o specifikacijama računala). Također, pristup privatnim zbirkama u memoriji vrlo je jednostavan putem stub.privatneZbirke niz. Trebate samo nekoliko Chaijevih funkcionalnosti testiranja poput dubokog jednakog da biste ispravno testirali svoj lančani kod.

Code Cheatsheet

  1. Stvorite primjerak lančanog koda koji poziva funkciju initLedger.

čekati stub.mockInit ("tx1", []);

  1. Pozovite normalnu funkciju i proslijedite argumente.

    odgovor const = pričekaj stub.mockInvoke ("tx1", [‘createCar’, JSON.stringify ({

          CarObject…

    })]);

    3. Pozovite funkciju lančanog koda koja koristi privatne kolekcije i prosljeđuje argumente.

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

    CarObject…

})]);

  1. Standardno obećanje odgovoreno je od oba mockInit i mockInvoke:

Obećanje<{

   status: broj;

   poruka: niz;

   nosivost: pufer;

}>

Dalje čita

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