Solidityを書く時、テストカバレッジを出すツールにsolidity-coverageがあります。solidity-coverage自体は以前からあるツールですが、最新の書き方は少し変わっているので使い方を書いておきます。
バージョン
- solidity-coverage : 0.7.0-beta.3
テストカバレッジを出せるsolidity-coverage
solidity-coverageというツールをTruffleと合わせて使うことで簡単にテストカバレッジを出せます。
こちらはTruffleやBuidlerというマイグレーションツールにインテグレーションされています。
今回はTruffleを用いて利用する方法を記載します。
metacoinプロジェクトのテストカバレッジを出す
例として、truffleのチュートリアルプロジェクトであるmetacoinのコードについてテストカバレッジを出してみます。
metacoinプロジェクトの作成
metacoinプロジェクトはunboxコマンドを打つことでgithub上からコードを取ってくることができます。
$ mkdir coverage-test $ cd coverage-test $ truffle unbox metacoin
truffleの通常プロジェクト構成ができているはずです。
$ ls LICENSE contracts migrations node_modules test truffle-config.js
solidity-coverageのインストール
solidity-coverageのインストールをします。
$ npm install --save-dev solidity-coverage@beta npm WARN deprecated istanbul@0.4.5: This module is no longer maintained, try this instead: npm WARN deprecated npm i nyc npm WARN deprecated Visit https://istanbul.js.org/integrations for other alternatives. ...
truffle-config.jsの追加
ERC1400はtruffleプロジェクトのディレクトリ構造になっています。直下には truffle-config.js
があります。
plugins: ["solidity-coverage"],
を追記します。
module.exports = { // Uncommenting the defaults below // provides for an easier quick-start with Ganache. // You can also follow this format for other networks; // see <http://truffleframework.com/docs/advanced/configuration> // for more details on how to specify configuration options! // networks: { development: { host: "127.0.0.1", port: 7545, network_id: "*" }, test: { host: "127.0.0.1", port: 7545, network_id: "*" } }, plugins: ["solidity-coverage"] // 追加 };
metacoinのカバレッジを出す
truffle run coverage
コマンドだけでレポートが出ます。ここのカバレッジは test/
ディレクトリにあるテストでカバーできている率を出力します。
結果は以下のようになります。statement, branch(if条件), 関数、行など各種カバレッジ率が出ています。
テストが通っていない行がある場合、 Uncovered Lines
にカバーできていない行番号が出力されます。
$ truffle run coverage -----------------|----------|----------|----------|----------|----------------| File | % Stmts | % Branch | % Funcs | % Lines |Uncovered Lines | -----------------|----------|----------|----------|----------|----------------| contracts/ | 90 | 50 | 100 | 100 | | ConvertLib.sol | 100 | 100 | 100 | 100 | | MetaCoin.sol | 88.89 | 50 | 100 | 100 | | -----------------|----------|----------|----------|----------|----------------| All files | 90 | 50 | 100 | 100 | | -----------------|----------|----------|----------|----------|----------------|
./coverage
ディレクトリにレポートも出力されています。
$ cd coverage $ ls base.css coverage-final.json lcov-report prettify.css sort-arrow-sprite.png contracts index.html lcov.info prettify.js sorter.js
index.htmlにアクセスすると以下のようなレポートが出力されています。
MetaCoin.solを見ると if (balances[msg.sender] < amount) return false;
の項目がカバーできていないと警告が出ています。
送金者の残高を減らすような条件を持ったテストがないためでしょう。
まとめ
solidity-coverageでは簡単にテストカバレッジを出力できます。Configで色々な設定ができ、またCIなども組み込みができそうなので色々プロジェクトによって工夫はできそうですね。