コントラクトをテストしよう🦍

 

どうも、Mejikaです❗️

 

前回は、コントラクトをコンパイルしました。

いよいよデプロイ……

 

なんですけど

 

本番って

なにかと不安ですよね🥺

 

 ・ちゃんとコントラクト発行されるかなぁ

 ・発行したあとうまく動作するかなあ

 

こんな不安をなくすために

本番まえのテストをします

 

 

コントラクトのデプロイは

 

本番では

 ・イーサリアム上のノードにトランザクションを送ります。

 ・コントラクトをイーサリム上で発行します。

 ・web3 providerを通じてコントラクトを動かします。

 

 

 

 ^^^^^^

  web3 providerは

  イメージ、海外旅行の現地ガイドでしょうかw

  日本語が通じないので、翻訳機を使って会話して

  やりたいことを伝えたら、代わりに手配してくれます😌

 ^^^^^^

 

 

テストでは

 ・自分のPC(ローカル)上に仮想イーサリアムを作ります

 ・仮想イーサリウム上の仮想ノードにトランザクションを送ります

 ・コントラクトを仮想イーサリウム上で発行します。

 ・web3 provider を通じてコントラクトを動かします

 

 

まさに本番と同じ仮想環境で

テストするんですねw

 

 

今回は、Truffle の ganacheを使います。

ローカルに仮想環境を作ってくれます。

 

テストの実行には mocha を使います。

自動でテストしてくれるツールで、

 ・コントラクトの発行と操作

 ・うまくいったかどうか連絡

をしてくれます。

 

あとはweb3 もインストールしましょう。

web3 providerですね。

 

では、早速この3つをインストールしてみましょう。

 

 

 ^^^^^

ganache-cli は、ganache の1つで、

コマンドライン(キーボードだけで操作するもの)です。

 ^^^^^

エンター!

インストールできましたでしょうか?

なお、package.jsonファイルのtestの部分は、

mocha、としておきましょう。

 

 

 

それでは、テスト実行のためのコードを書きましょう

 

まずは、コントラクトの発行までテストします

const assert = require('assert');
const ganache = require('ganache-cli');
const Web3 = require('web3');
const web3 = new Web3(ganache.provider());

const { interface, bytecode } = require('../compile');

let accounts;
let msg;

beforeEach(async () => {
  // Get a list of all accounts
  accounts = await web3.eth.getAccounts();
  msg = await new web3.eth.Contract(JSON.parse(interface))
    .deploy({
      data: bytecode,
      arguments: [''],
   })
    .send({ from: accounts[0], gas: '1000000' });
});

describe('Msg', () => {
  it('deploys a contract', () => {
    console.log(msg);
  });
});

 const → ライブラリから関数を呼び出します。

 assert → 書いたコードがうまくいってるかを確認します。

 Web3 / web3 → web3 provider を指定します。

 

^^^^^

 Web3がコンストラクタ

 web3がインスタンス

のイメージです。

 

web3でnewして web3 provider を定義します。

今回はテストなので ganache です。

本番だと、イーサリウムになります。

 ^^^^^

 

 

中身をみていきましょう。

今回は、

 アドレスを入手

 → 終わったら、コントラクト発行

という順番で処理したい(非同期処理をしたい)ため、

beforeEach() というコールバック関数を使います。

 

さらにpromise (async/await) をつけることで、

コードの繰り返しも省略できます。

 

 ^^^^^

  非同期処理については、コチラの動画の説明が分かりやすかったです!

 ^^^^^

  

 

 

 

 

 ^^^^^

 JOSN.parse → データのやり取り、データの解析方法の指示をします。

 JSON → JavaScript Object Notificationの略です。

      webサーバーとデータのやり取りに使います。

 parse → 英語で、解析する、分析する の意味です。

 ^^^^^

 

コントラクト発行のためには、

 bytecode 

 ABI

が必要です。

 

コントラクトを動かすには

 ABI

 コントラクトアドレス

が必要です。

 

describe と it という mocha の関数を使います。

テストがうまくいったら deploy a contract と表示してくれます。

 

 

 

ではいよいよ

テストを実行しましょう!

npm run test🚀 ゴーっ!

 

 

 

 なんかいろいろ出てきましたww

 無事にコントラクトが発行されましたね!

 

 

ではつぎに

発行したコントラクトが動作するかのテストです。

 

コードを追記します。

青字 の部分です。

const assert = require('assert');
const ganache = require('ganache-cli');
const Web3 = require('web3');
const web3 = new Web3(ganache.provider());

const { interface, bytecode } = require('../compile');

let accounts;
let msg;

beforeEach(async () => {
  // Get a list of all accounts
  accounts = await web3.eth.getAccounts();
  msg = await new web3.eth.Contract(JSON.parse(interface))
    .deploy({
      data: bytecode,
      arguments: [''],
   })
    .send({ from: accounts[0], gas: '1000000' });
});

describe('Msg', () => {
  it('deploys a contract', () => {
    assert.ok(msg.options.address);
  });
  it('has a default message', async () => {
    const message = await msg.methods.message().call();
    assert.equal(message, '');
  });
  it('can change the message', async () => {
    await msg.methods.setMessage('グッモー忍!').send({ from: accounts[0] });
    const message = await msg.methods.message().call();
    assert.equal(message, 'グッモー忍!');
  });

});

 

 

console.logの代わりに、assert の関数を使います。

 

 

つぎに、コントラクトの動作確認です。

 メッセージが正しく刻み込まれるか

確認します。

 

 

 

 

では、テストしてみましょう。

 

 

うまくいきましたね!

 

 

お疲れさまでした!

次回は、いよいよ本番デプロイです!

(イーサリウムのテストネット Rinkeby 上にデプロイします!)

 

 

ここまで読んでくださったあなた

本当にありがとうございます!

 

それではまた

お会いしましょう1

ウホウホ

🦍

 

※この入門編では、solidity ^04.17 を使っています。(ちょい古いかも、、、、

 最新のバージョンでは、少しコードの中身が変わってくる部分もあります。

 そのあたり、また別でお伝えしていきますね😀

コメント

タイトルとURLをコピーしました