リモートで働くブロックチェーンエンジニアのブログ

ブロックチェーン領域のエンジニアとして働いています。(Neutrino運営企業とは直接関係ありません)

solidity-coverageとTruffleを用いてSolidityのテストカバレッジを出力する

f:id:naomasabit:20191230023055p:plain

Solidityを書く時、テストカバレッジを出すツールにsolidity-coverageがあります。solidity-coverage自体は以前からあるツールですが、最新の書き方は少し変わっているので使い方を書いておきます。

バージョン

  • solidity-coverage : 0.7.0-beta.3

テストカバレッジを出せるsolidity-coverage

solidity-coverageというツールをTruffleと合わせて使うことで簡単にテストカバレッジを出せます。

github.com

こちらはTruffleBuidlerというマイグレーションツールにインテグレーションされています。

今回はTruffleを用いて利用する方法を記載します。

metacoinプロジェクトのテストカバレッジを出す

例として、truffleのチュートリアルプロジェクトであるmetacoinのコードについてテストカバレッジを出してみます。

github.com

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にアクセスすると以下のようなレポートが出力されています。

f:id:naomasabit:20191230022215p:plain
カバレッジレポート

MetaCoin.solを見ると if (balances[msg.sender] < amount) return false; の項目がカバーできていないと警告が出ています。

f:id:naomasabit:20191230022210p:plain
MetaCoin.solカバレッジレポート

送金者の残高を減らすような条件を持ったテストがないためでしょう。

まとめ

solidity-coverageでは簡単にテストカバレッジを出力できます。Configで色々な設定ができ、またCIなども組み込みができそうなので色々プロジェクトによって工夫はできそうですね。

github.com