NodeJS 速習チュートリアル

Node.js テスティングフレームワーク

1. Node.js テスティングフレームワークの導入

テストは開発プロセスにおいて非常に重要な要素であり、Node.js アプリケーションの信頼性とメンテナンス性を確保するのに役立ちます。

このページでは、Node.js エコシステムで最も人気のあるテスティングフレームワークとツールを紹介し、プロジェクトに最適なツールを選択するためのヒントを解説します。

       注意: 優れたテスティングフレームワークは、実行速度が速く、役立つエラーメッセージを提供し、さまざまな種類のテスト(ユニット、統合、E2E)をサポートし、開発ワークフローにスムーズに統合できるものであるべきです。

2. 人気のテスティングフレームワーク

Node.js エコシステムで広く利用されている主要なテスティングフレームワークを紹介します。

2.1 Jest

Jest は、Facebook(現Meta)によって開発された、シンプルさに重点を置いた快適な JavaScript テスティングフレームワークです。
ほとんどの JavaScript プロジェクトにおいて、ゼロコンフィギュレーション(設定不要)でそのまま動作するテスティングプラットフォームです。

最適: 最小限のセットアップでフル機能のテストを行いたい場合。フロントエンドとバックエンド両方のテストに適しています。

インストール

npm install --save-dev jest

テストの例

// utils/math.js
function sum(a, b) {
  if (typeof a !== 'number' || typeof b !== 'number') {
    throw new Error('両方の引数は数値である必要があります');
  }
  return a + b;
}

function divide(a, b) {
  if (b === 0) {
    throw new Error('ゼロ除算は許可されていません');
  }
  return a / b;
}

module.exports = { sum, divide };

// __tests__/math.test.js
const { sum, divide } = require('../utils/math');

describe('算術ユーティリティ (Math utilities)', () => {
  describe('sum()', () => {
    it('2つの数値を正しく加算できること', () => {
      expect(sum(1, 2)).toBe(3);
      expect(sum(-1, 1)).toBe(0);
    });

    it('数値以外の入力に対してエラーを投げること', () => {
      expect(() => sum('1', 2)).toThrow('両方の引数は数値である必要があります');
    });
  });

  describe('divide()', () => {
    it('2つの数値を正しく除算できること', () => {
      expect(divide(10, 2)).toBe(5);
    });

    it('ゼロで除算したときにエラーを投げること', () => {
      expect(() => divide(10, 0)).toThrow('ゼロ除算は許可されていません');
    });
  });
});

主な機能

  • ゼロコンフィギュレーション: 最小限のセットアップですぐに動作します。
  • 高速かつ並列実行: パフォーマンス向上のため、テストを並列で実行します。
  • カバレッジ内蔵: コードカバレッジレポート機能が標準で搭載されています。
  • 優れたモッキング: 強力なモッキング機能を備えています。
  • スナップショットテスト: React などのフレームワークを使用した UI テストに最適です。
  • ウォッチモード: ファイルの変更を検知して自動的にテストを再実行します。

テストの実行

# すべてのテストを実行
npx jest

# ウォッチモードで実行
npx jest --watch

# 特定のパターンに一致するテストを実行
npx jest -t "math utilities"

# カバレッジレポートを生成
npx jest --coverage

2.2 Mocha

Mocha は、Node.js およびブラウザ上で動作する機能豊富な JavaScript テストフレームワークであり、非同期テストをシンプルかつ楽しく行えるように設計されています。

最適: 幅広いプラグインや統合ツールを組み合わせた、柔軟なテスト環境を構築したい場合。

インストール

npm install --save-dev mocha chai

テストの例

// test/math.test.js
const { expect } = require('chai');
const { sum, divide } = require('../utils/math');

describe('算術ユーティリティ (Math Utilities)', () => {
  describe('sum()', () => {
    it('2つの数値の合計を返すべき', () => {
      expect(sum(1, 2)).to.equal(3);
      expect(sum(-1, 1)).to.equal(0);
    });

    it('数値以外の入力に対してエラーを投げるべき', () => {
      expect(() => sum('1', 2)).to.throw('両方の引数は数値である必要があります');
    });
  });

  describe('divide()', () => {
    it('2つの数値を正しく除算すべき', () => {
      expect(divide(10, 2)).to.equal(5);
    });

    it('ゼロで除算したときにエラーを投げるべき', () => {
      expect(() => divide(10, 0)).to.throw('ゼロ除算は許可されていません');
    });
  });
});

主な機能

  • 柔軟性: 任意のアサーションライブラリ(Chai, should.js など)と組み合わせて動作します。
  • ブラウザサポート: ブラウザ上でテストを実行可能です。
  • 非同期サポート: 非同期コードのテストに対して優れたサポートを提供します。
  • 拡張性: プラグインやエクステンションの巨大なエコシステムが存在します。
  • テストカバレッジ: nyc などのツールと連携してカバレッジを測定できます。

テストの実行

# package.json に追加
"scripts": {
  "test": "mocha"
}

# テストを実行
npm test

# 特定のレポーター(表示形式)を指定して実行
npx mocha --reporter nyan

# カバレッジ付きで実行
npx nyc mocha

2.3 Vitest

Vitest は、Vite を搭載した次世代の超高速ユニットテストフレームワークです。Jest との互換性を持ちつつ、より高速な動作を実現するように設計されています。

最適: すでに Vite を使用しているプロジェクト、またはより高速なテスト実行を必要とするプロジェクト。

インストール

npm install -D vitest

テストの例

// math.test.js
import { describe, it, expect } from 'vitest';
import { sum, divide } from './math.js';

describe('算術ユーティリティ (Math Utilities)', () => {
  it('数値を加算できること', () => {
    expect(sum(1, 2)).toBe(3);
  });

  it('無効な入力に対してエラーを投げること', () => {
    expect(() => sum('1', 2)).toThrow('両方の引数は数値である必要があります');
  });
});

主な機能

  • 驚異的な速さ: Vite のネイティブ ESM を活用し、高速なテスト実行を実現します。
  • Jest 互換: Jest と同じ API を使用しているため、移行が容易です。
  • 強力な TypeScript サポート: 標準で TypeScript が快適に動作します。
  • ESM ファースト: ES Modules をネイティブにサポートしています。
  • ウォッチモード: スマートなテストフィルタリングを備えた超高速なウォッチモード。

3. フレームワーク比較表

フレームワークゼロコンフィギュレーション実行速度内蔵モックコードカバレッジ最適な用途
Jest✅ 対応高速✅ あり✅ 内蔵最小限のセットアップでフル機能のテスト
Mocha❌ 非対応高速❌ なし (Sinon 等が必要)❌ nyc 等が必要プラグインを多用する柔軟なテスト
Vitest✅ 対応非常に高速✅ あり✅ 内蔵Vite プロジェクト、ESM、TypeScript
Node.js Assert✅ 対応非常に高速❌ なし❌ カバレッジツールが必要依存関係のないシンプルなプロジェクト