Search

테스트 코드 리팩토링

아쉬운 점 반영하기

지난 3주 차에 아쉬웠던 부분으로 '테스트 코드 리팩토링에 신경 쓰지 못했던 것'을 꼽았기에 이번 4주 차는 테스트 코드에서 중복되는 부분을 최대한 줄이고자 했다.

반복되는 부분 찾기

그중 특정 금액 구간에서 배지가 잘 부여되는지를 검증하는 Badge 클래스 테스트를 리팩토링했다. 처음에는 각 금액을 기재해 총 네 가지 테스트 코드를 작성했다. 그런데 반복되는 부분이 있다고 생각해 이를 간소화해 보기로 했다.
// 리팩토링 전 import Badge from '../../src/model/Badge.js'; import { OUTPUT } from '../../src/common/constants.js'; describe('Badge', () => { test('5000원 이상에서 별 배지 부여', () => { const badgeInstance = new Badge(5000); expect(badgeInstance.assignBadge()).toBe('별'); }); test('10000원 이상에서 트리 배지 부여', () => { const badgeInstance = new Badge(10000); expect(badgeInstance.assignBadge()).toBe('트리'); }); test('20000원 이상에서 산타 배지 부여', () => { const badgeInstance = new Badge(20000); expect(badgeInstance.assignBadge()).toBe('산타'); }); test('5000원 미만이면 배지 없음', () => { const badgeInstance = new Badge(4999); expect(badgeInstance.assignBadge()).toBe(OUTPUT.none); }); });
JavaScript
복사

test.each( ) 사용

아래와 같이 'test.each' 구문을 사용해 테스트 케이스를 '일반화'했다. BADGES 배열은 테스트할 데이터(배지 이름과 금액 구간)를 포함하고, 이 데이터를 테스트에 사용한 것이다. 덕분에 세 가지 테스트 코드를 하나로 줄일 수 있었다.
// 리팩토링 후 import Badge from '../../src/model/Badge.js'; import { BADGES, OUTPUT } from '../../src/common/constants.js'; describe('Badge 테스트', () => { test.each(BADGES)('총혜택 금액 최소 %d원 이상이면 %s 배지 부여', ({ badge, amount }) => { const badgeInstance = new Badge(amount); expect(badgeInstance.assignBadge()).toBe(badge); }); test('총혜택 금액 5000원 미만이면 배지 없음', () => { const badgeInstance = new Badge(4999); expect(badgeInstance.assignBadge()).toBe(OUTPUT.none); }); });
JavaScript
복사

결과

테스트 코드는 하나지만, 결과는 아래와 같이 세 개로 잘 나온다. 테스트 결과 화면에 특정 금액이 표시되지 않아서 아쉽지만..
Badge 클래스 테스트 결과 화면