당연하게도 우리가 작성/변경한 코드를 다시 한번 확인할 수 있습니다. 또한 테스팅에서 실패 결과가 나왔을 때, 코드 변경이 의도적이였는지 확인 할 수 있습니다. 다시 말해서 빠르게 에러를 파악할 수 있다습니다.
좋은 테스트 코드를 작성하는 법에 대해서는 다음에 다루도록 하겠습니다.
이번에는 AAA Pattern에 대해서만 알아보도록 하겠습니다.
AAA Pattern은 테스트 코드의 가독성을 높이고 코드를 이해하기 쉽게 해줍니다.
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);
});
이제 그러면 문제가 되는 add 함수를 수정해보도록 합시다!
export function add(numbers) {
let sum = 0;
for (const number of numbers) {
sum += +number;
}
return sum;
}
number 앞에 +를 붙여주면서 문자열을 숫자로 형변환 해주도록 수정하였습니다.
테스트 케이스를 모두 통과하는 것을 볼 수 있습니다.
테스트를 작성하는것은 상황에 맞게 작성이 되어야합니다. 얼마만큼의 테스트를 작성해야하는지는 정해지지 않았습니다.
코드를 작성하고 테스트를 진행한 뒤, 다시 코드를 작성하고 다시 테스트를 작성하는 작업이 필요합니다. 반복 수행의 결과로 좋은 테스트가 작성될 수 있습니다.