Jestでテストを書こう
このチュートリアルでは、テストフレームワーク「Jest」を使い、ユニットテストをTypeScriptで書くことを学びます。
本章で学べること
本章では、簡単な関数のテストをJestで書くことを目標に、次のことを学びます。
- Jestを使ってTypeScriptの関数をテストする方法
- Jestの導入方法
- Jestでのテストの書き方
- テストの実行方法
- 結果の見方
本章の目的はJestを完全に理解することではありません。むしろ、Jestがどういったものなのか、その雰囲気を実際に体験することに主眼を置いています。そのため、内容はかなり最低限のものとなりますが、逆に言えば少しの時間でJestを試してみれるシンプルな内容にまとまってますから、ぜひ手を動かしてみてください。
Jestとは
JestはJavaScriptのテストフレームワークです。TypeScriptでテストを書くこともできます。Jestは、フロントエンドライブラリのReactやVueなどのテストだけでなく、Node.js向けのパッケージのテストも行えます。要するに、JavaScriptやTypeScriptで書かれたコードであれば、そのほとんどはJestでテストが行えます。
このチュートリアルに必要なもの
このチュートリアルで必要なものは次のとおりです。
- Node.js v16以上
- Yarn v1系 (このチュートリアルはv1.22.19で動作確認しています)
Node.jsの導入については、開発環境の準備をご覧ください。
パッケージ管理ツールとしてYarnを利用します。最初にインストールをしておきましょう。すでにインストール済みの方はここのステップはスキップして大丈夫です。
shell
npm install -g yarn
shell
npm install -g yarn
プロジェクトを作成する
まず、このチュートリアルに使うプロジェクトを作成します。
shell
mkdir jest-tutorialcd jest-tutorial
shell
mkdir jest-tutorialcd jest-tutorial
プロジェクトルートにpackage.jsonを作ってください。
shell
touch package.json
shell
touch package.json
package.jsonの内容は次のようにします。
package.jsonjson
{"name": "jest-tutorial","license": "UNLICENSED"}
package.jsonjson
{"name": "jest-tutorial","license": "UNLICENSED"}
TypeScriptのインストール
プロジェクトにTypeScriptをインストールします。
shell
yarn add -D typescript
shell
yarn add -D typescript
次に、tsconfig.jsonを生成します。
shell
yarn tsc --init
shell
yarn tsc --init
Jestをインストールする
Jestをプロジェクトにインストールしましょう。インストールが必要なパッケージは、次の3つです。
- jest
- ts-jest
- @types/jest
これらのインストールは次のコマンドで、一度にインストールできます。
shell
yarn add -D 'jest@^28.0.0' 'ts-jest@^28.0.0' '@types/jest@^28.0.0'
shell
yarn add -D 'jest@^28.0.0' 'ts-jest@^28.0.0' '@types/jest@^28.0.0'
jest
はJest本体です。JavaScriptだけのプロジェクトであれば、このパッケージを入れるだけでテストが始められます。ts-jest
は、JestをTypeScriptに対応させるためのものです。ts-jest
を入れると、TypeScriptで書いたテストコードを、コンパイルの手間なしにそのまま実行できるようになります。@types/jest
はJestのAPIの型定義ファイルです。TypeScriptの型情報を付与されるので、テストコードの型チェックが行えるようになります。
Jestの設定ファイルを作る
JestはそのままではTypeScriptを直接テストできません。なので、ここではJestでTypeScriptコードがテストできるように設定を加えます。
次のコマンドを実行すると、Jestの設定ファイルjest.config.js
が生成されます。
shell
yarn ts-jest config:init
shell
yarn ts-jest config:init
生成されたjest.config.js
の内容は次のようになります。
jest.config.jsts
/** @type {import("ts-jest/dist/types").InitialOptionsTsJest} */module .exports = {preset : "ts-jest",testEnvironment : "node",};
jest.config.jsts
/** @type {import("ts-jest/dist/types").InitialOptionsTsJest} */module .exports = {preset : "ts-jest",testEnvironment : "node",};
この@type
のコメントはエディターに型情報を与えるためのものです。これを書いておくことで、エディター上で入力補完が効くようになります。
チェックポイント
ここまでに作成したファイルに漏れがないか確認しましょう。
text
├── jest.config.js ... Jestの設定ファイル├── node_modules ... jestやtypescriptがインストールされたフォルダ├── package.json├── tsconfig.json ... TypeScriptの設定ファイル└── yarn.lock
text
├── jest.config.js ... Jestの設定ファイル├── node_modules ... jestやtypescriptがインストールされたフォルダ├── package.json├── tsconfig.json ... TypeScriptの設定ファイル└── yarn.lock
Jestが動くかを確認する
ここでは、実際のテストコードを書く前に、Jestでテストコードが実行できる状態になっているかを、動作確認用のテストファイルを作って確かめます。
Jestで実行できるテストファイルには命名規則があります。ファイル名が.test.ts
または.spec.ts
で終わるものが、テストファイルになります。動作確認用のファイルとして、check.test.ts
を作ってください。
shell
touch check.test.ts
shell
touch check.test.ts
check.test.ts
の内容は次のようにします。
check.test.tsts
test ("check", () => {console .log ("OK");});
check.test.tsts
test ("check", () => {console .log ("OK");});
ファイルを保存したら、jest
コマンドを実行してみてください。
shell
yarn jest
shell
yarn jest
すると、次のような結果が出るはずです。
結果にcheck.test.ts
が「PASS」と表示されていれば、テストファイルが実行されていることになります。
問題なく実行されていることが確認できたら、check.test.ts
は削除してください。
削除するコマンドshell
rm check.test.ts
削除するコマンドshell
rm check.test.ts
このチュートリアルでテストする関数
ここからは、TypeScriptのテスト対象コードを書いて、それをテストしていきます。
具体的には、次のような簡単な関数のテストを書くことを例に進めていきます。
ts
functionisZero (value : number): boolean {returnvalue === 0;}
ts
functionisZero (value : number): boolean {returnvalue === 0;}
このisZero
関数は、数値がゼロかどうかを判定するものです。
テスト対象のファイルを作る
まず、この関数を書いたファイルを作ります。ファイル名はisZero.ts
にしてください。
shell
touch isZero.ts
shell
touch isZero.ts
このファイルを作ると、プロジェクトのファイル構成は次のようになります。
text
├── isZero.ts ... テスト対象ファイル├── jest.config.js├── node_modules├── package.json├── tsconfig.json└── yarn.lock
text
├── isZero.ts ... テスト対象ファイル├── jest.config.js├── node_modules├── package.json├── tsconfig.json└── yarn.lock
isZero.ts
の内容は次のようにします。
isZero.tsts
functionisZero (value : number): boolean {returnvalue === 0;}// 注意: このままではテストできません。
isZero.tsts
functionisZero (value : number): boolean {returnvalue === 0;}// 注意: このままではテストできません。
このままではisZero
関数はテストできません。Jestでテストできるようにするには、関数をエクスポートする必要があります。関数をエクスポートするために、function
の前にexport
キーワードを追加してください。
isZero.tsts
export functionisZero (value : number): boolean {returnvalue === 0;}
isZero.tsts
export functionisZero (value : number): boolean {returnvalue === 0;}
テストコードを書く
上のisZero
関数をテストするコードを書きます。
Jestではテストコードはテスト対象と別のファイルに書きます。テストファイルを作りましょう。ファイル名は、テストしたいファイル名に、.test.ts
をつけたものにします。テスト対象ファイルがisZero.ts
なので、ここではisZero.test.ts
というファイル名にします。
shell
touch isZero.test.ts
shell
touch isZero.test.ts
このファイルを作ると、プロジェクトのファイル構成は次のようになります。
text
├── isZero.ts ... テスト対象ファイル├── isZero.test.ts ... テストコードのファイル├── jest.config.js├── node_modules├── package.json├── tsconfig.json└── yarn.lock
text
├── isZero.ts ... テスト対象ファイル├── isZero.test.ts ... テストコードのファイル├── jest.config.js├── node_modules├── package.json├── tsconfig.json└── yarn.lock
テスト対象の関数をテストコードで扱うには、まず関数をインポートする必要があります。import
文を使って、isZero
関数を読み込みましょう。
isZero.test.tsts
import {isZero } from "./isZero";
isZero.test.tsts
import {isZero } from "./isZero";
次に、1つ目のテストケースを追加します。このテストケースは、isZero
関数に0
を渡したらtrue
が返るかをチェックするものです。
isZero.test.tsts
import {isZero } from "./isZero";test ("0を渡したらtrueになること", () => {constresult =isZero (0);expect (result ).toBe (true);});
isZero.test.tsts
import {isZero } from "./isZero";test ("0を渡したらtrueになること", () => {constresult =isZero (0);expect (result ).toBe (true);});
Jestではexpect
関数とマッチャーを使い、結果が期待する値になっているかを記述します。マッチャーは、expect
関数の戻り値に生えているメソッドです。上の例では、toBe
がマッチャーになります。このメソッドの引数には期待値を書きます。上のテストケースでは、true
が期待値なので、toBe(true)
と記述しています。
toBe
マッチャーは、JavaScriptの厳密等価比較(===
)と同じです。したがって、expect(result).toBe(true)
は内部的にresult === true
かを評価します。もし、この評価が真なら、テストは合格します。逆に、偽ならテストは不合格となります。
マッチャーは、toBe
以外にもさまざまなものがあります。このチュートリアルでは細かく解説しないので、詳しく知りたい方は、公式ドキュメントのリファレンスをご覧ください。
テストを実行する
1つ目のテストケースができたので、Jestでテストを実行してみましょう。
shell
yarn jest
shell
yarn jest
テスト結果は次のように表示されていれば、テストの実行ができています。
テストケースを追加する
さらにテストケースを追加してみましょう。今度は、isZero
関数に1
を渡して、戻り値がfalse
になるかをチェックするケースを追加します。
isZero.test.tsts
import {isZero } from "./isZero";test ("0を渡したらtrueになること", () => {constresult =isZero (0);expect (result ).toBe (true);});test ("1を渡したらfalseになること", () => {constresult =isZero (1);expect (result ).toBe (false);});
isZero.test.tsts
import {isZero } from "./isZero";test ("0を渡したらtrueになること", () => {constresult =isZero (0);expect (result ).toBe (true);});test ("1を渡したらfalseになること", () => {constresult =isZero (1);expect (result ).toBe (false);});
テストケースを追加したら、再びJestを実行し、テストコードを走らせます。
shell
yarn jest
shell
yarn jest
今度は次のような結果になるはずです。
以上でJestを体験してみるチュートリアルは完了です。