アルゴリズムとかオーダーとか

仕事で勉強したことなどをまとめてます

Solidityのテストでカバレッジを計測する

Contractのセキュリティーを担保する上で、テストのカバレッジ率100%を目指すのは結構重要です。今回は、テストのカバレッジ率を出す方法についてまとめます。

今回使うツールはsolidity-coverageです。
github.com



solidity-coverageはtruffleと最初から連携可能なように作られています。
なのでtruffleのtestを準備しておけば、インストールするだけですぐに使えます。
ただしtruffleはグローバルインストールを前提としています。truffleをローカルインストールしている場合は後述する設定ファイルを準備する必要があります。
#以降はtruffleの環境と、truffle testをすでに生成済みの想定で説明しています。

1.インストール

npm i solidity-coverage

2.実行

node_modules/.bin/solidity-coverage

3. 結果をブラウザで確認する

結果は実行時にコンソール上に表示されますが、ブラウザからも確認出来ます。
solidity-coverageで生成されるcoverage/index.htmlを開くとこのように実行結果が表示されます。
f:id:y_nakajo:20180109163248p:plain

4. truffleをローカルインストールした環境で利用する

truffleをローカルインストールしている場合は、コンパイルとテストのコマンドを設定ファイルで指定する必要があります。
truffle projectのカレントディレクトリに.solcover.jsを以下の内容で生成することで実行できるようになります。
.solcover.js

module.exports = {
  compileCommand: '../node_modules/.bin/truffle compile',
  testCommand: '../node_modules/.bin/truffle test'
};

# solidity-coverage実行前にクリーンな環境をつくためにソースとか諸々を./coverageEnv/にコピーするので相対参照で書く場合には../しないといけません。

まとめ

truffleを前提としたツールもいろいろと出てきていて、truffleがContract開発のデファクトスタンダードになりつつ(すでになってる?)ありますね。

ちなみに、solidity-coverageはカバレッジ率を計測するために、元のコードのいろんな場所にEvent Logを仕込んだコードを生成して、そのコードを実行することでカバレッジを計測しています。そのため、Contractの実装によってはtruffle testは成功するけどsolidity-coverageは失敗するっていう状況も発生することに注意です。(というか僕は発生しました。。。)