スマートコントラクトのテスト
このセクションでは、スマート・コントラクトのテスト方法を紹介する。 ブロックチェーン上の取引は元に戻せないため、スマート・コントラクトをデプロイする前にテストすることが重要だ。
トリュフを使ったテスト
Truffleは自動テストのフレームワークを提供する。 このフレームワークを使うと、シンプルで管理しやすいテストを2種類の方法で書くことができる: このフレームワークを使うと、シンプルで管理しやすいテストを2種類の方法で書くことができる:
Javascript
とTypeScript
では、アプリケーションと同じように、外界から契約を行使することができる。Solidity
では、前進、ベアトゥザメタル・シナリオで契約を行使する。
Getting started
ここでは、Truffleを使用したデプロイメント・ガイドに従ってコントラクトを作成し、デプロイします。 しかし、デプロイする前に、テストのためにコントラクトにセッター関数 setGreet
を追加する。 ソースコードを以下に示す。
**注:**テストのため、契約を一部変更しました。
以下は、KaiaGreetingの契約ソースコードです。
pragma solidity 0.5.6;contract Mortal { /* Define variable owner of the type address */ address payable owner; /* This function is executed at initialization and sets the owner of the contract */ constructor () public { owner = msg.sender; } /* Function to recover the funds on the contract */ function kill() public payable { if (msg.sender == owner) selfdestruct(owner); }}contract KaiaGreeter is Mortal { /* Define variable greeting of the type string */ string greeting; /* This runs when the contract is executed */ constructor (string memory _greeting) public { greeting = _greeting; } /* Main function */ function greet() public view returns (string memory) { return greeting; } /* Newly added function for testing. */ function setGreet(string memory _greeting) public { // only owner can change greeting message require(msg.sender == owner, "Only owner is allowed."); greeting = _greeting; }}
1)greet()
関数が "Hello, Kaia "メッセージを正しく返すかどうか、2)setGreet()
関数が新しい挨拶メッセージを正しく設定し、所有者でないアカウントが挨拶を更新しようとすると元に戻るかどうかをテストする。
最初に、一般的なアサーションのためにChaiアサーション・ライブラリ(またはあなたが使用する別のアサーション・ライブラリ)をインストールし、スマート・コントラクトのアサーションのためにtruffle-assertionsライブラリをインストールします。
npm install --save-dev chai truffle-assertions
Writing test in Solidity
Solidity を使用したテストは、JavaScript を使用したテストよりも少し直感的です。 Solidity を使用したテストは、JavaScript を使用したテストよりも少し直感的です。 Solidity テスト契約は、JavaScript テストと一緒に .sol ファイルとして保存されます。
test
フォルダにTestKaiaGreeting.sol
というファイルを作成する。 Truffle には、テスト中にどのコントラクトとやり取りする必要があるかを検出する手段がないため、コントラクトを明示的に指定する必要があります。 これを行う一つの方法は、artifacts.require()
メソッドを使うことである。 Solidityテストの例を見てみよう:
pragma solidity ^0.5.6;import "truffle/Assert.sol";import "truffle/DeployedAddresses.sol";import "../contracts/HashMarket.sol";
- Assert :Assert.equals()
や
Assert.greaterThan()\`など、様々なテスト関数にアクセスできる。 - DeployedAddresses : 契約を変更するたびに、新しいアドレスに再デプロイする必要があります。 このライブラリを通じて、デプロイされた契約アドレスを取得することができる。 このライブラリを通じて、デプロイされた契約アドレスを取得することができる。
では、テストコードを書いてみよう。
pragma solidity ^0.5.6;import "truffle/Assert.sol";import "truffle/DeployedAddresses.sol";import "../contracts/KaiaGreeter.sol";contract TestKaiaGreeter { function testGreetingMessage() public { // DeployedAddresses.KaiaGreeter() handles contract address. KaiaGreeter greeter = KaiaGreeter(DeployedAddresses.KaiaGreeter()); string memory expectedGreet = "Hello Kaia"; string memory greet = greeter.greet(); Assert.equal(greet, expectedGreet, "greeting message should match"); }}
Solidity テストコードを実行します。
$ truffle test# OutputUsing network 'development'.Compiling your contracts...===========================> Compiling ./test/TestKaiaGreeter.sol TestKaiaGreeter 1) testGreetingMessage Events emitted during test: --------------------------- --------------------------- 0 passing (5s) 1 failing 1) TestKaiaGreeter testGreetingMessage: Error: greeting message should match (Tested: Hello, Kaia, Against: Hello Kaia) at result.logs.forEach.log (/Users/jieunkim/.nvm/versions/node/v10.16.0/lib/node_modules/truffle/build/webpack:/packages/core/lib/testing/soliditytest.js:71:1) at Array.forEach (<anonymous>) at processResult (/Users/jieunkim/.nvm/versions/node/v10.16.0/lib/node_modules/truffle/build/webpack:/packages/core/lib/testing/soliditytest.js:69:1) at process._tickCallback (internal/process/next_tick.js:68:7)
おっと、失敗した。 エラーメッセージError: greeting message should match (Tested: Hello, Kaia, Againstst: Hello Kaia)
を確認してみよう。 文字列メモリ expectedGreet = "Hello Kaia"_.∕
コードを修正して、もう一度テストを実行してください。
$ truffle test# OutputUsing network 'development'.Compiling your contracts...===========================> Compiling ./test/TestKaiaGreeter.sol TestKaiaGreeter ✓ testGreetingMessage (58ms) 1 passing (5s)
おめでとう! おめでとう! テストは合格だ。
Writing test in JavaScript
Truffle は、Mocha テストフレームワークと Chai アサーションライブラリを使用し、JavaScript テストのための強固なフレームワークを提供します。 JavaScriptテストは、より柔軟性があり、より複雑なテストを書くことができる。 JavaScriptテストは、より柔軟性があり、より複雑なテストを書くことができる。
それでは、test