きり丸の技術日記

技術検証したり、資格等をここに残していきます。

JestでParameterizedTestを行う(異なるテストデータで同じ内容のテストを行う)

小ネタ。

Jestを使って、異なるテストデータで同じ内容のテストを行うParameterizedTestをやろうとしたときのメモ。なお、JestではParameterizedTestという名称では表現されていません。

なお、使い方自体は参考情報に乗せている公式を見てください。

環境

  • Jest
    • 27.2

ゴール

  • JestでParameterizedTestを行う

手順

describe.each(table)(name, fn, timeout)構文を使えば、ParameterizedTestを実装できます。たくさんオプションはありますが、公式の使い方で十分でしょう。

注意してほしいのは、Jestの次の書き方です。このObjectでテストデータと期待値を表現する方法は、Jestの27.0より実装されているので、Jestのバージョンが26.Xより前の場合は使えませんので気を付けてください。

// Jestの公式のソースコード。
describe.each([
  {a: 1, b: 1, expected: 2},
  {a: 1, b: 2, expected: 3},
  {a: 2, b: 1, expected: 3},
])('.add($a, $b)', ({a, b, expected}) => {
  test(`returns ${expected}`, () => {
    expect(a + b).toBe(expected);
  });

  test(`returned value not be greater than ${expected}`, () => {
    expect(a + b).not.toBeGreaterThan(expected);
  });

  test(`returned value not be less than ${expected}`, () => {
    expect(a + b).not.toBeLessThan(expected);
  });
});
# 出力されるログ
  .add(1, 1)
    ✓ returns 2
    ✓ returned value not be greater than 2 (1 ms)
    ✓ returned value not be less than 2
  .add(1, 2)
    ✓ returns 3
    ✓ returned value not be greater than 3
    ✓ returned value not be less than 3
  .add(2, 1)
    ✓ returns 3 (1 ms)
    ✓ returned value not be greater than 3
    ✓ returned value not be less than 3

テーブル形式のテストコード

仕様が複雑になると、仕様を一覧化して整理する必要があります。JestではParameterizedTestをテーブル形式で表現することもできます。私は、日付の前後関係や、権限関係をテストコードで整理する際、テーブル形式での表現をよく使用しています。

describe.each`
  a    | b    | expected
  ${1} | ${1} | ${2}
  ${1} | ${2} | ${3}
  ${2} | ${1} | ${3}
`('$a + $b', ({a, b, expected}) => {
  test(`returns ${expected}`, () => {
    expect(a + b).toBe(expected);
  });

  test(`returned value not be greater than ${expected}`, () => {
    expect(a + b).not.toBeGreaterThan(expected);
  });

  test(`returned value not be less than ${expected}`, () => {
    expect(a + b).not.toBeLessThan(expected);
  });
});
  1 + 1
    ✓ returns 2
    ✓ returned value not be greater than 2 (1 ms)
    ✓ returned value not be less than 2 (1 ms)
  1 + 2
    ✓ returns 3
    ✓ returned value not be greater than 3 (1 ms)
    ✓ returned value not be less than 3
  2 + 1
    ✓ returns 3
    ✓ returned value not be greater than 3 (1 ms)
    ✓ returned value not be less than 3

ソースコード

Jest公式をコピペしているだけです。

終わりに

Jestのバージョンが上がっていたことで、JestでのParameterizedTestが便利になりました。

テストの表示名をパラメータ名でマッピングできるようになっているので、失敗したときもエラーメッセージを確認すればInput/Outputを確認しやすいですね。

今後も、テストがしやすいようにいろんなライブラリの知識を勉強していきたいです。


この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。

参考情報

f:id:nainaistar:20210922173625p:plain