Jest 30:より高速、より軽量、より優れたテストフレームワーク
このページは PageTurner AI で翻訳されました(ベータ版)。プロジェクト公式の承認はありません。 エラーを見つけましたか? 問題を報告 →
本日、Jest 30のリリースをお知らせできることを嬉しく思います。このリリースには、数多くの変更点、修正、改善が含まれています。Jest史上最大級のメジャーリリースの一つではありますが、メジャーリリースまでに3年もかかったことは確かに長すぎると認めます。 今後は、より頻繁にメジャーリリースを行い、次の10年にわたってJestを優れたものにしていくことを目指します。
最新情報を飛ばしてすぐに始めたい場合は、npm install jest@^30.0.0を実行し、移行ガイド「Jest 29から30へのアップグレード」に従ってください。
新機能
Jest 30は、明らかに高速化され、メモリ使用量が削減され、数多くの新機能が追加されました。まずは破壊的変更点から見ていきましょう:
破壊的変更
-
Node 14、16、19、21のサポートを終了しました
-
jest-environment-jsdomがjsdom 21から26にアップグレードされました -
TypeScriptの最低対応バージョンが5.4になりました
-
様々な
expectエイリアスが削除されました。eslint-plugin-jestには自動修正機能があり、コードベースを自動的にアップグレードできます -
列挙不可のオブジェクトプロパティが、デフォルトで
toEqualなどのオブジェクトマッチャーから除外されるようになりました -
Jestがデフォルトで
.mtsおよび.ctsファイルをサポートするようになりました -
--testPathPatternが--testPathPatternsに名称変更されました -
最初にrejectされ、後でcatchされるPromiseを適切に処理するようになり、誤検知のテスト失敗を防げるようになりました
-
スナップショットの更新が必要になる可能性がある、スナップショット出力の様々な改善を行いました。Googleがスナップショットで使用していた
goo.glリンクを非推奨化しました。私たちもこの変更を好ましく思っていませんが、すべてのスナップショットを更新する必要があります -
Jest本体がパッケージごとに単一ファイルにバンドルされるようになりました。これによりパフォーマンスが向上しますが、Jestの内部にアクセスするツールを構築している場合は問題が発生する可能性があります
これらはハイライトの一部です。破壊的変更の完全なリストは、CHANGELOGとJest 30移行ガイドで確認できます。
パフォーマンスとメモリ改善
Jest 30は、特にモジュール解決、メモリ使用量、テスト分離に関連する多くの最適化により、実際のパフォーマンス向上を実現します。新しいunrs-resolverを採用したことで、Jestのモジュール解決は機能が豊富になり、標準に準拠し、高速になりました。移行を担当してくれた@JounQinに感謝します。プロジェクトによっては、テスト実行時間が大幅に短縮され、メモリ消費量が削減されるでしょう。例えば、クライアントとサーバーを持つ大規模TypeScriptアプリケーションでは、コードベースの一部でテスト実行速度が37%向上し、メモリ使用量が77%削減されました:
| Jest 29 | Jest 30 | |
|---|---|---|
| Server tests | ~1350s / 7.8 GB max | ~850s / 1.8 GB max |
| Client tests | ~49s / 1.0 GB max | ~44s / 0.8 GB max |
Jest自体は高速ですが、Jestのテスト分離の特性上、ユーザーコードの遅延がパフォーマンス問題を悪化させ、テスト実行を遅くすることがよくあります。テストが未完了のタイマーや他のサービスへの接続などのオープンハンドルを残すと、Jestがハングしたり遅くなったりすることがあります。Jest 30ではこれらの問題を検出・報告する機能が強化され、遅いテストや問題のあるテストを特定・修正しやすくなりました。例えばHappoでは、オープンハンドルをクリーンアップしJest 30にアップグレードすることで、テスト時間が14分から9分に50%短縮されました。
複数のモジュールのエクスポートを単一ファイルに集約する(いわゆる「バレルファイル」)を使用している場合、babel-jest-boost、babel-plugin-transform-barrels、no-barrel-fileなどのツールを利用することをお勧めします。これにより各テストファイルで大量のアプリケーションコードが読み込まれるのを防げ、最大100倍のパフォーマンス向上が期待できます。
テストファイル間のグローバル変数クリーンアップ
Jestはテストファイル間の分離を、各テストを個別のVMコンテキストで実行することで実現し、各ファイルに新鮮なグローバル環境を提供します。しかし各テストファイルの実行後にグローバル変数が適切にクリーンアップされない場合、Jest全体でメモリリークが発生し、テスト実行が遅くなる可能性があります。Jest 30では、テスト実行後に正しくクリーンアップされていないグローバル変数を通知する新機能が導入されました。
将来的にはJestは各テスト実行後に自動的にグローバル変数をクリーンアップします。Jest 30でクリーンアップされていないグローバル変数の警告が表示されない場合、今すぐグローバル変数クリーンアップモードを"on"に設定してこの機能を完全に有効化でき、大幅なメモリ節約とパフォーマンス向上の恩恵を受けられます:
export default {
testEnvironmentOptions: {
globalsCleanup: 'on',
},
};
Jestのデフォルト設定はglobalsCleanup: 'soft'です。この機能を無効にするにはoffに設定できます。共有ユーティリティやキャッシュなど、特定のグローバルオブジェクトをクリーンアップから保護する必要がある場合は、jest-utilを使用して保護対象としてマークできます:
import {protectProperties} from 'jest-util';
protectProperties(globalThis['my-property']);
この機能の実装を提供してくれた@eyalrothに感謝します!
新機能
強化されたECMAScriptモジュール & TypeScriptサポート
JestでのネイティブESM使用時にimport.meta.*とfile://のサポートが追加されました。さらにJest設定ファイルをTypeScriptで記述できるようになり、.mtsおよび.ctsファイルは追加設定なしでネイティブサポートされます。NodeのネイティブTypeScript型除去機能を使用している場合、型を除去するTypeScriptトランスフォーマーの読み込みが不要になり、テスト実行が高速化されます。
スパイとusingキーワード
JestのスパイでJavaScriptの新しい明示的リソース管理構文(using)が使用可能になりました。環境がサポートしている場合、using jest.spyOn(obj, 'method')と記述するとブロック終了時にスパイが自動的に復元されるため、手動でのクリーンアップが不要になります。
test('logs a warning', () => {
using spy = jest.spyOn(console, 'warn');
doSomeThingWarnWorthy();
expect(spy).toHaveBeenCalled();
});

