ava、jasmine、jest、mocha は、JavaScript コードの正しさを検証するためのテストフレームワークです。これらはテストの実行、アサーション(期待値との比較)、モック機能などを提供しますが、設計思想や必要な設定に違いがあります。jest は設定なしで始めやすく React エコシステムで標準的です。mocha は柔軟性が高くカスタマイズ自在です。jasmine は外部ライブラリ不要で動作します。ava は並列実行に優れています。
ava、jasmine、jest、mocha はすべて JavaScript コードの品質を保つためのテストツールですが、それぞれ得意とする場面と設計思想が異なります。開発者が直面する共通の問題に対して、これらがどうアプローチするかを比較します。
jest は test または it を使います。関数定義は標準的です。
// jest: 基本的なテスト構文
test('足し算ができること', () => {
expect(1 + 1).toBe(2);
});
mocha は describe と it を使います。
// mocha: 基本的なテスト構文
describe('計算機能', () => {
it('足し算ができること', () => {
// assert や expect は別途導入が必要
expect(1 + 1).to.equal(2);
});
});
jasmine は describe と it を使います。
mocha に似ていますが、アサーション機能も内置されています。// jasmine: 基本的なテスト構文
describe('計算機能', () => {
it('足し算ができること', () => {
expect(1 + 1).toEqual(2);
});
});
ava は test を使います。
t オブジェクトを渡してアサーションを行います。// ava: 基本的なテスト構文
import test from 'ava';
test('足し算ができること', t => {
t.is(1 + 1, 2);
});
jest は expect を内置しています。
toBe, toEqual, toContain など)が使えます。// jest: 内置アサーション
expect(user.name).toBe('Alice');
expect(list).toContain('item');
mocha はアサーションライブラリを選びます。
assert (Node.js 内置) や chai を組み合わせて使います。// mocha + chai: 外部アサーション
expect(user.name).to.equal('Alice');
assert.include(list, 'item');
jasmine は expect を内置しています。
jest に似た構文ですが、機能はやや少なめです。// jasmine: 内置アサーション
expect(user.name).toEqual('Alice');
expect(list).toContain('item');
ava は t オブジェクトを使います。
t.is, t.deepEqual など明示的なメソッド名です。// ava: 内置アサーション
t.is(user.name, 'Alice');
t.true(list.includes('item'));
jest は強力なモック機能を持っています。
jest.fn() で関数を簡単にモックできます。// jest: 内置モック機能
const mockFn = jest.fn();
mockFn('arg');
expect(mockFn).toHaveBeenCalledWith('arg');
mocha はモックライブラリが必要です。
sinon などを別途インストールして使います。// mocha + sinon: 外部モック機能
const mockFn = sinon.mock();
mockFn('arg');
sinon.assert.calledWith(mockFn, 'arg');
jasmine は spy 機能を持っています。
jasmine.createSpy() でモック関数を作れます。// jasmine: 内置スパイ機能
const mockFn = jasmine.createSpy('spy');
mockFn('arg');
expect(mockFn).toHaveBeenCalledWith('arg');
ava はモック機能を提供していません。
sinon や testdouble などを組み合わせて使う必要があります。// ava + sinon: 外部モック機能
import sinon from 'sinon';
const mockFn = sinon.fake();
mockFn('arg');
t.true(mockFn.calledWith('arg'));
jest は Promise を自動的に検知します。
async/await をそのまま使えます。// jest: 非同期テスト
test('データ取得', async () => {
const data = await fetchData();
expect(data).toBeDefined();
});
mocha は Promise を返すことで判定します。
async/await が使えます。done コールバックを使う昔ながらの写法もサポートしています。// mocha: 非同期テスト
it('データ取得', async () => {
const data = await fetchData();
expect(data).to.exist;
});
jasmine は Promise をサポートしています。
async/await が使えます。// jasmine: 非同期テスト
it('データ取得', async () => {
const data = await fetchData();
expect(data).toBeDefined();
});
ava は Promise を返すことを必須としています。
async 関数にするか Promise を返す必要があります。// ava: 非同期テスト
test('データ取得', async t => {
const data = await fetchData();
t.truthy(data);
});
jest はテストファイルを並列実行します。
// jest: 設定不要で並列実行
// jest --workers=4 のように指定可能
mocha は基本的に直列実行です。
mocha-parallel-tests などの拡張が必要です。// mocha: 基本は直列
// 並列化には追加ツールが必要
jasmine は直列実行です。
// jasmine: 基本は直列
// 並列実行は標準ではサポートされていない
ava はテストケースを並列実行します。
// ava: デフォルトで並列実行
// 設定で simultaneos を変更可能
| 機能 | jest | mocha | jasmine | ava |
|---|---|---|---|---|
| 構文 | test / expect | describe / it | describe / it | test / t |
| アサーション | 内置 | 外部必要 (Chai など) | 内置 | 内置 |
| モック | 内置 (jest.fn) | 外部必要 (Sinon など) | 内置 (Spy) | 外部必要 |
| 実行 | ファイル並列 | 基本直列 | 基本直列 | ケース並列 |
| 設定 | 少なめ | 多い | 少なめ | 少なめ |
| 主な用途 | React/Frontend | Node.js/Custom | Angular/Legacy | Node.js/Tools |
jest は現代のフロントエンド開発 — 特に React や Vue — において最もバランスの取れた選択肢です。モックやスナップショット機能が内置されており、設定の手間なく始められるため、チームの生産性を高めます。
mocha は柔軟性を求める場合に適しています。アサーションやモックライブラリを自分で選べるため、既存の Node.js プロジェクトや特殊な要件がある環境で真価を発揮します。
jasmine は追加依存なしで完結したい場合や、Angular のレガシーコードを扱う場合に選択します。新しいプロジェクトでは jest や vitest の方が推奨されることが多いです。
ava はテスト実行速度を最優先する場合に向いています。並列実行モデルは独特ですが、大規模なテストスイートを持つ Node.js プロジェクトで威力を発揮します。
最終的な考え方: プロジェクトの規模とチームの慣れを考慮してください。迷った場合は jest を選ぶのが無難です。しかし、特定の要件(速度、柔軟性、依存関係の最小化)がある場合は、他のツールを検討する価値があります。
React や Vue など現代のフロントエンド開発では最初の選択肢です。モックやスナップショットテストが内置されており、設定の手間が少ないため生産性が高いです。コミュニティが大きく情報も見つかりやすいです。
テストの構成やアサーションライブラリを完全に制御したい場合に適しています。既存の Node.js プロジェクトや、特定の要件に合わせて細かく設定が必要な環境で使われます。柔軟性が高い分、設定は手動です。
外部ライブラリを追加せずにテストを書きたい場合や、Angular のレガシープロジェクトを維持する場合に選択します。現代の React や Vue プロジェクトではあまり使われません。BDD スタイルの構文が内置されています。
並列実行で速度を重視する場合や、シンプルな構文を好む Node.js プロジェクトに適しています。フロントエンドよりもバックエンドやツール開発で選ばれやすいです。設定ファイルがシンプルで、明示的なアサーションが必要なものに向いています。
🃏 Delightful JavaScript Testing
👩🏻💻 Developer Ready: Complete and ready to set-up JavaScript testing solution. Works out of the box for any React project.
🏃🏽 Instant Feedback: Failed tests run first. Fast interactive mode can switch between running all tests or only test files related to changed files.
📸 Snapshot Testing: Jest can capture snapshots of React trees or other serializable values to simplify UI testing.
Read More: https://jestjs.io/