メインコンテンツへスキップ

SolidityとTruffleを使って、継続的統合を設定する

SolidityスマートコントラクトテストTruffleGanache
中級
Markus Waas
soliditydeveloper.com(opens in a new tab)
2020年6月5日
7 分の読書 minute read

Truffleを使用した継続的統合(CI)は、基本的なテストセットを実装してあれば、非常に有益な開発環境を提供します。 非常に長期的なテストを実行できるため、プルリクエスト(opens in a new tab)をマージする事前にすべてのテストに合格したことを確認でき、追加ツールを使って様々な統計を追跡することができます。

今回は、Truffle Metacoin Box(opens in a new tab)を使用して継続的統合を設定します。 以下の内容は、Travis CIまたはCircle CIを使って実行できます。

Travis CIの設定

Travis CI(opens in a new tab)は、簡単に追加できます。 プロジェクトのルートフォルダに、.travis.yml設定ファイルを追加するだけです。

1language: node_js
2node_js:
3 - 10
4
5cache: npm
6
7before_script:
8 - echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
9
10script:
11 - npm test
すべて表示

ここでは、Truffleで単体テストを実行する場合のみテストスクリプトが実行されるシンプルな状態にしておきましょう。 しかし、Travis CIマシンが利用できるブロックチェーンが存在しないという問題があります。 しかしこれは、テスト前にnpm install ganache-cliを実行するだけで解決できます。 具体的には、ganache-cli > /dev/nullのnpxコマンドを含むBashスクリプトをnpx truffle testの呼び出しの前に追加します。 こちら(opens in a new tab)でBashスクリプトの完全な例をご覧ください。

Circle CIの設定

CircleCi(opens in a new tab)では、より長い設定ファイルが必要になります。 Travisでは、自動でnpm ci(opens in a new tab)コマンドが追加されます。 これにより、npmのインストールよりも高速かつセキュアに依存関係をインストールできます。 ここでも、Travisの場合と同じスクリプトを使って、テストの前にganache-cliを実行します。

1version: 2
2
3aliases:
4 - &defaults
5 docker:
6 - image: circleci/node:10
7
8 - &cache_key_node_modules
9 key: v1-node_modules-{{ checksum "package-lock.json" }}
10
11jobs:
12 dependencies:
13 <<: *defaults
14 steps:
15 - checkout
16 - restore_cache:
17 <<: *cache_key_node_modules
18 - run:
19 name: Install npm dependencies
20 command: |
21 if [ ! -d node_modules ]; then
22 npm ci
23 fi
24 - persist_to_workspace:
25 root: .
26 paths:
27 - node_modules
28 - build
29 - save_cache:
30 paths:
31 - node_modules
32 <<: *cache_key_node_modules
33
34 test:
35 <<: *defaults
36 steps:
37 - checkout
38 - attach_workspace:
39 at: .
40 - run:
41 name: Unit tests
42 command: npm test
43
44workflows:
45 version: 2
46 everything:
47 jobs:
48 - dependencies
49 - test:
50 requires:
51 - dependencies
すべて表示

eth-gas-reporterプラグインを追加する

eth-gas-reporterプラグインは、スマートコントラクトの関数で発生するガス代を追跡する上でとても役立ちます。 このプラグインをCIに追加しておけば、プルリクエストを追加する際に差分を表示するためにも有益です。

ステップ1:eth-gas-reporterプラグインとcodechecksをインストールする

npm install --save-dev eth-gas-reporter
npm install --save-dev @codechecks/client

ステップ2:truffle-config.jsのmocha設定で、eth-gas-reporterプラグインを追加する

設定のオプションを確認してください。(opens in a new tab)

1module.exports = {
2 networks: { ... },
3 mocha: {
4 reporter: 'eth-gas-reporter',
5 reporterOptions: {
6 excludeContracts: ['Migrations']
7 }
8 }
9};
すべて表示
コピー

ステップ3:プロジェクトのルートディレクトリに、codechecks.ymlを追加する

1checks:
2 - name: eth-gas-reporter/codechecks

ステップ4:テストコマンドの後に、codechecksを実行する

- npm test
- npx codechecks

ステップ5:Codechecksのアカウントを作成する

以上です。 これで、プルリクエストでガス代の変化に対して素晴らしいレポートが表示されます。

ガスレポートの例

solidity-coverageプラグインを追加する

solidity-coverageプラグインを使用すると、コードパスのうちテスト対象に含まれる割合がどの程度か確認できます。 CI上で設定しておくと、非常に便利になります。

ステップ1:メタコインプロジェクトを作成し、カバレッジツールをインストールします。

npm install --save-dev truffle coveralls solidity-coverage

ステップ2:truffle-config.jsのプラグイン配列に、solidity-coverageを追加します。

1module.exports = {
2 networks: {...},
3 plugins: ["solidity-coverage"]
4}
コピー

ステップ3:.travis.ymlまたはCircle CI config.ymlに、カバレッジコマンドを追加します。

- npx truffle run coverage
- cat coverage/lcov.info | npx coveralls

Soidityカバレッジは、それ自体でganache-cliを開始しますので、ganache-cliをインストールする必要はありません。 ただし、カバレッジのganache-cliは動作が異なり、通常の単体テスト実行の代替とはならないため、通常のテストコマンドは置き換えないでください。

ステップ4:Coverallsにレポジトリを追加します。

  • Coveralls(opens in a new tab)のアカウントを作成します。
  • 作成したアカウントをGitHubリポジトリに追加します。
  • プルリクエストの作成に進んでください。

Coverallの例

追加のヒント

これで完了です。 開発環境において非常に有益な戦略であることが理解できたと思います。 完全な実例は、Truffle-CI-Example(opens in a new tab)で確認してください。 Circle-CIとTravisの両方共必要な訳ではないので、使わない方は確実に削除してください!

このチュートリアルは役に立ちましたか?