メインコンテンツへスキップ

Jest 25: 🚀 未来の基盤を築く

· 1分で読める
Simen Bekkhus
Simen Bekkhus
非公式ベータ版翻訳

このページは 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の色が赤からティール(シアン/アクア背景)に変更

スナップショットテストレポートの比較(左:変更前、右:変更後)

  1. 変更行数カウントでスナップショットの変更方向(行削除/追加)が直感的に把握可能

スナップショットの行挿入例

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

スナップショットの行変更例

  1. 背景色により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で追跡可能です。

その他の改善と更新

コミュニティメンバーのJosh Rosenstein氏の貢献により、JestはtoBeGreaterThanなどの主要マッチャーでBigIntをサポートするようになりました。またbigintリテラルも追加設定なしでそのまま使用可能です。

  • Node 12以降で動作しなかった--detect-leaks機能をJest 25で修正。

  • Jest 24のブログで発表されたTypeScriptリライトはJest 24.3で完了。個別コンポーネント利用時のIDE統合が強化されました。今後はモックの型システム連携改善を検討中です。こちらのissueでアイデアやPRをお待ちしています。またDefinitelyTypedの型定義を本体へ移行する予定です。

jest-diffパッケージがdiffLinesUnifieddiffStringsUnifiedなどの関数をエクスポートするようになりました。これらの関数には設定オプションがあり、他のアプリケーションが差分をカスタマイズした方法でフォーマットできるようになります。詳細とコード例については、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で確認してください。

楽しいテストを! 🃏