たのしい工学

プログラミングを学んで、モノをつくりたいひと、効率的に仕事をしたい人のための硬派なブログになりました

【Dappsアプリ】選挙投票Dappsの作成-その3-

   

この記事は【Dappsアプリ】選挙投票Dappsの作成-その2-のつづきです。

Dappsに限らず、アプリケーションを開発するうえで、テストは非常に重要です。

それでは、バグがないことを確認していきましょう。

ブロックチェーンは改変不可なので、もしも、コントラクトにバグがあるならば、新しいコピーをデプロイしなければなりません。
そのコピーは以前のバージョンのコントラクトとは同じ状態をもたず、おなじアドレスももちません。

コントラクトを発行するには、gas(eth)が必要です。もしも、バグを含んだ状態のコントラクトを発行してしまうことは、gasの無駄づかいにつながります。

ですので、コントラクトのテストを行うことはバグのないコントラクトをデプロイするために非常に重要なのです。

それではtestを行うためのファイルをつくっていきましょう。まず、ganacheが動作していることを確認します。

スマートコントラクトをテストするには、いくつか方法があります。
solidityを利用する方法もありますが、今回はクライアントサイドとコントラクトの相互作用をシミュレートするためのjavascriptと、truffleフレームワークにバンドルされているmochaというテストフレームワークと、chaiというassertionライブラリを利用します。
これらを利用することで、コントラクトのためのテストを行うことが可能になります。

まず、election.jsでスマートコントラクトをrequireします。
artifactsという部分は、コントラクトとの通信を抽象化しています。

つぎに、contractを宣言します。functionの引数にaccountsを渡すことで、開発環境のアカウントをテストのために利用できるようになります。

はじめにテストのために行うことは、ただしい数のcandidatesでcontractが初期化されることの確認です。

このcontractの中身は、mochaフレームワークから得られるものです。そして、assertの部分はchaiから得られるものです。

itからはじまる部分の、「Election.deployed().then(function(instance){}」の部分でインスタンスの取得をしています。ちょうど、truffleコンソールからcandidateのインスタンス情報を取り出すときに使用したコードと同じです。

それでは、テストを実行してみましょう。
ターミナルに
truffle test
を入力します。

Image from Gyazo

すると、このようにテストが成功していることがわかります。では、つぎに、assertのcountを3に変更してtruffle testしてみると、

Image from Gyazo

このようにエラーがでることがわかります。これにより、このテストは正常に動作していることが確認できます。

つぎに、テストして確認することは、candidatesが実際に正しい値で初期化されているかどうかです。
具体的には、名前、投票数、IDの値です。



var Election = artifacts.require("./Election.sol");

contract("Election", function(accounts){

    it("initializes with two candidates", function(){
        return Election.deployed().then(function(instance){
            return instance.candidatesCount();
        }).then(function(count){
            assert.equal(count,2);
        });
    });

    it("it initializes the candidadtes with the correct values", function(){
        return Election.deployed().then(function(instance){
            electionInstance = instance;
            return electionInstance.candidates(1);
        }).then(function(candidate){
            assert.equal(candidate[0],1,"contains the correct id");
            assert.equal(candidate[1],"Candidate 1", "contains the correct name");
            assert.equal(candidate[2], 0, "contains the correct votes count");
            return electionInstance.candidates(2);
        }).then(function(dandidate){
            assert.equal(candidate[0], 2,"contains the correct id");
            assert.equal(candidate[1],"Candidate 2", "contains the correct name");
            assert.equal(candidate[2], 0, "contains the correct votes count");
        });
    });
});

テストを走らせてみましょう。

Image from Gyazo

正しく動作しているとがわかりました。

今回はここまでです。

なお、ブロックチェーンについて本腰を入れて学びたいひとは、Udemyなどにたくさんよいレッスンがあったりします。ぜひUdemyでブロックチェーンと検索してみてください。

ではでは!

 - solidity, BlockChain