Jest 25: 🚀 未来の基盤を築く
このページは PageTurner AI で翻訳されました(ベータ版)。プロジェクト公式の承認はありません。 エラーを見つけましたか? 問題を報告 →
Jest 25は将来の大規模な変更に向けた基盤を整えています。破壊的変更は最小限に抑えましたが、内部アーキテクチャの変更によりアップグレード時に注意が必要な場合があります。主な変更点は、JSDOMのv11からv15へのアップグレード、テスト実行速度の10-15%向上、スナップショット更新時の新しい差分表示、Node 6サポートの終了です。
Jest 24.9以降、80人以上のコントリビューターによる200件以上のコミットが行われました。詳細な変更点は変更履歴でご確認ください。
Node 6との別れ
Node 6は2019年4月30日でサポート終了となり、Jest 25ではサポートを終了します。これによりJSDOMのメジャーアップデート(v15)が可能になり、async-await構文のトランスパイルが不要になったことで、コード実行の高速化とメモリ消費量の削減が実現しました。さらにデバッグ時にもJestのトランスパイル済みコードが扱いやすくなっています。
Node 8もサポート終了していますが、移行を円滑にするためJest 25では引き続きサポートします。ただしJSDOM v16がNode 8をサポートしていないため、最新版を使用する場合はjest-environment-jsdom-sixteenの導入が必要です。
パフォーマンス改善
過去数バージョンで速度低下が報告されていましたが、Jest 25ではMicromatchのアップグレードにより起動時間が大幅に改善され、バグ修 正とパフォーマンスチューニングによりJest 23レベルの速度を回復しました。テスト実行時間は10-15%短縮されています。さらなる改善のため、以前のバージョンとの比較結果や問題点があればぜひお知らせください。
V8コードカバレッジ
現在のJestのカバレッジ計測はbabel-plugin-istanbulがコードを挿入して実装されていますが、大規模プロジェクトでは速度とメモリ効率に課題がありました。V8にはネイティブのカバレッジ機能があり、Benjamin Coe 氏とその他のV8およびNode.jsチームの尽力で実用性が向上しています。Jest 25では実験的に--coverage-providerフラグでこの機能を利用可能です。詳細と注意点はドキュメントをご覧ください。
テスト失敗時の高速思考と低速思考
テスト失敗時のレポート解釈に時間がかかることは以下の妨げになります:
-
過去の経験からパターンを認識する「高速思考」
-
変更内容を分析し予期せぬ問題かどうか判断する「低速思考」
Jest 25ではJest 24で始まったマッチャー改善を完成させました:
-
.rejects、.resolves、.not修飾子を含む正確な説明文 -
期待値と実際の値の簡潔なラベル付けと整列
-
文字列比較時の差分部分のハイライト
-
変更行数カウントによる追加/削除の判別
これらの改善はJestのメンテナーであるMark Pedrotti氏が主導しました。期待値エラーの改善への貢献に感謝します。
スナップショットテスト失敗時の差分表示色
混乱を解消する最も顕著な変更が、スナップショットテスト失敗時の変更行表示色です:
-
- Snapshotの色が緑からマゼンタに変更 -
+ Receivedの色が赤からティール(シアン/アクア背景)に変更
スナップショットテストレポートの比較(左:変更前、右:変更後)
- 変更行数カウントでスナップショットの変更方向(行削除/追加)が直感的に把握可能

- 背景色が隣接する変更行の比較を視覚的に 支援

- 背景色により
toThrowテストのスナップショット更新判断が容易に

独自カラーを選んだ理由:
-
95%のユーザーがスナップショットテストと通常マッチャーのレポートを色で瞬時に識別可能
-
Jestの緑/赤とコードレビューの赤/緑の意味衝突を解決
-
赤/緑反転による「更新がデフォルト」という印象を避け、ローカルテスト失敗時の回帰調査を促す
マゼンタ(300°)からティール/シアン(180°)への色相差は色覚アクセシビリティに優れ、変更行の淡い背景色はライト/ダークテーマで一貫したコントラストを提供します。
コマンドラインツール開発者の方は#9132でアクセシビリティ改善のヒントを得られるでしょう。
ECMAScript Modulesサポート
Node 13でESMサポートが安定化したことを受け、Jestでもネイティブサポートの検討を開始しました。Jest 25ではjest.config.cjs/jest.config.mjs設定ファイルをサポートしますが、テストコードのESM利用には現時点でBabel/TypeScriptによるCJS変換が必要です。
使用予定のAPIはまだ実験段階のため、即時サポートは期待できません。Node.js Modulesチームが積極的に開発中であり、進捗を注視しながらフィードバックを提供予定です。実装状況はこのissueで追跡可能です。
その他の改善と更新
- Jestのコントリビューター数が1000人を突破。テスト体験向上に貢献してくださった皆様に感謝します。
コミュニティメンバーのJosh Rosenstein氏の貢献により、JestはtoBeGreaterThanなどの主要マッチャーでBigIntをサポートするようになりました。またbigintリテラルも追加設定なしでそのまま使用可能です。
-
Node 12以降で動作しなかった
--detect-leaks機能をJest 25で修正。 -
Jest 24のブログで発表されたTypeScriptリライトはJest 24.3で完了。個別コンポーネント利用時のIDE統合が強化されました。今後はモックの型システム連携改善を検討中です。こちらのissueでアイデアやPRをお待ちしています。またDefinitelyTypedの型定義を本体へ移行する予定です。
jest-diffパッケージがdiffLinesUnifiedやdiffStringsUnifiedなどの関数をエクスポートするようになりました。これらの関数には設定オプションがあり、他のアプリケーションが差分をカスタマイズした方法でフォーマットできるようになります。詳細とコード例については、Jestリポジトリ内の新しいREADME.mdファイルまたはパッケージリポジトリを参照してください。
コミュニティメンバーのWei An Yenの貢献により、Jestは非対称マッチャーがパスした際に期待値エラーでハイライト表示されなくなりました。これは非対称マッチャーに関する長年の課題でしたが、ついに解決され非常に喜ばしいことです。
Jestは2年連続でState of JSの最高満足度賞を受賞しました。コミュニティからのサポートに心から感謝しており、この勢いをさらに拡大し2020年をより良い年にできることを願っています!
今後の計画
Jestの設定は広範でやや扱いにくい面があります - 同じことをするのに少なくとも二つの方法があることが多く、しばしばそれ以上です。Jest 26では設定を凝縮し、より予測可能にすることを目指しています。詳細についてはこちらのissueを参照してください。
Jestを実行するための適切なプログラムAPIを提供し、IDEや他のツールへの統合を容易にする計画も進めています。最新の進捗についてはこちらのissueを参照してください。
2017年12月以来、Jestのフェイクタイマー実装としてLolexを追加するPRがオープンになっています。Jest 25ではパブリックAPIに追加しませんが、技術的にはサポートが含まれており、ユーザーがテストや実験を行えるよう公開方法を検討中です。これによりDateや現在Jestが扱っていない他のタイマー関数をモックできるようになります。これは実験的なものと見なされ、正式なAPIサポートは後のリリースで提供されます。最新状況はこちらのPRで確認してください。
楽しいテストを! 🃏
