Jestを使ってParameterized testを書いてみました。

Table of Contents

前提条件

本記事はNode.js v8以上がインストールされている前提で話を進めます。
また、Node.jsの説明はしません。

Parameterized test

Parameterized testはパラメータ化されたテストのことです。
テストケースごとに変わるパラメータと期待値を列挙することで、無駄な記述を減らすことができます。

通常のテストとの違いはこの後のセッションで説明します。

Jest

Facebookが開発しているJavaScriptのテストライブラリです。
TypeScriptにも対応しています。

実際に動かしてみましょう。

Nodeプロジェクトの作成

適当なディレクトリでプロジェクトを作成します。

$ npm init -y

Jestのインストール

Jestをインストールします。

$ npm i -D jest
$ npx jest --version
23.4.2

通常のテストを書く

公式サイトを参考のテストを書いてみましょう。

test.jsに以下のコードを記載します。

const sum = (x, y) => x + y

describe('sum returns', () => {
  test('1 + 2 -> 3', () => expect(sum(1, 2)).toBe(3));
  test('2 + 1 -> 3', () => expect(sum(2, 1)).toBe(3));
  test('2 + 2 -> 3', () => expect(sum(2, 2)).toBe(3));
})

npx jestを実行すると最後のテストだけが失敗すると思います。

SecurityError: localStorage is not available for opaque origins

バージョンによってはpackage.jsonに以下を追加しないとエラーになる場合があります。

  "jest": {
    "testEnvironment": "node"
  }

Parameterized testを書く

いくつかの方法からここではTableを使った書き方を紹介します。

const sum = (x, y) => x + y

describe.each`
first | second | expected
${1}  | ${2}   | ${3}
${2}  | ${1}   | ${3}
${2}  | ${2}   | ${3}
`("sum returns", ({first, second, expected}) => {
    test(`${first} + ${second} -> ${expected}`, () => expect(first + second).toBe(expected))
})

テストケースごとのパラメータと期待値をテーブルのように記述することができます。

テーブル内の値はテンプレートリテラル形式にする必要があるので注意してください。
${2}はint型の2です。文字列hogehogeを設定する場合は${"hogehoge"}とする必要があります。

通常の書き方より記述が増えているように見えるのは今回の例がシンプルだからです。
テストロジックが複雑になったりテストケースが増えれば、可読性・コード数の両面でメリットを感じるでしょう。

総括

Jestを使ってTable形式のParameterized testを書いてみました。
Table形式以外にも配列を流し込む方法もありますので、用途に応じて使い分けすることをオススメします。