Jestによる単体テスト解説
「Jestで単一のファイルをテストする方法」を日本語で解説
Jestは、Node.jsのテストフレームワークです。単一のファイルをテストするには、以下の手順に従います。
テストファイルの作成
- テストするファイルと同じディレクトリに、テストファイルを作成します。通常、テストファイルは
.test.js
または.spec.js
という拡張子で命名されます。
テストの記述
it
ブロックは、個々のテストケースのタイトルとテストの実行コードを指定します。describe
ブロックは、テストスイートのタイトルを指定します。- テストファイル内で、
describe
とit
ブロックを使用してテストケースを定義します。
モックの利用(必要に応じて)
- テスト対象のファイルが他のモジュールに依存している場合は、
jest.mock
を使用してモックを作成し、テストを独立させることができます。
テストの実行
- ターミナルで、プロジェクトのルートディレクトリに移動して、以下のコマンドを実行します。
jest filename.test.js
例
// filename.js
function add(a, b) {
return a + b;
}
// filename.test.js
const add = require('./filename');
describe('add function', () => {
it('should add two numbers correctly', () => {
expect(add(2, 3)).toBe(5);
});
});
この例では、filename.js
の add
関数をテストしています。テストケースは、add(2, 3)
が 5
を返すことを確認しています。
注意
- モックは、テスト対象のモジュールの依存関係を制御し、テストを独立させるために使用されます。
- テストケースは、独立していて、他のテストケースに依存しないように設計する必要があります。
expect
は Jest のアサーションライブラリで、テスト結果を検証するために使用されます。
Jestによる単体テストのコード例解説
コード例1:基本的なテストケース
// sum.js
function sum(a, b) {
return a + b;
}
// sum.test.js
const sum = require('./sum');
describe('sum function', () => {
it('should add two numbers correctly', () => {
expect(sum(2, 3)).toBe(5);
});
});
解説
- sum.test.js
sum.jsの関数をテストするファイルです。describe('sum function', () => { ... })
: テストスイートを定義します。このブロック内の全てのテストは、「sum function」に関するテストであることを示します。it('should add two numbers correctly', () => { ... })
: 個々のテストケースを定義します。このテストケースでは、sum関数が2つの数を正しく足し算できるかを確認します。expect(sum(2, 3)).toBe(5);
: 実際の計算結果と期待する結果を比較します。expect
はJestのアサーション関数で、toBe
は厳密な等価性を比較するマッチャーです。
- sum.js
足し算を行うシンプルな関数です。
コード例2:モックを用いたテスト
// fetchData.js
const axios = require('axios');
async function fetchData(url) {
const response = await axios.get(url);
return response.data;
}
// fetchData.test.js
jest.mock('axios');
const fetchData = require('./fetchData');
describe('fetchData function', () => {
it('should fetch data from the specified URL', async () => {
const mockData = { message: 'Hello, world!' };
axios.get.mockResolvedValue({ data: mockData });
const result = await fetchData('https://api.example.com');
expect(result).toBe(mockData);
});
});
- fetchData.test.js
jest.mock('axios');
: axiosモジュールをモック化します。これにより、実際のネットワークリクエストを送信せずに、テスト内でaxiosの挙動を制御できます。axios.get.mockResolvedValue({ data: mockData });
: axios.getメソッドの戻り値を事前に決めておきます。この例では、mockDataというオブジェクトを返すように設定しています。const result = await fetchData('https://api.example.com');
: fetchData関数を呼び出し、結果をresult変数に格納します。expect(result).toBe(mockData);
: 実際の戻り値が期待するmockDataと一致するかを確認します。
- fetchData.js
axiosライブラリを使って外部APIからデータを取得する関数です。
Jestを用いた単体テストでは、describe
とit
を使ってテストスイートとテストケースを定義し、expect
を使って実際の結果と期待する結果を比較します。モックを利用することで、外部の依存性を切り離し、テストをより制御しやすくすることができます。
ポイント
- 必要に応じてモックを利用して外部依存性を制御する
- 明確な名前のテストケースとテストスイートを作成する
- 各テストケースは、一つの機能または振る舞いのみを検証する
- テストケースは、独立して実行できるよう設計する
- カバレッジ
テストがコードのどの部分をカバーしているかを計測することで、テストの網羅性を確認できます。 - snapshotテスト
UIコンポーネントのレンダリング結果をスナップショットとして保存し、次回のテストで比較することで、意図しない変更を検出することができます。
より詳しく知りたい場合は、以下のキーワードで検索してみてください。
- Jest カバレッジ
- Jest スナップショットテスト
- Jest モック
- Node.js 単体テスト
- Jest テスト
Jest以外の単体テスト方法と比較
JestはNode.js環境で広く利用されている単体テストフレームワークですが、他にも様々なテストフレームワークが存在します。それぞれのフレームワークには特徴や得意とする領域があります。ここでは、Jest以外の代表的なテストフレームワークと、それぞれのメリット・デメリットについて解説します。
Mocha
- デメリット
- 設定が複雑になる場合がある
- Jestに比べると機能が限定的である場合がある
- メリット
- Jestよりも自由度が高く、カスタマイズしやすい
- 古くから存在するため、多くのコミュニティサポートがある
- 特徴
- フレキシブルで、様々なアサーションライブラリと組み合わせられる
- 非同期テストを扱いやすい
- BDDスタイル(Behavior Driven Development)のテスト記述に適している
Jasmine
- デメリット
- 機能が限定的である場合がある
- Jestに比べるとコミュニティの活気がやや劣る
- メリット
- 学習コストが低い
- BDDスタイルのテストを書きやすい
- 特徴
- BDDスタイルのテスト記述に特化している
- ブラウザ環境でも動作する
- Node.jsだけでなく、AngularやReactなどのフロントエンドフレームワークのテストにも利用できる
AVA
- デメリット
- コミュニティがまだ小さい
- メリット
- テスト実行が高速
- TypeScriptプロジェクトとの相性がいい
- 特徴
- 並列実行による高速なテスト実行
- TypeScriptをサポート
- シンプルなAPI
Jestとの比較
特徴 | Jest | Mocha | Jasmine | AVA |
---|---|---|---|---|
人気度 | 高い | 高い | 中程度 | 中程度 |
機能 | 豊富 | フレキシブル | BDDに特化 | シンプル |
スピード | 速い | 中程度 | 中程度 | 速い |
エコシステム | 充実 | 充実 | 中程度 | 小さい |
TypeScriptサポート | 良い | 良い | 良い | 良い |
どのテストフレームワークを選ぶかは、プロジェクトの規模、チームのスキル、求める機能などによって異なります。
- AVA
高速なテスト実行とTypeScriptサポートが特徴です。 - Jasmine
BDDスタイルのテストに特化しており、学習コストが低い点が魅力です。 - Mocha
自由度が高く、様々なプロジェクトに適用できます。 - Jest
幅広い機能と高いパフォーマンス、活発なコミュニティを持つため、多くのプロジェクトで採用されています。
どのフレームワークを選ぶべきか迷った場合は、以下の点を考慮してみてください。
- 求める機能
並列実行、カバレッジ計測、スナップショットテストなど、必要な機能が揃っているか - プロジェクトの規模
小規模なプロジェクトであればシンプルなフレームワーク、大規模なプロジェクトであれば豊富な機能を持つフレームワーク - チームのスキル
チームメンバーがどのフレームワークに慣れているか
- テストダブル
テスト対象の依存関係をモックやスタブで置き換えることで、テストを独立させ、テスト対象のコードに集中できます。 - カスタムマッチャー
各フレームワークでは、カスタムマッチャーを作成することで、独自の検証ロジックを実装できます。
さらに詳しく知りたい方へ
node.js jestjs