Jest用のテストをそのままMochaで利用してみる


はじめに

Jestで大量のテストを処理した時に、メモリリークの蓄積がひどいことになってしまいました。

そこで mocha-ui-jest を使って、テストはそのままにMochaへ移行してみることにしました。

テストはTypescriptで書かれてるものとします。

mocha-ui-jest とは

Mochaは、TDD(describe/it/before/beforeEach)や、BDD(suite/test/suiteSetup/setup) などの書き方を切り替えられるようになっています。

mocha-ui-jestはそれをJestのスタイルに合わせてくれて、Jestで使ってるexpectを使えるようにしてくれます。

要するにexpectを使ってる程度の簡単なテストなら、Mochaでも使えるようにしてくれます。

jestオブジェクトはありませんが、jest.setTimeout()jest.retryTimes()くらいなら、Jest用のsetupファイルに追い出して対応できるかと思います。

手順

インストール

まずは必要なモジュールをインストールします。

npm i -D mocha mocha-ui-jest ts-node tsconfig-paths cross-env

tsconfig.jsonの書き換え

typesmocha-ui-jestなどを追加します。

"types": ["mocha-ui-jest", "node"],

一部のテストのみでMochaを使いたい場合などは、Mocha用のtsconfigを用意してもいいでしょう。

tsconfig.mocha.json
{
  "extends": "./tsconfig",
  "compilerOptions": {
    "types": ["mocha-ui-jest", "node"]
  }
}

Mochaの設定ファイルを作る .mocharc.json

requiremocha-ui-jestを読み込んで、uijestを指定します。
tsconfig.jsonpathsを利用してる場合は、tsconfig-paths/registerrequireに追加してください。
それ以外の設定は各自のお好みでどうぞ。(mocha オプション)

.mocharc.json
{
  "require": ["mocha-ui-jest", "ts-node/register"],
  "ui": "jest",
  "reporter": "list",
  "parallel": true,
  "retries": 3,
  "timeout": 30000
}

タスクを追加

package.jsonscriptにタスクを追加します。
必要に応じて環境変数でts-nodeの設定をしてください。(ts-node オプション)
TS_NODE_FILES ― d.tsファイルを読み込ませる時に必要
TS_NODE_PROJECT ― tsconfig.jsonを指定する時に使う

  "mocha": "cross-env TS_NODE_FILES=true TS_NODE_PROJECT=tsconfig.mocha.json mocha \"test/**/*.test.ts\"",

実行

あとは実行するだけです。

npm run mocha

カバレッジをとる場合

少し試してみましたが、Mochaのparallelを無効化しないとダメでした。

nyc をインストール

npm i -D nyc

nycの設定

nyc.config.jsを作成します。

nyc.config.js
module.exports = {
  all: true,
  include: ['src/**/*.ts'],
  exclude: ['**/*.d.ts'],
  reporter: ['lcov', 'html', 'text'],
}

タスクを追加

package.jsonscriptにタスクを追加します。
parallelを無効化するために、--no-parallelを渡します。

  "mocha:coverage": "nyc npm run mocha -- --no-parallel",

実行

npm run mocha:coverage

まとめ

Jestでexpectを使ってる程度のテストなら、Mochaでもそのまま利用できることがわかりました。

Jestのテスト環境はなかなか特殊で、ある時突然地雷を踏んでしまうこともあるので、Mochaでもテストできる用意をしておくのはアリかもしれない。

リンク

mocha-ui-jest ― https://www.npmjs.com/package/mocha-ui-jest
mocha オプション ― https://mochajs.org/#command-line-usage
ts-node オプション ― https://github.com/TypeStrong/ts-node#cli-and-programmatic-options