チュートリアル: カスタムレポーターの作成

カスタムレポーターの作成

Mochaでは、`npm` を介してインストールできるカスタムレポーターを定義して使用できます。

例えば、`mocha-foo-reporter` がnpmレジストリに公開されている場合、`npm install mocha-foo-reporter --save-dev`でインストールし、`mocha --reporter mocha-foo-reporter`で使うことができます。

カスタムレポーターの例

すぐに始めたい場合は、カスタムレポーターの例を以下に示します。

// my-reporter.js

'use strict';

const Mocha = require('mocha');
const {
  EVENT_RUN_BEGIN,
  EVENT_RUN_END,
  EVENT_TEST_FAIL,
  EVENT_TEST_PASS,
  EVENT_SUITE_BEGIN,
  EVENT_SUITE_END
} = Mocha.Runner.constants;

// this reporter outputs test results, indenting two spaces per suite
class MyReporter {
  constructor(runner) {
    this._indents = 0;
    const stats = runner.stats;

    runner
      .once(EVENT_RUN_BEGIN, () => {
        console.log('start');
      })
      .on(EVENT_SUITE_BEGIN, () => {
        this.increaseIndent();
      })
      .on(EVENT_SUITE_END, () => {
        this.decreaseIndent();
      })
      .on(EVENT_TEST_PASS, test => {
        // Test#fullTitle() returns the suite name(s)
        // prepended to the test title
        console.log(`${this.indent()}pass: ${test.fullTitle()}`);
      })
      .on(EVENT_TEST_FAIL, (test, err) => {
        console.log(
          `${this.indent()}fail: ${test.fullTitle()} - error: ${err.message}`
        );
      })
      .once(EVENT_RUN_END, () => {
        console.log(`end: ${stats.passes}/${stats.passes + stats.failures} ok`);
      });
  }

  indent() {
    return Array(this._indents).join('  ');
  }

  increaseIndent() {
    this._indents++;
  }

  decreaseIndent() {
    this._indents--;
  }
}

module.exports = MyReporter;

このレポーターを使用するには、`mocha --reporter /path/to/my-reporter.js`を実行します。

さらに例については、組み込みのレポーターの実装が最適な場所です。統合テストも役立つ場合があります。

Base レポータークラス

Baseは「抽象」クラスです。コンソール固有の設定とユーティリティを含んでおり、組み込みレポーターで一般的に使用されます。組み込みレポーターの実装を参照すると、多くの場合、Baseの静的プロパティが参照されていることがわかります。

カスタムレポーターがBaseを拡張することは、多くの場合役立ちますが、必須ではありません。

統計情報

Mochaは、レポーターの`Runner`インスタンス(コンストラクターの最初の引数として渡される)に、StatsCollector型の`stats`プロパティを追加します。

イベント

レポーターは、`runner`(Runnerのシングルトンインスタンス)から発行されるイベントをリッスンする必要があります。

イベント名は、`Mocha.Runner`の`constants`プロパティからエクスポートされます。

定数イベント名イベント引数説明
EVENT_RUN_BEGINstart(n/a)実行が開始されます。
EVENT_RUN_ENDend(n/a)すべてのスイートテストフックの実行が完了しました。
EVENT_DELAY_BEGINwaiting(n/a)delayオプションが`true`の場合にのみ発行されます。`global.run()`が呼び出されるのを待っています。
EVENT_DELAY_ENDready(n/a)ユーザーが`global.run()`を呼び出し、ルートスイートが実行準備ができました。
EVENT_SUITE_BEGINsuiteSuiteスイート内のフックテストが実行されます。ネストされたスイートも含まれます。
EVENT_SUITE_ENDsuite endSuiteスイート内のフックテスト、およびネストされたスイートの実行が完了しました。
EVENT_HOOK_BEGINhookフックフックが実行されます。
EVENT_HOOK_ENDhook endフックフックの実行が完了しました。
EVENT_TEST_BEGINtestTestテストが実行されます。
EVENT_TEST_ENDtest endTestテストの実行が完了しました。
EVENT_TEST_FAILfailTest, Errorテストが失敗したか、例外をスローしました。
EVENT_TEST_PASSpassTestテストがパスしました。
EVENT_TEST_PENDINGpendingTestテストがスキップされました。
EVENT_TEST_RETRYretryTest, Errorテストが失敗しましたが、再試行されようとしています。`retry`オプションがゼロ以外の場合にのみ発行されます。

独自のレポーターでは、これらの定数を使用してください。これにより、Mochaの将来のバージョンとの互換性が確保されます。

すべての`Suite`コールバックは、Runnerが`EVENT_RUN_BEGIN`を発行するに実行されることに注意することが重要です。フックとテストは、Runnerが`EVENT_RUN_BEGIN`を発行したに実行されます。