JavaScript

JestでdataProvider(データプロバイダ)を使う方法

JestでdataProviderを使う方法まとめ
JestでdataProviderを使いたいんだけど、どうやってやるの?

 

今回はこういった疑問にお答えします。

この記事を読めばJestでdataProviderを扱えるようになるので、最後まで読んでいただけると幸いです。

JestでdataProvider(データプロバイダ)を使う方法

今回は、以下のような、二つの数の最小公倍数を求める処理のテストを実装しましょう。

const execute = (a, b) => {
  let d = b;
  
  while (d > 0) {
    d = a % b;
    a = b;
    b = d;
  }

  return a;
}

module.exports = execute;

 

この処理のテストを普通に実装すると、以下のようになります。

const execute = require('./sample');

describe('sample.js', () => {
  test('9と6の最大公約数は3になる', () => {
    expect(execute(9, 6)).toBe(3);
  });

  test('15と6の最大公約数は3になる', () => {
    expect(execute(15, 6)).toBe(3);
  });

  test('21と17の最大公約数は1になる', () => {
    expect(execute(21, 17)).toBe(1);
  });

  test('20と18の最大公約数は2になる', () => {
    expect(execute(20, 18)).toBe(2);
  });

  test('6と10の最大公約数は2になる', () => {
    expect(execute(6, 10)).toBe(2);
  });

  test('12707と14803の最大公約数は131になる', () => {
    expect(execute(12707, 14803)).toBe(131);
  });
});

 

もちろんこれでもいいのですが、共通部分をまとめることで、もう少しすっきりとDRYに書けそうです。

 

そこで使えるのが、今回紹介するdataProviderです。

 

JestでdataProviderを扱うには、以下の二つの方法があります。

 

describe.each

まずはdescribe.eachからです。

先ほどのテストをdescribe.eachを使う形で書き換えると、以下のようになります。

const execute = require('./sample');

describe('sample.js', () => {
  describe.each([
    [9, 6, 3],
    [15, 6, 3],
    [21, 17, 1],
    [20, 18, 2],
    [6, 10, 2],
    [12707, 14803, 131]
  ])('%iと%iの最大公約数は、', (a, b, expected) => {
    test(`${expected}になる`, () => {
      expect(execute(a, b)).toBe(expected);
    })
  })
});

 

describe.eachの引数の配列にデータパターンを登録し、その後に共通のテストを実装します。

配列の第一引数と第二引数の値がそれぞれ%iに代入され、第一、第二、第三引数の値がそれぞれa、b、expectedに代入されます。

 

このテストを回すと、結果は以下のようになります。

Jestでdescribe.eachを使った結果

 

それぞれのデータパターンでテストを実行できていることが分かるでしょう。

 

test.each

test.eachを使って先ほどのテストを書き直すと、以下のようになります。

const execute = require('./sample');

describe('sample.js', () => {
  test.each([
    [9, 6, 3],
    [15, 6, 3],
    [21, 17, 1],
    [20, 18, 2],
    [6, 10, 2],
    [12707, 14803, 131]
  ])('%iと%iの最大公約数は%iになる', (a, b, expected) => {
    expect(execute(a, b)).toBe(expected);
  })
});

 

配列の第一、第二、第三引数の値がそれぞれ%iとa、b、expectedに代入されます。

 

これを実行すると、結果は以下のようになります。

Jestでtest.eachを使った結果

 

describe.eachとtest.eachのどちらを使うべきか?

正直どちらでもいいです。

個人的には、ターミナルに出るテスト結果が、describe.eachを使う方が読みやすいので、こちらを使っています。

 

どちらを使うべきかで何かご意見をお持ちの方がいれば、コメントで教えていただけると幸いです!

 

JestでdataProvider(データプロバイダ)を使う方法 おわりに

今回は、JestでdataProviderを使ってテストをDRYに書く方法について解説しました。

Jestでは、以下のいずれかを使うことでdataProviderを実現することができます。

 

dataProviderはテストの見通しを良くする上でとても有効な手法です。

適切な場所で使用することでJestでのテストをより良いものにしていきましょう。

 

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

この記事がJestでdataProviderを使ったテストを実行する上で少しでも参考になっていれば幸いです。

 

dataProviderの関連記事

PHPUnitでデータプロバイダを使う方法を解説【DRYなテスト】
PHPUnitでデータプロバイダを使う方法を解説【DRYなテスト】PHPUnitでデータプロバイダを使う方法を解説しました。...

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA