IT/기초 지식

[Jest] test.each로 Parameterized test하기

개발자 두더지 2023. 3. 3. 22:17
728x90

일본의 한 블로그 글을 번역한 포스트입니다. 오역 및 의역, 직역이 있을 수 있으며 틀린 내용은 지적해주시면 감사하겠습니다.

 

  Jest로 함수의 인수를 여러개 패턴 체크하고 싶은 경우, 일일히 작성하는 방법 혹은 test.each로 테이블과 같은 형태로 기재하는 방법이 있다.  후자의 방법이 테스트의 가독성이 좋아지므로 추천한다. 그러므로 이번 포스팅을 통해서 소개하고자한다.

 

 

Jest의 test.each란?


 Jest에서 Parameterized test를 할 수 있는 메소드이다. 함수의 인수와 기대값을 여러개 부여할 수 있으며, Jest는 그것들을 모두 실행시켜준다. 예를 들면 다음과 같은 코드를 살펴보자.

test.each([
  [1, 1, 2],
  [1, 2, 3],
  [2, 1, 3],
])(".add(%i, %i)", (a, b, expected) => {
  expect(a + b).toBe(expected);
});

 배열을 이용하여 파라미터를 지정하는 것이 가능하며, Jest는 그 배열의 개수만큼 테스트를 반복한다. 이 방법으로 충분하지만 추천하는 표기법은 아래와 같은 테이블 형식이다.

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

 위 코드를 보면 알 수 있듯, 파라미터와 결과가 더욱 직관적으로 표현된다. 

 

 

비동기 처리에 대한 test.each


 비동기함수에 대해서도 test.each로 테스트할 수 있다. 예시 코드는 다음과 같다.

test.each`
  dueDate                | length
  ${"2019-10-01T00:00Z"} | ${0}
  ${"2020-01-07T00:00Z"} | ${0}
  ${"2020-01-08T00:00Z"} | ${1}
  ${"2020-01-09T00:00Z"} | ${2}
  ${"2020-01-10T00:00Z"} | ${3}
  ${"2021-01-01T00:00Z"} | ${3}
`(
  "OK: dueDate=$dueDate의 때, 엔티티를 $length건 획득했다.",
  async ({ dueDate, length }: { dueDate: string; length: number }) => {
    const connection = sqliteDbConnection.getConnection();
    if (!connection) throw new Error("cannot connect to test database.");

    const todoQueryService = new GqlTodoQueryService(connection);

    const result = await todoQueryService.allTodosWithDeadlineApproaching({
      dueDate: new Date(dueDate),
      daysBeforeWarning: 3,
    });

    expect(result.todos?.length).toBe(length);
  }
);

 DB에 액세스해서 조건에 매치하는 엔티티를 여러개 획득하는 함수를 테스트한다. 위와 같은 aysnc/await로 완료를 기다린 다음 실행 결과를 비교할 수 있다.


참고자료

https://qiita.com/suzukalight/items/41164c0312897cbf7541

728x90