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

Jest 22: 機能改善とカスタムランナー

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

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

本日、Jestの新たなメジャーバージョンを発表します。このリリースではJestのほぼすべての部分を改良し、より堅牢なテスト基盤を提供します。Jestコミュニティと協力して多岐にわたる変更を加え、皆様がJestからより多くの価値を引き出せるようにしました。また、カスタムランナー機能を実験段階から正式リリースへ移行するとともに、複数プロセス間での作業並列化を可能にする新パッケージjest-workerを追加しました。主要なハイライトを以下にまとめましたが、変更履歴(いつもながら膨大です)も必ずご確認ください。

Node 4 のサポート終了、JSDOM 11 へようこそ

今回のリリースでNode 4のサポートを終了します。主な理由は主要依存ライブラリであるJSDOMがサポートを終了したためです。Jestは今後JSDOM 11を標準搭載し、SVGのサポート改善、組み込みのrequestAnimationFrameURLおよびURLSearchParamsその他多くの機能を提供します。

カスタムランナー + jest-workerによる簡単な並列化

Jest 21でカスタムJestランナーのコンセプトを導入しました。それ以来、JestコアコントリビューターのRogelioがいくつかの有用なランナーを開発しています:他のフレームワークで書かれた既存テストが多いものの、Jestの機能を即座に活用したい場合は、jest-runner-mochaを確認してください。大規模なコードベースのリンターが必要な場合、Jest内でjest-runner-eslintを使用してeslintを実行すると、大幅な速度向上が得られる可能性があります

重いタスクの並列化(ファイル変換やファイルシステムクロールなど)をきめ細かく制御するため、この目的に最適な新ライブラリを設計しました。jest-workerという名前のモダンなPromiseベースのモジュールで、親しみやすいAPIを備えており、負荷の高い関数を子プロセスに委任できます。jest-workerは他のJestパッケージと同様にJestプラットフォームの一部であるため、Jest自体を使用しなくても自由に活用できます。詳細はドキュメントでご確認いただけます。

カスタムランナーとプラットフォームとしてのJestについて理解を深めたい方は、Reactive Conf 2017でのRogelioの講演Jest as a Platformをご覧ください。

テスト失敗時のコードフレーム表示

どのアサーションがテスト失敗の原因かを簡単に特定できるよう、アサーションのコンテキストを表示するコードフレームを追加しました。これにより自身のコードに集中できます。以下のテスト例をご覧ください:

test('some test', () => {
function someFunctionWhichShouldThrow() {
if (false) {
throw new Error();
}

return 'success!';
}

expect(someFunctionWhichShouldThrow).toThrow();
});

Jest 21では次のエラーが表示されていました:

Jest 21での失敗表示

Jest 22ではコードフレームを追加し、失敗したアサーションのより多くのコンテキストを提供します。またスタックトレースを整理し、これまで以上に不要な情報を削除しました。

Jest 22での失敗表示

非同期コードで発生するエラーのテスト簡素化

Promiseの拒否に対して、同期エラーと同様にtoThrowおよびtoThrowErrorMatchingSnapshotを使用できるようになりました。

async function throwingFunction() {
throw new Error('This failed');
}

test('asynchronous rejection', async () => {
await expect(throwingFunction()).rejects.toThrowErrorMatchingSnapshot();
});

非同期テスト環境

Google Chromeチームが8月に発表したPuppeteer(実際のChromiumブラウザをプログラムで操作する方法)を利用し、Chrome上でテストを実行したいという多くの要望に応えるため、コミュニティの協力により非同期テスト環境の実現が可能になりました。現在も体験の改善を進めていますが、本日からJestでPuppeteerを使用する方法についてはこちらのガイドをご覧ください。

実験的なメモリリーク検出機能

Jestに実験的な--detectLeaks設定を追加しました。この機能はテスト実行後に内部環境インスタンスがリークしていないかを通知します。また、テスト終了後にテストスイートがファイルをrequireしようとした場合(すべての非同期操作を待機し忘れた、あるいは適切にクリーンアップされていないものが残っていることを意味します)も警告します。ただし、ユーザーランドコードのリークは検出できず、テストランドコードのみ対象となります(背後で使用されている技術jest-leak-detectorはユーザーコードの調査にも役立ちます)。Jestのメモリ使用量に関するバグを報告する際は、--detectLeaksでテストスイートが失敗する再現手順をご提供ください。より優れたサンドボックス機構の構築を始めていますが、デフォルトで有効化できる段階ではありません。協力いただける方はDiscordでご連絡ください!

ウォッチモードの改良

ウォッチモード使用時に以前失敗したテストのみに焦点を当てる機能が追加されました。このモードではJestは以前成功したテストを再実行せず、テスト失敗の解消に集中できます。さらにウォッチモードへのプラグインシステムを導入。設定のwatchPluginsにモジュールを追加することでウォッチモード機能を拡張できます。

Babel 7のサポート

Jestは内部でBabelを使用してカバレッジ計測や高度なモック機能を実現しています。Jest 22では次期バージョンBabel 7もサポートします。詳細はドキュメントをご覧ください。

モック関数の改善

Jest 22ではモック関数がさらに使いやすくなる変更を実施しました。まず、アサーション失敗時に有用なmockNameプロパティを追加(モックに名前を付けられます)。またJestモック関数をpretty-formatでシリアライズ可能にしたため、スナップショットテストが可能になりました。Jest 21ではexpect(jest.fn()).toMatchSnapshot()[Function]と出力されましたが、Jest 22では次のような出力になります:

test('my mocking test', () => {
const mock = jest.fn().mockName('myMock');

mock('hello', {foo: 'bar'});

expect(mock).toMatchSnapshot();
});

// Serializes to:

exports[`my mocking test 1`] = `
[MockFunction myMock] {
"calls": Array [
Array [
"hello",
Object {
"foo": "bar",
},
],
],
}
`;

Jest 21のハイライト

Jest 21は9月にリリースされましたが、残念ながらブログ記事を書く機会がありませんでした。バージョン21の主な変更点を簡潔にまとめます:

  1. ブラウザでのexpect/jest-mock利用: Michael Jackson氏が優れたexpectパッケージをJestプロジェクトに寄贈。これに伴いJestコアチーム(Kenneth Skovhus氏の多大な協力のもと)がjest-matchersexpectに改称)とjest-mockのブラウザ対応を実現。Jest自体はまだブラウザで使用できませんが、優れたアサーションとモック機能をMochaテスト内でChaiやSinonの代替として使用可能に。以前のexpectから新しいJest版expectへの移行はjest-codemodsで自動化できます。

  2. MITライセンス採用: JestのライセンスをMITに変更。やったね!

  3. 非同期エラーでのテストスイート失敗: Jestには非同期コードの特定部分でエラーが発生するとクラッシュするバグがありました。この問題はコミュニティコントリビューターによって修正されました。

  4. 高速化された起動処理: Jest 21では起動時間を50%以上高速化する調整を行いました。小さく高速なテスト実行時のJestのオーバーヘッドは常に課題でしたが、これがもはやJest採用の障礙となることはありません。

Jestコミュニティ

Jestコミュニティはテスト体験をさらに向上させるために活発に活動しています。以下は公式プロジェクトとは別の取り組みですが、私たちが特に注目しているプロジェクトをいくつか紹介します。

  • jest-image-snapshot – American Express開発者による画像スナップショット比較用カスタムマッチャー

  • ts-jest@kulshekharによるTypeScriptプロジェクトでJestを実行するための包括ソリューション

  • jest-codemods – 他のテストフレームワークからJestへ簡単に移行するツール

  • jest-plugins – Reactなど特定ツール向けのテスト環境構築簡素化や便利ユーティリティ提供に特化した新規コミュニティプロジェクト

また新たに高品質なJest拡張機能の拠点となるjest-communityをローンチしました。この新GitHub組織では、Jestメンテナーと協力者が選んだお気に入りプロジェクト(vscode-jestjest-extendedなど)が集約されています。eslint-plugin-jestも移管され、より迅速な独立リリースサイクルで素晴らしいコントリビューションが行われています。

Jest Community

単一組織下でのコミュニティプロジェクト運営は、自動リリースなどの実験にも最適です(webpackコミュニティのアイデアに感謝)。README形式の共通化などプロジェクト間でリソースを共有でき、全ユーザーの学習コスト低減と利用体験向上につながります。

素晴らしいプロジェクトをお持ちでしたら、ぜひお知らせください!こちらで紹介させていただきます。