Reactのテストを mocha + nyc から Jestにしてみる


mocha + nycのころ

プロジェクト構成など

package.jsonはこんな感じ。

package.json
{
  "test": "NODE_ENV=test mocha test/",
  "coverage": "nyc -c npm test"
}
  • /srcにソースディレクトリ
  • /testにテストディレクトリ
  • MISC

mocha -> jestにするモチベーション

  • 興味本位
  • Jestがv15.0.0でAutomockingを捨てて本気を出してきたのでちょっと使ってみたかった気持ち
  • Railsプロジェクトにjavascriptプロジェクトを混ぜようとしたとき、mochaのテストディレクトリに悩んでしまうぐらいなら、Jestのテストフでやってみようかと思った
    • jestでは、/srcなどのコードに対して、/src/__tests__というディレクトリを作るか、some.test.jsという名前をつけるのがデフォルト設定になっている。
    • mochaでも設定によっては可能
  • coverage周りに感じた魅力

jestへのmigrate

package.jsonまわり

とりあえずmochaからの移動をまず考えるので、test/**/*.jsのような感じでテストディレクトリの指定を行う。
coverage入りなので、coverageコマンドも変える

package.json
{
  "scripts":{
    "test": "NODE_PATH=${npm_package_config_resolve} jest ",
    "coverage": "npm test -- --coverage",
  },
  "jest": {
    "testRegex": "test/.*.js"
  }
   :
}

test/mockみたいなところに非テストデータ入れてるならignorePatternを設定

  jest": {
    "testPathIgnorePatterns": ["node_modules", "test/mock"],
  }

テストのskip

2016/10/14追記:いつのまにか.skipが実装されていたようです。
https://facebook.github.io/jest/docs/api.html#basic-testing
https://github.com/facebook/jest/pull/1632

mochaだと.skipだった

describe('some test', () => {
  it.skip('skip')
})

jestだとxitxdescribeになる。

xdescribe('some test', () => {
  xit('skip')
})

空ファイルはエラーになる

Your test suite must contain at least one test.
xdescribe("todo", () => {
  xit("todo")
})
it("todo", () => {}

jsdomは消せる

jestにして嬉しいポイント

mochaだと色々頑張っていたが、既に入っているので気にしなくて良くなる
http://facebook.github.io/jest/docs/api.html#testenvironment-string

assertとexpect

標準ではexpectというmatcherが用意されており、そちらに重点が置かれている。
個人的にはassertを使っていきたいので、ちょっと不満ポイント。

assertも使えないわけではない。普通にthrowされればエラーとなる。

ただし、expect(foo) で書くとエラー時の表示がきれいになる。

このぐらい違う。
無理に全部置き換えるまででもないかなと思ったが、郷に入れば郷に従えで今後はexpectに置き換えていくだろうなと思う。

addMatchersなどあるのでもしかするとなんとかならないかなと思っているが未調査。

watchモード

jestにちょっと不満ポイント2。

mochaだと-wで良かった

$ mocha -w

jestは--watch
ちなみに-w--maxWorkersという値の省略になってしまっている。

$ jest --watch

しかしwatchモードの挙動自体は結構イケてる

感想

  • 移植自体は簡単
  • やはりReactとは相性がとても良い。
  • シンプルさというよりはフルスタックさに振っている感じがある
  • 並列でテストを走らせてくれているっぽい。
  • React以外のプロジェクトで普段使いするかというと、うーんという感じ。
  • 無理して移植するほどのメリットがあるかというと、そんな強くもない
    • とはいえ、そもそも移植コスト掛かってないので、興味があったらやってみてもいいと思う
  • Snapshotテストとか手出し始めたらまた感想変わるかも
  • なぜかCircle-CIでテストが遅くなっているので調査中
  • そこそこ大規模なReactプロジェクトで「テスト入れるぞ!」となったときの選択肢としては全然アリ
    • mochaでちょっとしんどかったjsdomまわり気にしなくていいのも大きい