테스트가 왜 필요한지부터 시작해서, Jest의 기본 사용법, 다양한 테스트 패턴, mock과 spy 활용법, 마지막으로 테스트 커버리지까지 폭넓게 정리되었다.
개발자가 코드를 작성할 때 "내가 의도한 대로 동작할까?"라는 고민은 늘 따라온다.
그래서 테스트는 단순한 확인 작업을 넘어서, 버그를 미리 잡고, 리팩토링 시 안심하고 코드를 수정할 수 있도록 도와준다.
반복 작업을 줄여준다 (사람이 매번 수동으로 확인하지 않아도 됨)
코드의 동작 방식을 문서처럼 보여준다.
장기적으로 보면 개발 속도가 빨라진다.
종류 | 설명 |
---|---|
유닛 테스트 | 함수 하나만 떼어서 독립적으로 테스트 |
통합 테스트 | 여러 함수/모듈이 연결된 상태에서의 동작 테스트 |
E2E 테스트 | 사용자 입장에서 전체 플로우를 시나리오처럼 검증 |
npm install --save-dev jest ts-jest @types/jest typescript
"scripts": {
"test": "jest"
}
test() 또는 it() : 테스트 단위 작성
expect() : 결과를 검증 (assertion)
describe() : 테스트 그룹 묶기
expect(result).toBe(3)
expect(users).toContain('nahyun')
expect(isValid).toBeTruthy()
비동기 코드는 별도로 완료 시점을 알려줘야 한다.
콜백 방식: done() 사용
요즘은 대부분 async/await 문법을 활용
test('async 함수 테스트', async () => {
const result = await fetchData()
expect(result).toEqual(expectedData)
})
종류 | 역할 |
---|---|
Dummy | 단순히 자리를 채우는 값 |
Fake | 간단한 구현을 가진 가짜 객체 |
Stub | 정해진 값만 리턴하도록 설정 |
Mock | 호출 기록을 추적하고, 다양한 동작 흉내 가능 |
Spy | 기존 함수는 유지하면서 감시 기능 추가 |
const mockFn = jest.fn()
mockFn.mockReturnValue(42)
jest.spyOn(Math, 'random').mockReturnValue(0.8)
Setup: 필요한 상태 준비 (beforeEach 등)
Exercise: 테스트할 함수 실행
Assertion: 결과 검증 (expect)
Teardown: 정리 (afterEach 등)
코드 중 테스트된 범위가 얼마나 되는지를 나타내는 지표
라인 커버리지: 실행된 코드 라인의 비율
함수 커버리지: 호출된 함수의 비율
분기 커버리지: 조건문 등의 분기 처리까지 테스트했는지
npx jest --coverage
Jest는 단순한 테스트 도구를 넘어, 테스트 작성의 패턴과 습관을 만들어주는 강력한 프레임워크이다.
mock, spy 등 다양한 방식으로 테스트를 유연하게 구성할 수 있다.
테스트는 결국 "내가 만든 코드가 제대로 동작하고 있는지"를 꾸준히 확인하는 습관이다.
처음에는 테스트 코드를 따로 작성하는 게 귀찮게 느껴졌는데,
직접 mock과 spy를 써보고, 커버리지까지 확인해보니 이게 진짜 개발의 일부분이라는 생각이 들었다.
앞으로 프로젝트에서도 테스트를 의식적으로 설계하고 적용해보려고 한다.