Tutorial Fabric Hyperledger: Panduan Lengkap – Bagian 3


Advertising

Seri tutorial berikut terdiri dari tiga artikel yang akan mengajarkan Anda berbagai aspek tentang pengembangan chaincode Hyperledger Fabric mulai dari operasi CRUD, perlindungan data, dan pengujian chaincode.

Ikhtisar seri:

Persyaratan

  • RAM 4GB (lebih disukai)
  • Docker, Docker-Compose, Editor kode (mis. Visual Studio Code), Git
  • NodeJS versi 8.9+ (Lebih disukai 8.9.4 – Kiat: ubah versi Anda dengan pengelola versi seperti ‘ n ‘)
  • Pengetahuan dasar JavaScript

Tujuan

  • Belajarlah untuk menguji fungsi chaincode Anda
  • Pelajari cara mengejek dan menjalankan fungsi
  • Bandingkan hasil dengan pengujian Chai

pengantar

Dalam dua artikel sebelumnya, kami telah belajar membuat keduanya sebagai fungsi chaincode yang lebih maju. Pentingnya menguji kode rantai Anda tidak dapat dianggap remeh. Satu kesalahan tunggal dapat memiliki konsekuensi dramatis ketika berhadapan dengan kontrak pintar. Karenanya, kami akan menguji kualitas fungsi chaincode kami.

Memulai

Pastikan Anda memiliki salinan kode yang dapat ditemukan di Github michielmulders / hyperledger-fabric-blockgeeks . Disarankan untuk menggunakan git clonehttps://github.com/michielmulders/hyperledger-fabric-blockgeeks.git untuk membuat klon lokal repositori pada mesin Anda. Gunakan git checkout tutorial-3 untuk membuka kode tutorial ini dan lihat bagian ketiga tutorial dengan git checkout tutorial-3

Jika Anda baru mengenal tutorial ini, pastikan untuk memeriksa bagian ‘Konfigurasi Boilerplate’ di artikel pertama untuk bangun dan berjalan.

Sekarang, mari kita navigasi dengan terminal Anda ke folderchaincode / node . Dari sini, kita dapat menjalankan uji coba npm run untuk memulai pengujian kami. Tes itu sendiri terletak dichaincode / node / tests / tests.spec.ts . Mari kita lihat tes-tes ini.

Pengujian menggunakan Mockstub

Jonas Snellinckx dari TheLedger menjelaskan apa ChaincodeMockStub itu, “ChaincodeMockStub ini adalah implementasi tiruan dari rintisan fabric-shim. Ini berarti Anda dapat menguji kode rantai Anda tanpa benar-benar memulai jaringan Anda. Ini mengimplementasikan hampir setiap fungsi yang dilakukan rintisan sebenarnya, tetapi dalam memori. Hanya fungsi-fungsi ini yang belum (belum) didukung: getHistoryForKey, getBinding, getTransient, setEvent, getChannelID. “

Pengujian Chaincode

Untuk memulai, kita perlu mengimpor fungsionalitas ‘harapan’ daripaket pengujian Chai sehingga kita dapat menggunakan mekanisme perbandingan yang berbeda seperti membandingkan objek respons atau kode status. Chai adalah perpustakaan pernyataan BDD / TDD untuk node dan browser yang dapat dipasangkan dengan menyenangkan dengan kerangka kerja pengujian javascript.

impor {ekspektasi} dari  " chai " ;

Jika Anda melihat file tests.spec.ts , Anda dapat melihat kami mengelompokkan tes bersama dengan fungsi uraikan , ini hanya praktik gaya kode umum. Selanjutnya, kami menggunakan fungsi ituuntuk menentukan tes individual.

Sebagian besar tes dimulai dengan membuat instance baru dari kode rantai kami. Ini tidak selalu diperlukan karena kami juga dapat menentukan turunan global dari kode rantai kami yang dapat kami panggil dan panggil fungsi dari setiap pengujian. Ini tergantung pada bagaimana dan apa yang ingin Anda uji, kebanyakan kami akan mencoba menulis unit test, hanya menguji fungsionalitas inti suatu fungsi. Sebagian besar waktu, kami akan mendefinisikan instance chaincode baru, tetapi kami juga akan membuat instance global chaincode dengan data mobil instantiated yang dapat digunakan dalam beberapa pengujian. Ayo tulis tes pertama kami!

1. Penyelesaian Kode Rantai Init

Uji InitLedger

Pertama-tama, jaringan kami mulai dengan memanggil fungsiinitLedger yang mengisi blockchain kami dengan data Mobil. Untuk memastikan bahwa sisa kode rantai kami berfungsi dengan baik, kami perlu menguji status fungsi ini dan memeriksa apakah semua data ada dalam status blockchain.

Kami mulai dengan mengimpor chaincode dan membuat instance sehingga kami dapat mengakses semua fungsi yang telah kami tetapkan.

impor {MyChaincode} dari  '../src/MyChaincode' ;

const chaincode = new MyChaincode ();

Selanjutnya, kita dapat menentukan kasus uji pertama kita, memberikan deskripsi yang bermakna. Seperti yang Anda lihat, kami mendefinisikan instance mockstub baru yang hanya akan kami gunakan dalam pengujian ini karena kami ingin memastikan bahwa chaincode kami dikompilasi dengan benar. Fungsi mockInitmenginisialisasi kode rantai (memanggil fungsi initLedger). Kami memberikan ID transaksi unik tx1 dan meneruskan array kosong karena tidak memerlukan argumen apa pun. Ketika rantai kode diinisialisasi, kami ingin menguji status eksekusi dan memastikan semuanya berhasil. Metode yang sama dari fungsionalitas Chai mengharapkan berguna untuk membandingkan status.

it ( "Haruskah init tanpa masalah" , async () => {

       const stub = ChaincodeMockStub baru ( "MyMockStub" , chaincode);



       respon const = menunggu rintisan . mockInit ( "tx1" , []);



       harapkan (respons . status) . untuk . Persamaan ( 200 )

});

Baik fungsi mockInit dan mockInvoke mengembalikan objek janji berikut:

Janji < {

   status: nomor;

   pesan: string;

   payload: Buffer;

} >



Verifikasi data yang diinisialisasi

PANDUAN TERKAIT

Apa itu Tokenomics? Panduan Investor Utama -Bagian 15 Bahasa Pemrograman Paling MudahTutorial Blockchain | Jadi, ini adalah Blockchain-Entwickler

Saat ini, kami yakin chaincode dikompilasi dan diinisialisasi dengan benar. Namun, kami tidak yakin apakah semua data ditambahkan dengan benar ke status blockchain kami. Mari kita uji permintaan semua fungsionalitas untuk membandingkan objek mobil yang kembali dengan mobil yang diharapkan.

Kali ini, kami akan membuat instance global dari chaincode mockstub.

it ( "Harus bisa init dan query semua mobil" , async () => {

       stubWithInit = ChaincodeMockStub baru ( "MyMockStub" , chaincode);

       ...

}

Kali ini, fungsi mockInvoke digunakan untuk memanggil fungsi queryAllCars di chaincode. The queryResponse.payloadmengandung buffer yang bisa kita gunakan dalam fungsi kita membandingkan. TheLedger telah menyediakan helper yang mengubah muatan Buffer ke objek JSON menggunakan Transformhelper dari @ theledger / fabric-mock-stub . Fungsi harapkan berisi metode mendalam yang dapat membandingkan objek JSON sepenuhnya. Kami membandingkan hasilnya dengan objek awal yang telah kami tetapkan dalam fungsi initLedger .

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

harapkan (Transform . bufferToObject (queryResponse . payload)) . untuk . dalam . eq ([

           {

               buat: 'Toyota' ,

               model: 'Prius' ,

               warna: 'biru' ,

               pemilik: 'Tomoko' ,

               docType: 'mobil' ,

               kunci: 'CAR0'

           },

...

       ])

   });

2. Tes Buat Mobil

Mari kita memanggil objek buat mobil dalam test case baru. Ini adalah contoh yang bagus karena mengajarkan kita cara menyampaikan argumen ke fungsionalitas mockInvoke. Tes ini terdiri dari dua komponen. Pertama, kami menambahkan mobil baru ke status blockchain, selanjutnya, mobil ditanya untuk membandingkan kedua objek.

const stub = ChaincodeMockStub baru ( "MyMockStub" , chaincode);



respon const = menunggu rintisan . mockInvoke ( "tx1" , [ 'createCar' , JSON . stringify ({

      kunci: 'CAR0' ,

      buat: "prop1" ,

      model: "prop2" ,

      warna: "prop3" ,

      pemilik: 'pemilik'

})]);



harapkan (respons . status) . untuk . Persamaan ( 200 )

Seperti yang dapat Anda lihat, kita bisa meneruskan objek JSON yang dirender lengkap ke fungsi mockInvoke yang berisi semua properti untuk membuat objek Mobil baru. Setelah membuat mobil, kami memverifikasi status eksekusi.

Sekarang mobil ditambahkan, kami dapat meminta lagi untuk menggunakannya dalam fungsi perbandingan kami. Kami melewati kunci Mobil yang baru saja kami buat ‘CAR0’ dan melakukan yang sedalam-dalamnya.

3. Menguji Koleksi Pribadi

Baiklah, kita telah memasuki bagian terakhir dari tutorial ini di mana kita akan menguji koleksi pribadi wawasan data. Sekali lagi, mockstub memiliki alternatif dalam memori untuk koleksi pribadi sehingga kami tidak harus memulai jaringan Fabric Hyperledger kami.

Sekali lagi, hal pertama yang akan kita lakukan adalah melewati argumen untuk membuat mobil pribadi kita melalui fungsicreatePrivateCar .

const stub = ChaincodeMockStub baru ( "MyMockStub" , chaincode);



respon const = menunggu rintisan . mockInvoke ( "tx1" , [ 'createPrivateCar' , JSON . stringify ({

    kunci: 'CAR0' ,

    buat: "prop1" ,

    model: "prop2" ,

    warna: "prop3" ,

    pemilik: 'pemilik'

})]);



harapkan (respons . status) . untuk . eql ( 200 );

Oke, mari kita bandingkan objek yang diharapkan dengan objek dari koleksi pribadi dalam memori. Stub cukup pintar untuk membuat koleksi dalam memori ketika Anda menjalankan fungsi chaincode.The stub.privateCollections memegang array semua koleksi data yang pribadi dan kami menentukan koleksi kita inginkan dan apa objek untuk mengambil dari koleksi ini. Objek ini dapat dicocokkan dengan objek Mobil yang diharapkan.

harapkan (Transform . bufferToObject (stub . privateCollections [ "privateCarCollection" ] [ "CAR0" ])) . untuk . dalam . eq ({

           'make' : 'prop1' ,

           'model' : 'prop2' ,

           'warna' : 'prop3' ,

           'pemilik' : 'pemilik' ,

           'docType' : 'mobil'

       })

Jalankan semua tes

Ok, saatnya untuk menjalankan tes kami lagi, gunakan uji coba npm .Jika semuanya berjalan dengan baik, Anda akan melihat gambaran bagus tentang apa yang terjadi untuk setiap tes dan hasilnya. Kode harus memberikan hasil yang lulus 8 seperti yang ditunjukkan di bawah ini.

Apa yang kami pelajari?

ChaincodeMockStub sangat berguna karena memungkinkan pengembang untuk menguji chaincode-nya tanpa memulai jaringan setiap waktu. Ini mengurangi waktu pengembangan karena ia dapat menggunakan pendekatan pengembangan yang digerakkan pengujian (TDD) di mana ia tidak perlu memulai jaringan (ini membutuhkan + – 40-80 detik tergantung pada spesifikasi komputer). Juga, mengakses koleksi dalam memori pribadi sangat mudah melalui array stub.privateCollections . Anda hanya perlu beberapa fungsi pengujian Chai seperti kedalaman yang sama untuk menguji rantai kode Anda dengan benar.

Lembar Kode Kode

  1.  Buat instance dari chaincode yang memanggil fungsi initLedger.
menunggu rintisan . mockInit ( "tx1" , []);
  1.  Meminta fungsi normal dan meneruskan argumen.
    respon const = menunggu rintisan . mockInvoke ( “tx1” , [ ‘createCar’ , JSON . stringify ({       CarObject … })]); 3. Aktifkan fungsi chaincode yang menggunakan koleksi pribadi dan berikan argumen.
menunggu rintisan . mockInvoke ( "tx1" , [ 'createPrivateCar' , JSON . stringify ({

    CarObject ...

})]);
  1. Janji respons standar dikembalikan dari mockInit danmockInvoke :
Janji < {

   status: nomor;

   pesan: string;

   payload: Buffer;

} >

Bacaan lebih lanjut

Advertising

Baca artikel lainnya

Follow selembar digital