T-CREATOR

Jest プラグイン・エコシステムのおすすめ 10 選

Jest プラグイン・エコシステムのおすすめ 10 選

Jest は JavaScript のテストフレームワークとして広く使われていますが、その真の力を発揮するのは豊富なプラグインエコシステムがあるからです。

実際の開発現場では、標準の Jest だけでは対応できない複雑なテストケースや、効率化したい作業がたくさんあります。そんな時に頼りになるのが、コミュニティが開発した優秀なプラグインたちです。

この記事では、実際の開発経験に基づいて、本当に使える Jest プラグインを厳選してご紹介します。エラー解決からパフォーマンス向上まで、あなたのテスト開発を次のレベルに引き上げるプラグインばかりです。

テスト環境の拡張プラグイン

Jest プラグインの基本概念と重要性について理解しましょう。プラグインは単なる機能追加ではなく、開発チーム全体の生産性を向上させる重要な要素です。

1. jest-environment-jsdom

DOM 操作をテストする際に必須となるプラグインです。React や Vue などのフロントエンドフレームワークをテストする際に、ブラウザ環境をシミュレートします。

bashyarn add --dev jest-environment-jsdom

Jest の設定ファイルで環境を指定します:

javascript// jest.config.js
module.exports = {
  testEnvironment: 'jsdom',
  setupFilesAfterEnv: ['<rootDir>/src/setupTests.js'],
};

実際のテスト例を見てみましょう:

javascript// UserProfile.test.js
import { render, screen } from '@testing-library/react';
import UserProfile from './UserProfile';

describe('UserProfile', () => {
  test('ユーザー名が正しく表示される', () => {
    render(<UserProfile name='田中太郎' />);
    expect(
      screen.getByText('田中太郎')
    ).toBeInTheDocument();
  });
});

2. @testing-library/jest-dom

DOM 要素のテストをより直感的に書けるようになるプラグインです。toBeInTheDocument()toHaveClass() などの便利なマッチャーを提供します。

bashyarn add --dev @testing-library/jest-dom

セットアップファイルで拡張機能を読み込みます:

javascript// src/setupTests.js
import '@testing-library/jest-dom';

実際の使用例:

javascript// Button.test.js
import { render, screen } from '@testing-library/react';
import Button from './Button';

describe('Button', () => {
  test('ボタンが正しくレンダリングされる', () => {
    render(<Button>クリックしてください</Button>);

    const button = screen.getByRole('button');
    expect(button).toBeInTheDocument();
    expect(button).toHaveTextContent(
      'クリックしてください'
    );
    expect(button).not.toBeDisabled();
  });
});

3. jest-extended

Jest の標準マッチャーを拡張し、より表現力豊かなテストを書けるようになります。配列やオブジェクトのテストが格段に楽になります。

bashyarn add --dev jest-extended

設定ファイルで拡張機能を有効にします:

javascript// jest.config.js
module.exports = {
  setupFilesAfterEnv: ['jest-extended/all'],
};

実際の使用例:

javascript// ArrayUtils.test.js
import { processArray } from './ArrayUtils';

describe('ArrayUtils', () => {
  test('配列が空でないことを確認', () => {
    const result = processArray([1, 2, 3]);
    expect(result).toBeArray();
    expect(result).not.toBeEmpty();
  });

  test('オブジェクトの構造を確認', () => {
    const user = { name: '田中', age: 30 };
    expect(user).toContainAllKeys(['name', 'age']);
    expect(user).toContainAllValues(['田中', 30]);
  });
});

カバレッジ・レポート系プラグイン

テスト品質を向上させるカバレッジツールは、コードの品質保証において重要な役割を果たします。単純な行カバレッジだけでなく、より詳細な分析が可能になります。

4. jest-sonar-reporter

SonarQube との連携を可能にするプラグインです。CI/CD パイプラインでテストカバレッジを自動的に SonarQube に送信できます。

bashyarn add --dev jest-sonar-reporter

Jest の設定でレポーターを追加します:

javascript// jest.config.js
module.exports = {
  reporters: [
    'default',
    [
      'jest-sonar-reporter',
      {
        outputDirectory: 'coverage',
        outputName: 'test-reporter.xml',
        reportedFilePath: 'relative',
      },
    ],
  ],
  collectCoverage: true,
  coverageDirectory: 'coverage',
  coverageReporters: ['text', 'lcov', 'html'],
};

実際のエラーと解決例:

bash# よくあるエラー
Error: Cannot find module 'jest-sonar-reporter'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:965:15)
    at Function.Module._load (internal/modules/cjs/loader.js:841:27)
    at Module.require (internal/modules/cjs/helpers.js:74:25)

解決方法:

bash# プラグインを再インストール
yarn remove jest-sonar-reporter
yarn add --dev jest-sonar-reporter

5. jest-html-reporter

HTML 形式で美しいテストレポートを生成するプラグインです。チーム内での共有や、テスト結果の可視化に非常に効果的です。

bashyarn add --dev jest-html-reporter

設定例:

javascript// jest.config.js
module.exports = {
  reporters: [
    'default',
    [
      'jest-html-reporter',
      {
        pageTitle: 'テストレポート',
        outputPath: './test-report.html',
        includeFailureMsg: true,
        includeConsoleLog: true,
      },
    ],
  ],
};

実際のレポート出力例:

html<!-- test-report.html の一部 -->
<div class="test-result">
  <h2>テスト結果サマリー</h2>
  <div class="summary">
    <span class="passed">✓ 通過: 45</span>
    <span class="failed">✗ 失敗: 2</span>
    <span class="skipped">- スキップ: 1</span>
  </div>
</div>

6. jest-coverage-badges

GitHub リポジトリにカバレッジバッジを自動生成するプラグインです。プロジェクトの品質を一目で確認できるようになります。

bashyarn add --dev jest-coverage-badges

package.json にスクリプトを追加:

json{
  "scripts": {
    "test:coverage": "jest --coverage",
    "test:badges": "jest-coverage-badges"
  }
}

実際の使用例:

javascript// jest.config.js
module.exports = {
  collectCoverage: true,
  coverageDirectory: 'coverage',
  coverageReporters: ['text', 'lcov', 'html'],
  coverageThreshold: {
    global: {
      branches: 80,
      functions: 80,
      lines: 80,
      statements: 80,
    },
  },
};

モック・スタブ系プラグイン

テストデータ管理を効率化するツールは、テストの保守性と信頼性を大幅に向上させます。複雑なモックの作成や管理が格段に楽になります。

7. jest-mock-extended

TypeScript プロジェクトで型安全なモックを作成できるプラグインです。型エラーを防ぎながら、強力なモック機能を提供します。

bashyarn add --dev jest-mock-extended

実際の使用例:

typescript// UserService.test.ts
import { mock, MockProxy } from 'jest-mock-extended';
import { UserRepository } from './UserRepository';
import { UserService } from './UserService';

describe('UserService', () => {
  let mockUserRepository: MockProxy<UserRepository>;
  let userService: UserService;

  beforeEach(() => {
    mockUserRepository = mock<UserRepository>();
    userService = new UserService(mockUserRepository);
  });

  test('ユーザーを正常に取得できる', async () => {
    const mockUser = {
      id: 1,
      name: '田中太郎',
      email: 'tanaka@example.com',
    };
    mockUserRepository.findById.mockResolvedValue(mockUser);

    const result = await userService.getUser(1);

    expect(result).toEqual(mockUser);
    expect(
      mockUserRepository.findById
    ).toHaveBeenCalledWith(1);
  });
});

よくあるエラーと解決方法:

typescript// エラー例
Type 'MockProxy<UserRepository>' is not assignable to type 'UserRepository'

// 解決方法:型アサーションを使用
let mockUserRepository = mock<UserRepository>() as UserRepository;

8. jest-when

条件付きモックを作成できるプラグインです。引数に応じて異なる戻り値を返す複雑なモックを簡単に実装できます。

bashyarn add --dev jest-when

実際の使用例:

javascript// OrderService.test.js
import { when } from 'jest-when';
import { PaymentGateway } from './PaymentGateway';
import { OrderService } from './OrderService';

describe('OrderService', () => {
  let mockPaymentGateway;
  let orderService;

  beforeEach(() => {
    mockPaymentGateway = {
      processPayment: jest.fn(),
      refundPayment: jest.fn(),
    };
    orderService = new OrderService(mockPaymentGateway);
  });

  test('支払い処理の成功と失敗をテスト', async () => {
    // 成功ケース
    when(mockPaymentGateway.processPayment)
      .calledWith({ amount: 1000, currency: 'JPY' })
      .mockResolvedValue({
        success: true,
        transactionId: 'txn_123',
      });

    // 失敗ケース
    when(mockPaymentGateway.processPayment)
      .calledWith({ amount: 0, currency: 'JPY' })
      .mockRejectedValue(new Error('Invalid amount'));

    // テスト実行
    const successResult = await orderService.processOrder(
      1000
    );
    expect(successResult.success).toBe(true);

    await expect(
      orderService.processOrder(0)
    ).rejects.toThrow('Invalid amount');
  });
});

パフォーマンス・最適化系プラグイン

テスト実行速度を向上させるツールは、開発効率に直結します。特に大規模プロジェクトでは、テスト時間の短縮が開発サイクル全体に大きな影響を与えます。

9. jest-runner-eslint

ESLint のチェックを Jest のテスト実行と並行して行うプラグインです。コード品質チェックを効率化できます。

bashyarn add --dev jest-runner-eslint

設定例:

javascript// jest.config.js
module.exports = {
  projects: [
    {
      displayName: 'test',
      testMatch: ['<rootDir>/src/**/*.test.js'],
      testEnvironment: 'jsdom',
    },
    {
      displayName: 'lint',
      runner: 'jest-runner-eslint',
      testMatch: ['<rootDir>/src/**/*.{js,jsx,ts,tsx}'],
    },
  ],
};

実際のエラー例と解決方法:

bash# よくあるエラー
Error: ESLint configuration not found

# 解決方法:.eslintrc.js ファイルを作成
javascript// .eslintrc.js
module.exports = {
  env: {
    browser: true,
    es2021: true,
    jest: true,
  },
  extends: [
    'eslint:recommended',
    '@typescript-eslint/recommended',
  ],
  parser: '@typescript-eslint/parser',
  parserOptions: {
    ecmaVersion: 12,
    sourceType: 'module',
  },
  plugins: ['@typescript-eslint'],
  rules: {
    'no-unused-vars': 'error',
    'no-console': 'warn',
  },
};

10. jest-watch-typeahead

テストファイルの検索機能を強化するプラグインです。大量のテストファイルがある場合でも、素早く目的のテストを見つけられます。

bashyarn add --dev jest-watch-typeahead

設定例:

javascript// jest.config.js
module.exports = {
  watchPlugins: [
    'jest-watch-typeahead/filename',
    'jest-watch-typeahead/testname',
  ],
};

実際の使用例:

bash# テスト実行時の検索機能
yarn test --watch

# ファイル名で検索
› Press a to run all tests.
› Press f to run only failed tests.
› Press p to filter by a filename regex pattern.
› Press t to filter by a test name regex pattern.
› Press q to quit watch mode.

まとめ

選定基準と使い分けのポイントについて、実際の開発経験に基づいてお伝えします。

プラグイン選定の優先順位

  1. 必須プラグイン: jest-environment-jsdom, @testing-library​/​jest-dom
  2. 品質向上プラグイン: jest-sonar-reporter, jest-html-reporter
  3. 開発効率プラグイン: jest-mock-extended, jest-when
  4. パフォーマンスプラグイン: jest-runner-eslint, jest-watch-typeahead

導入時の注意点とベストプラクティス

段階的な導入を心がける

一度に全てのプラグインを導入するのではなく、プロジェクトの規模と要件に応じて段階的に導入することをお勧めします。

javascript// 段階的導入の例
// Phase 1: 基本環境
module.exports = {
  testEnvironment: 'jsdom',
  setupFilesAfterEnv: ['<rootDir>/src/setupTests.js'],
};

// Phase 2: カバレッジ追加
module.exports = {
  // ... 既存設定
  collectCoverage: true,
  coverageDirectory: 'coverage',
};

// Phase 3: レポート追加
module.exports = {
  // ... 既存設定
  reporters: ['default', 'jest-html-reporter'],
};

チーム内での共有と教育

プラグインを導入する際は、チームメンバー全員が使い方を理解できるよう、ドキュメントの整備と勉強会の開催が重要です。

継続的な見直し

定期的にプラグインの使用状況を見直し、不要になったものは削除して、設定をシンプルに保つことを心がけましょう。

実際の開発現場では、これらのプラグインを組み合わせることで、テストの品質と開発効率を大幅に向上させることができます。特に、TypeScript プロジェクトや大規模なフロントエンドアプリケーションでは、これらのプラグインの恩恵を強く実感できるでしょう。

テストは開発の基盤となる重要な要素です。適切なプラグインを選んで導入することで、より自信を持ってコードを書けるようになり、チーム全体の開発体験が向上します。

関連リンク