はじめに
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の書き換え
types
にmocha-ui-jest
などを追加します。
"types": ["mocha-ui-jest", "node"],
一部のテストのみでMochaを使いたい場合などは、Mocha用のtsconfigを用意してもいいでしょう。
{
"extends": "./tsconfig",
"compilerOptions": {
"types": ["mocha-ui-jest", "node"]
}
}
Mochaの設定ファイルを作る .mocharc.json
require
でmocha-ui-jest
を読み込んで、ui
でjest
を指定します。
tsconfig.json
のpaths
を利用してる場合は、tsconfig-paths/register
もrequire
に追加してください。
それ以外の設定は各自のお好みでどうぞ。(mocha オプション)
{
"require": ["mocha-ui-jest", "ts-node/register"],
"ui": "jest",
"reporter": "list",
"parallel": true,
"retries": 3,
"timeout": 30000
}
タスクを追加
package.json
のscript
にタスクを追加します。
必要に応じて環境変数で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
を作成します。
module.exports = {
all: true,
include: ['src/**/*.ts'],
exclude: ['**/*.d.ts'],
reporter: ['lcov', 'html', 'text'],
}
タスクを追加
package.json
のscript
にタスクを追加します。
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