[testing] unit test기초 , AAA Pattern

Yong·2022년 7월 29일
0

Testing

목록 보기
2/3

왜 테스팅을 하는가?

당연하게도 우리가 작성/변경한 코드를 다시 한번 확인할 수 있습니다. 또한 테스팅에서 실패 결과가 나왔을 때, 코드 변경이 의도적이였는지 확인 할 수 있습니다. 다시 말해서 빠르게 에러를 파악할 수 있다습니다.

어떻게 작성하는게 좋을까?

좋은 테스트 코드를 작성하는 법에 대해서는 다음에 다루도록 하겠습니다.
이번에는 AAA Pattern에 대해서만 알아보도록 하겠습니다.

AAA Pattern

AAA Pattern은 테스트 코드의 가독성을 높이고 코드를 이해하기 쉽게 해줍니다.

  • Arrange : 테스팅 환경과 값을 정의함
  • Act : 테스트 되어야할 코드를 실행함
  • Assert : 실행 결과값을 평가함 / 예상되어야 하는 결과 혹은 값에 부합하는지 비교
import { it, expect } from "vitest";

import { add } from "./math.js";

it("배열 안의 숫자를 모두 더함", () => {
  // Arrange - 가독성을 높이고, 바꾸기 쉽도록
  const numbers = [1, 2, 3, 4, 5];

  // Act
  const result = add(numbers);

  // Assert
  const expectedAssert = numbers.reduce(
    (prevValue, curValue) => prevValue + curValue,
    0
  ); // 항상 결과값을 알 수 없기때문에 변수로 선언
  expect(result).toBe(expectedAssert);
});

테스트를 심플하게 하자

테스트 케이스에 값을 많이 넣는다고 테스트하는 함수가 달라지지 않습니다. 단순히 함수가 의도대로 동작하지 알기 위해서는 테스트 코드를 심플하게 두는 것이 좋을 수 있습니다.
다른 개발자가 테스트 코드를 보았을 때도 쉽게 알 수 있어야 하고, 필요에 따라서 값이나 코드를 바꿀 수 있어야 합니다.

예제를 통해 테스트 해보자

export function add(numbers) {
  let sum = 0;

  for (const number of numbers) {
    sum += number;
  }
  return sum;
}

numbers라는 배열을 받아 요소를 더해주는 함수가 있습니다. 이 함수를 테스트 해보겠습니다.

먼저 숫자가 아닌 값을 넣었을때 NaN이 나오기를 기대하는 테스트 코드를 작성했습니다.

it("유효하지 않는 숫자가 제공되었을때 NaN이 발생해야한다", () => {
  const inputs = ["invalid", 1];

  const result = add(inputs);

  expect(result).toBeNaN();
});


결과는 '0invalid1'이 나왔습니다.

it("숫자 문자열을 가진 배열이 제공되었을때 올바른 sum 이 발생해야한다.", () => {
  const numbers = ["1", "2"];

  const result = add(numbers);

  const expectedAssert = numbers.reduce(
    (prevValue, curValue) => prevValue + +curValue,
    0
  );
  expect(result).toBe(3);
});
  • numbers배열의 요소가 숫자인 문자열일때 숫자로 변환해주는 코드를 작성했습니다.(문자열 앞에 +를 붙여주면 숫자로 변환됩니다)
  • 이 테스트의 결과는 '012'가 되면서 테스트 통과를 하지 못합니다. (3이 나와야 테스트 통과함)

이제 그러면 문제가 되는 add 함수를 수정해보도록 합시다!

export function add(numbers) {
  let sum = 0;

  for (const number of numbers) {
    sum += +number;
  }
  return sum;
}

number 앞에 +를 붙여주면서 문자열을 숫자로 형변환 해주도록 수정하였습니다.

테스트 케이스를 모두 통과하는 것을 볼 수 있습니다.

테스팅과 코딩을 반복하자

테스트를 작성하는것은 상황에 맞게 작성이 되어야합니다. 얼마만큼의 테스트를 작성해야하는지는 정해지지 않았습니다.
코드를 작성하고 테스트를 진행한 뒤, 다시 코드를 작성하고 다시 테스트를 작성하는 작업이 필요합니다. 반복 수행의 결과로 좋은 테스트가 작성될 수 있습니다.

profile
If I can do it, you can do it.

0개의 댓글