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

Jest 15.0:Jestの新たなデフォルト設定

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

このページは PageTurner AI で翻訳されました(ベータ版)。プロジェクト公式の承認はありません。 エラーを見つけましたか? 問題を報告 →

この1年間、私たちはJestを高速化し、設定を簡素化し、数多くの機能を追加し、スナップショットテストを構築してきました。しかし、CLI出力とユーザー体験という2つの領域にはほとんど注力してきませんでした。Jest 15では、フレームワークを根本的に変革し、初心者から上級ユーザーまでがより簡単に利用できるようにします。Jestへの投資が実を結び、Facebookとオープンソースコミュニティのために高速でフレームワークを改善できることを嬉しく思います。Jestの目標は「すぐに使える機能を備えること」と「最小限の設定で動作すること」です。この設計思想については、最近create-react-appのissueで説明する機会がありました。

最も重要な変更点は一連の新デフォルト設定です。既存のJestユーザーはJest 15への設定更新がほぼ必須となります。多くの場合、設定は簡素化され、アップグレード中にJestが有用なエラーメッセージを提供します。新しいデフォルトはすべて無効化できますが、無効化された機能も特定の状況では重要であり、Facebookでは長期的に使用・サポートを継続します。APIドキュメントもこれらの変更を反映して完全に書き直されました。Reactのこのプルリクエストには既存プロジェクトで必要な変更の一部が示されています。

新CLIエラーメッセージと要約表示

Jest内のJasmineを段階的に置換する取り組みの一環として、Jasmineマッチャーの置き換えがほぼ完了しました。各マッチャーのエラーメッセージを徹底的に調整し、テストが失敗した際(Jestが最大の価値を提供すべき瞬間)にユーザーへ最適な情報を伝達できるようにしました。期待値と実際の値の表示に加え、toBeおよびtoEqualマッチャーでは差分表示が追加され、間違いの発見を支援します。色表示も強化され、スタックトレース内の関連ファイルがより目立つよう強調表示されます。

明るいターミナルでの変更前後の比較: failure1 暗い配色でも良好に動作: failure2

新ウォッチコマンド

jest --watchを完全に書き換え、よりインタラクティブにしました。aまたはoキー押下で全テスト実行と変更ファイル関連テストの切り替えが可能に。pキーでテストパターン指定プロンプトが表示され、特定ファイルセットに焦点を当てられます。uキーでスナップショットテストを更新できます。

watch

jest-react-nativeの改善

ListViewTextInputActivityIndicatorScrollViewなどのモックが追加されました。既存モックは実際の実装を使用するよう更新されたため、Jest 15へのアップグレード時には既存スナップショットの更新がほぼ必須です。ネイティブコンポーネントのモック化に使用できるmockComponent関数がjest-react-nativeに追加されました:

jest.mock('MyNativeComponent', () => {
const jestReactNative = require('jest-react-native');
return jestReactNative.mockComponent('MyNativeComponent');
});

画像モック、フェッチモジュール、その他ネイティブAPI周りでも多数の改善が行われています。

バッファリングされたコンソールメッセージ

Jestはパフォーマンス最大化のためテスト実行をワーカー間で並列化します。以前はワーカーからのコンソールメッセージを親プロセスへ即時転送していました。並列テスト実行時、どのテストやモジュールがログ関数を呼び出しているのか特定が困難でした。Jest 15では全コンソールメッセージがバッファリングされ、個別のテスト結果と共に表示されます。さらにログ呼び出しのファイル名と行番号が表示されるため、コードの調査が容易になりました。

以前のJestとJest 15の出力比較: console

自動モックの無効化

Jestでは自動モック機能がデフォルトで無効化されました。これは新規ユーザーにとって最も混乱を招く機能であり、小規模プロジェクトでは多くの場合不要です。Facebookでは大規模な既存コードベースで単体テストを導入する際に自動モックが有効でしたが、時間の経過とともに、開発者がモック化/非モック化されたモジュールとの戦いに費やす時間が、通常のテスト作成時間を上回るようになりました。またライブラリ作者が常に手動で非モック化する必要のある基本モジュールを大量に必要とするケースも多々見受けられました。Jest自体のテストでも、大半で自動モックが手動で無効化されていました。明示的な自動モックは非常に価値があるものの、この変更により暗黙的モックからjest.mock(moduleName)呼び出しによる明示的モックへ移行します。

デフォルトで自動モックを利用したい場合は、設定でautomockオプションを有効化するか、テストファイル/setupファイル内でjest.enableAutomock()を手動で呼び出してください。

テストファイルパターン

すべてのユーザーが__tests__フォルダーでテストを管理しているわけではありません。Jest 15では.spec.jsまたは.test.jsで終わるファイルも検索対象に追加し、コミュニティで広く使われている2つの規約をサポートします。またtestDirectoryNametestFileExtensions設定オプションを廃止し、代わりにtestRegexオプションへの移行を推奨します。

モジュールレジストリの永続化

以前のJestは各テスト前に暗黙的に全モジュールをリセットし、モジュールのロードをbeforeEach内またはテスト内で行うよう推奨していました。これはモジュールにテスト間で共有すでないローカル状態がある場合に有効です。しかしESモジュールのトップレベルimport構文の普及と、ステートレス関数型モジュール作成の再興により状況が変化しました。

これにより多くの非互換性が発生。Facebook内でもこの暗黙的リセットを使用せず、エンジニアが制御権を持つjest.resetModules()の明示的呼び出しに依存していることが判明しました。

使用例:

const React1 = require('react');
jest.resetModules();
const React2 = require('react');

React1 !== React2; // These two are separate copies of React.

resetModules呼び出しはrequireキャッシュを消去します。同じモジュールを再度requireすると、そのモジュールと依存関係が新たにインスタンス化されます。この機能はjest-haste-mapのような副作用を持つモジュール扱いに特に有用です。

制御をユーザーに委ねるため暗黙的リセットを無効化しました。コード内でjest.resetModules()を使用するか、設定でresetModulesオプションを有効化することで以前の動作を復元できます。

リアルタイマー vs フェイクタイマー

従来JestはデフォルトでsetTimeoutprocess.nextTickなど全タイマー関数をモック化し、jest.runAllTimers()APIでプログラム的にタイマーを進めていました。テストで長時間のタイムアウトを待機したくない場合に有効です。

しかし実際にはユースケースが限定されていることが判明。非同期プログラミングもテストランナー内で大幅に簡素化されました。Jestは現在デフォルトでリアルタイマーを使用します。

設定で"timers": "fake"を指定するか、グローバルスイッチのjest.useRealTimers()jest.useFakeTimers()を呼び出すことでこの動作を変更可能です。

setupEnvScriptFile vs setupFiles

setupEnvScriptFile設定オプションは長らく非推奨でした。Jest 15で完全に削除され、代わりにsetupFilesが導入されます。このオプションはテストファイル実行前に順次ロードされるファイルパスの配列を受け取ります。

書き直されたカバレッジサポート

Jestのコードカバレッジ機能はjest --coverageで利用可能で、追加パッケージや設定は不要です。コードカバレッジサポートは完全に書き直され、新たにcollectCoverageFromオプションが追加されました。これによりテストされていないファイルも含むプロジェクト全体からカバレッジ情報を収集できます。このオプションはグロブパターンを使用している点にご注意ください。将来的には設定オプションをさらに簡素化し、正規表現に代わるシンプルな代替手段を提供する予定です。実装例はJestのpackage.jsonを参照してください。

その他の改善点

その他にも多数の改善が行われました:

  • 小規模なテスト実行のパフォーマンス向上

  • 単一のテストファイルのみ実行時は詳細モードが自動で有効化

  • 設定されたテスト環境を上書きする--envオプションを追加

  • moduleNameMapperが解決アルゴリズムを使用するよう変更

  • 括弧などの特殊文字を含むパスでも正常に動作するように改善

  • Node環境にglobal.globalを追加

  • ユーザー関数がmockという名前の場合に発生していたbabel-plugin-jest-hoistの誤検知を修正

  • testEnvironmentの解決ロジックを改善:{name}ではなくjest-environment-{name}を優先。これによりjsdomをテスト環境として使用時のモジュール衝突を防止

  • 統合テストとユニットテストを統合し、Jest自身のテストインフラを改善。Jest本体のコードカバレッジ収集を実現

コミュニティの協力を得て実現したこれらの変更を振り返り、今後数ヶ月でさらにJestを改善できることに大きな期待を寄せています。問題が発生した場合はイシューを報告し、プルリクエストもお待ちしています。

次回予告: Concurrent Reporter