VSCodeでJestを使う方法

採用はこちら

VSCodeでJestを使うには、プロジェクトにJestをインストールし、テストファイルを作成して実行するのが基本です。

JestはJavaScriptやTypeScriptで広く利用されているテストフレームワークで、関数の単体テストや非同期処理のテスト、モック、コードカバレッジの確認などに利用できます。

VSCodeにはJestそのものが標準搭載されているわけではありません。

そのため、まずNode.jsプロジェクトへJestを導入し、そのうえで必要に応じてVSCodeのJest拡張機能を追加するという流れになります。

VSCodeの拡張機能を利用すると、テスト結果の確認や個別テストの実行、デバッグなどをエディター上から行いやすくなります。

目次

Jestとは

JavaScriptやTypeScriptのテストに使えるフレームワーク

Jestは、JavaScriptやTypeScriptで作成したプログラムが期待どおりに動作するかを確認するためのテストフレームワークです。

たとえば、次のような関数があるとします。

function sum(a, b) {
  return a + b;
}

この関数に対して、

1 + 2 を実行した結果が3になる

という条件を自動で確認できます。

Jestでは、主に次のようなテストを実行できます。

  • 関数の戻り値の確認
  • オブジェクトや配列の比較
  • エラー発生の確認
  • Promiseやasync/awaitを使った非同期処理のテスト
  • モック関数のテスト
  • スナップショットテスト
  • コードカバレッジの測定

Reactなどのフロントエンド開発でも利用できます。

ただし、Reactコンポーネントの操作やDOMの確認については、JestだけでなくReact Testing Libraryなどを組み合わせることも一般的です。

VSCodeでJestを使うために必要な環境

Node.jsをインストールする

Jestを一般的なJavaScriptプロジェクトで利用する場合は、Node.jsとnpmを使用します。

VSCodeのターミナルを開き、次のコマンドを実行します。

node -v

続いて、

npm -v

を実行します。

それぞれバージョン番号が表示されれば、Node.jsとnpmを利用できる状態です。

Jest 30系ではNode.js 18以上が必要です。

ただし、新しく開発環境を構築する場合は、最低要件だけを満たす古いNode.jsを選ぶより、現在サポートされているNode.jsのLTS版を使用する方が安全です。

VSCodeでJest用プロジェクトを作成する

プロジェクトフォルダを作成する

例として、次の名前のフォルダを作成します。

jest-sample

VSCodeを起動し、

ファイル
↓
フォルダーを開く

から作成したフォルダを開きます。

npmプロジェクトを初期化する

VSCode上部のメニューから、

ターミナル
↓
新しいターミナル

を選択します。

ターミナルが開いたら、次のコマンドを実行します。

npm init -y

これにより、

package.json

が作成されます。

この時点では、プロジェクト構成はおおよそ次のようになります。

jest-sample/
└── package.json

Jestをインストールする

npmでJestを追加する

ターミナルで次のコマンドを実行します。

npm install --save-dev jest

短縮して、

npm install -D jest

としても構いません。

Jestは通常、本番環境で直接利用するライブラリではなく、開発時のテストに使用します。

そのため、dependenciesではなくdevDependenciesへ追加するのが一般的です。

インストール後は、

node_modules/
package-lock.json

などが作成され、package.jsonにもJestが追加されます。

{
  "devDependencies": {
    "jest": "インストールされたバージョン"
  }
}

実際のバージョン番号はインストール時期によって異なります。

Jestで最初のテストを書く

テスト対象のファイルを作成する

まず、

sum.js

というファイルを作成します。

function sum(a, b) {
  return a + b;
}

module.exports = sum;

この関数は、2つの値を受け取って合計を返します。

テストファイルを作成する

続いて、

sum.test.js

を作成します。

const sum = require('./sum');

test('1 + 2 は3になる', () => {
  expect(sum(1, 2)).toBe(3);
});

ここでは、

test()

を使ってテスト内容を定義しています。

基本形は次のとおりです。

test('テスト名', () => {
  // テスト内容
});

そして、

expect()

で実際の値を確認します。

expect(sum(1, 2)).toBe(3);

このコードは、

sum(1, 2)の結果が3か

を確認しています。

package.jsonにJestの実行コマンドを設定する

testスクリプトを変更する

package.jsonのscriptsを確認します。

初期状態では次のようになっていることがあります。

{
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  }
}

これを、

{
  "scripts": {
    "test": "jest"
  }
}

へ変更します。

これで、

npm test

だけでJestを実行できます。

VSCodeのターミナルからJestを実行する

npm testを実行する

VSCodeのターミナルで次のコマンドを実行します。

npm test

テストが成功すると、おおよそ次のような結果が表示されます。

PASS  ./sum.test.js
  ✓ 1 + 2 は3になる

Test Suites: 1 passed
Tests:       1 passed

PASSと表示されていれば、テストは成功しています。

テストが失敗する例

テストコードを次のように変更してみます。

expect(sum(1, 2)).toBe(4);

実際の結果は3なので、テストは失敗します。

Expected: 4
Received: 3

このように期待した値と実際の値を比較できるため、コードの問題を見つけやすくなります。

Jestが認識するテストファイル

.test.jsや.spec.jsを使う

Jestでは、一般的に次のようなファイル名がテストファイルとして利用されます。

sum.test.js
user.test.js
calculator.spec.js

そのため、初心者の場合は、

対象ファイル名.test.js

という形式にすると分かりやすいでしょう。

__tests__フォルダも利用できる

Jestでは、

__tests__

という名前のフォルダにテストファイルをまとめる方法もあります。

src/
├── sum.js
└── __tests__/
    └── sum.test.js

プロジェクトの規模やチームのルールに合わせて管理方法を選択できます。

describeで複数のテストを整理する

テストをグループ化する

テスト数が増えた場合は、

describe()

を利用すると分かりやすく整理できます。

const sum = require('./sum');

describe('sum関数', () => {
  test('1 + 2 は3になる', () => {
    expect(sum(1, 2)).toBe(3);
  });

  test('10 + 20 は30になる', () => {
    expect(sum(10, 20)).toBe(30);
  });
});

実行結果でも、

sum関数
 ├─ 1 + 2 は3になる
 └─ 10 + 20 は30になる

のようにテストの関係を把握しやすくなります。

Jestでよく使うMatcher

toBe

数値や文字列などを比較する場合によく使用します。

expect(2 + 3).toBe(5);

toBe()は厳密にはObject.isを使って比較します。

toEqual

オブジェクトや配列の内容を比較するときによく使用します。

expect({
  name: 'Taro',
  age: 20
}).toEqual({
  name: 'Taro',
  age: 20
});

オブジェクトや配列の内容を比較したい場合は、toEqual()を使う方が適しています。

toBeTruthy

真として評価される値かどうかを確認します。

expect(true).toBeTruthy();

toBeFalsy

偽として評価される値かどうかを確認します。

expect(false).toBeFalsy();

toContain

配列や文字列の中に特定の値が含まれているかを確認します。

expect(['HTML', 'CSS', 'JavaScript']).toContain('JavaScript');

toThrow

関数がエラーを発生させるか確認できます。

function errorFunction() {
  throw new Error('エラー');
}

test('エラーが発生する', () => {
  expect(() => errorFunction()).toThrow();
});

VSCodeのJest拡張機能を使う

Jest拡張機能をインストールする

Jestはターミナルだけでも利用できます。

しかし、VSCodeのJest拡張機能を追加すると、テストの実行や確認がしやすくなります。

VSCode左側の拡張機能アイコンを開き、

Jest

と検索します。

代表的な拡張機能としてvscode-jestがあります。

Jest本体とは別物

注意したいのは、VSCodeのJest拡張機能とJest本体は別物という点です。

基本的な関係は次のようになります。

プロジェクト
↓
Jest本体
↓
テスト実行

+

VSCode
↓
Jest拡張機能
↓
Jestを操作しやすくする

VSCodeへJest拡張機能を入れただけでは、プロジェクトにJestがインストールされたことにはなりません。

まず、

npm install -D jest

などでJest本体を利用できる状態にしておく必要があります。

参考サイト

vscode-jest を導入してテストの開発体験を向上させる – mizdra’s blog

VSCodeのTest ExplorerからJestを実行する

テスト一覧を表示できる

Jest拡張機能を利用すると、VSCodeのTestingビューにJestのテストが表示されます。

そこから、

  • すべてのテストを実行
  • テストファイル単位で実行
  • 1つのテストだけ実行
  • テストをデバッグ
  • カバレッジ付きで実行

といった操作ができます。

エディター上から個別テストを実行する

たとえば、

test('1 + 2 は3になる', () => {
  expect(sum(1, 2)).toBe(3);
});

のようなコードでは、テストの近くに実行ボタンが表示される場合があります。

これを利用すると、ターミナルへコマンドを入力しなくても特定のテストだけ実行できます。

JestをWatchモードで実行する

変更に応じて自動でテストする

開発中に便利なのがWatchモードです。

npx jest --watch

を実行すると、変更されたファイルに関連するテストを中心に再実行できます。

一方、

npx jest --watchAll

では、ファイル変更時にすべてのテストを実行します。

違いを整理すると次のとおりです。

--watch
→ 変更内容に関連するテストを中心に実行

--watchAll
→ 変更時にすべてのテストを実行

テスト数が多い大規模プロジェクトでは、--watchを利用した方が効率的な場合があります。

VSCode拡張機能のrunModeを使う

テストの自動実行方法を設定できる

現在のvscode-jestでは、runModeを使ってテストの実行方法を設定できます。

たとえば、

"jest.runMode": "watch"

のように設定できます。

代表的な実行モードとしては、

watch
on-demand
on-save

などがあります。

プロジェクトの規模や開発スタイルによって、自動テストと手動テストを使い分けるとよいでしょう。

特定のテストファイルだけ実行する

ファイル名を指定する

たとえば、

sum.test.js

だけを実行したい場合は、

npx jest sum.test.js

とします。

npmスクリプト経由なら、

npm test -- sum.test.js

でも実行できます。

テスト数が増えたプロジェクトでは、特定のファイルだけ実行すると確認時間を短縮できます。

特定のテスト名だけ実行する

-tオプションを使う

たとえば、

test('ユーザーを作成できる', () => {
  // テスト処理
});

というテストがある場合は、

npx jest -t "ユーザーを作成できる"

のように実行できます。

テスト数が多い場合に便利です。

VSCodeでJestをデバッグする

ブレークポイントを利用する

Jestのテストは、VSCodeのデバッグ機能と組み合わせて確認できます。

たとえば、

test('計算テスト', () => {
  const result = sum(10, 20);

  expect(result).toBe(30);
});

というコードで、

const result = sum(10, 20);

の行へブレークポイントを設定します。

Jest拡張機能からデバッグ実行すると、処理を途中で停止し、

  • 変数の値
  • コールスタック
  • スコープ
  • 処理の流れ

などを確認できます。

テストが失敗する原因を詳しく調べたい場合に便利です。

Jestでコードカバレッジを確認する

–coverageを使う

Jestでは、どの程度コードがテストされているかを確認できます。

npx jest --coverage

または、

npm test -- --coverage

を実行します。

結果には、主に次の項目が表示されます。

Statements
Branches
Functions
Lines

たとえば、

Statements : 100%
Branches   : 80%
Functions  : 100%
Lines      : 100%

のように確認できます。

カバレッジ100%でも十分とは限らない

注意したいのは、コードカバレッジが100%でも、必ずしも十分なテストが書かれているとは限らない点です。

すべての行が実行されていても、

境界値のテスト
異常系
入力値の組み合わせ
エラー処理

などが十分確認されていない場合があります。

カバレッジは、テスト品質を判断するための一つの指標として利用するのが適切です。

Jestで非同期処理をテストする

asyncとawaitを使う

Jestでは、Promiseやasync、awaitを利用した非同期処理もテストできます。

たとえば、次の関数があるとします。

async function getUserName() {
  return 'Taro';
}

module.exports = getUserName;

テスト側では、

const getUserName = require('./getUserName');

test('ユーザー名を取得できる', async () => {
  const name = await getUserName();

  expect(name).toBe('Taro');
});

のように書けます。

API通信やデータベース処理などを含むアプリケーションでは、非同期テストを利用する機会が多くなります。

Jestでモックを使う

jest.fn()でモック関数を作成する

外部APIやメール送信処理などを実際に動かしたくない場合は、モックが便利です。

const mockFunction = jest.fn();

mockFunction('hello');

expect(mockFunction).toHaveBeenCalled();

引数まで確認する場合は、

expect(mockFunction).toHaveBeenCalledWith('hello');

と記述できます。

Jestには複数のモック方法がある

Jestのモック機能には、

jest.fn()
jest.spyOn()
jest.mock()

などがあります。

jest.fn()はその中でも、モック関数を作成する基本的な方法です。

TypeScriptでJestを使う方法

TypeScriptでは追加設定が必要になる

JavaScriptだけでなくTypeScriptでもJestを利用できます。

ただし、TypeScriptをそのまま実行するためには追加設定が必要になる場合があります。

代表的な方法として、

Babel
ts-jest

などがあります。

ts-jestを使う方法

ts-jestを利用する場合は、たとえば次のようにインストールします。

npm install --save-dev jest typescript ts-jest

すでにTypeScriptを導入済みの場合は、typescriptを追加でインストールする必要はありません。

重要なのは、

TypeScriptなら必ずts-jestが必要

というわけではないことです。

プロジェクトによってはBabelなどを使ってTypeScriptを変換します。

TypeScriptでJestの型を利用する

@jest/globalsを使う

TypeScriptでは、

import { describe, expect, test } from '@jest/globals';

のようにJest APIをインポートして利用する方法があります。

import { describe, expect, test } from '@jest/globals';

function sum(a: number, b: number): number {
  return a + b;
}

describe('sum', () => {
  test('1 + 2 は3になる', () => {
    expect(sum(1, 2)).toBe(3);
  });
});

@types/jestを使う方法もある

プロジェクトによっては、

@types/jest

を利用して、testやexpectなどの型をグローバルに認識させる場合もあります。

どちらを使用するかは、プロジェクトの設定やコーディング方針によって異なります。

Jest 30系の型定義を利用する場合は、TypeScript 5.4以上が必要です。

jest.config.tsを使う場合の注意点

設定ファイル自体をTypeScriptで書く場合がある

Jestの設定ファイルを、

jest.config.ts

としてTypeScriptで記述することもできます。

ただし、Jest設定ファイル自体をTypeScriptとして読み込む場合、環境によってはts-nodeなどが必要です。

たとえば、

npm install --save-dev ts-node

を追加することがあります。

これは、

TypeScriptのテストコードを実行する設定

と、

jest.config.tsを読み込む設定

が別であるためです。

混同しないように注意しましょう。

ブラウザDOMをテストする場合

Jestのデフォルト環境はNode

Jest 30系では、デフォルトのテスト環境は、

node

です。

そのため、

document.createElement('div');

などのブラウザDOM APIを使用すると、

document is not defined

といったエラーが発生する場合があります。

jest-environment-jsdomを使う

ブラウザに近いDOM環境が必要な場合は、

npm install --save-dev jest-environment-jsdom

をインストールします。

そして設定ファイルで、

module.exports = {
  testEnvironment: 'jsdom',
};

のように指定します。

ReactなどブラウザDOMを扱うフロントエンドテストでは、特に重要な設定です。

ReactをJestでテストする場合

React Testing Libraryと組み合わせることが多い

Reactコンポーネントのテストでは、Jest単体ではなくReact Testing Libraryなどを併用するケースがあります。

役割を簡単に分けると、

Jest
↓
テストの実行
アサーション
モックなど

React Testing Library
↓
Reactコンポーネントの表示
DOM操作
ユーザー操作に近いテスト

という関係になります。

そのため、

Jest = React専用テストツール

ではありません。

JestはJavaScriptやTypeScript全般で利用できるテストフレームワークです。

Jestが動かない場合の確認ポイント

jest is not recognizedと表示される

ターミナルで、

jest

と直接実行していることが原因の場合があります。

プロジェクトへローカルインストールしている場合は、

npx jest

または、

npm test

を利用するとよいでしょう。

VSCodeのJest拡張機能が動かない

まずターミナルで、

npm test

が正常に実行できるか確認します。

拡張機能側の問題を調べる前に、Jest本体が正常に動いているか確認することが重要です。

テストファイルが認識されない

ファイル名が、

example.test.js

または、

example.spec.js

のようになっているか確認します。

Jestの設定を変更している場合は、testMatchやtestRegexなどの設定も確認します。

document is not definedと表示される

ブラウザDOMを利用しているのに、テスト環境がnodeになっている可能性があります。

その場合は、

jest-environment-jsdom

を導入し、

testEnvironment: 'jsdom'

を設定します。

VSCodeでJestを使うおすすめの構成

小規模なJavaScriptプロジェクトの場合

たとえば次のような構成にすると分かりやすいでしょう。

my-project/
├── src/
│   └── sum.js
├── tests/
│   └── sum.test.js
├── node_modules/
├── package.json
└── package-lock.json

package.jsonには、

{
  "scripts": {
    "test": "jest",
    "test:watch": "jest --watchAll",
    "test:coverage": "jest --coverage"
  }
}

のようにスクリプトを登録できます。

通常のテストを実行する

npm test

Watchモードで実行する

npm run test:watch

コードカバレッジを確認する

npm run test:coverage

毎回Jestのオプションを入力する必要がなくなるため、開発作業を効率化できます。

VSCodeでJestを使う基本的な流れ

VSCodeとJestを使った開発では、おおよそ次の流れになります。

VSCodeでプロジェクトを開く
↓
Jestをインストール
↓
実装コードを書く
↓
.test.jsや.spec.jsを書く
↓
npm testを実行
↓
失敗したテストを確認
↓
コードを修正
↓
再テスト
↓
必要に応じてカバレッジを確認

さらにVSCodeのJest拡張機能を追加すると、

コードを書く
↓
VSCode上からテスト
↓
失敗箇所を確認
↓
デバッグ
↓
修正

という流れをスムーズに進められます。

VSCodeとJestを組み合わせるメリット

コード作成からテストまでVSCode内で完結しやすい

VSCodeとJestを組み合わせる大きなメリットは、コード作成、テスト、デバッグを一つの開発環境内で行いやすいことです。

特にJest拡張機能を利用すると、

  • テスト一覧の確認
  • 個別テストの実行
  • テスト結果の表示
  • デバッグ
  • Watchモード
  • コードカバレッジの確認

などをVSCodeから操作できます。

VSCodeでJestを使う場合は最小構成から始めるのがおすすめ

初めてJestを利用する場合は、最初からTypeScriptやReact、複雑な設定ファイルを導入する必要はありません。

まずは、

npm install --save-dev jest

でJestをインストールし、

sum.test.js

のような簡単なテストファイルを1つ作成します。

そのうえで、

npm test

を実行し、Jestの基本的な仕組みを理解するとよいでしょう。

慣れてきたら、

VSCodeのJest拡張機能
Watchモード
デバッグ
コードカバレッジ
モック
TypeScript
jsdom
React Testing Library

といった機能を順番に追加していくと理解しやすくなります。

VSCodeとJestを組み合わせれば、テストの作成から実行、原因調査、修正までを効率よく進められるため、JavaScriptやTypeScript開発の品質向上に役立ちます。

以上、VSCodeでJestを使う方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次