프론트엔드 개발에서 테스트는 선택이 아닌 필수가 되고 있다. 어떤 종류의 테스트가 있고, 각각 어떤 상황에서 사용하면 좋을지 정리해보자.
함수 하나, 컴포넌트 하나가 올바르게 작동하는지 확인
// 함수 테스트 (Jest)
function add(a, b) {
return a + b;
}
test("add 함수", () => {
expect(add(2, 3)).toBe(5);
});
🛠 도구 : Jest
🧠 적합한 상황
여러 컴포넌트/로직이 함께 잘 작동하는지 확인
// React 컴포넌트 테스트 (RTL + Jest)
test("추가 버튼을 누르면 할 일이 추가된다", async () => {
render(<TodoApp />);
await userEvent.type(screen.getByPlaceholderText("할 일"), "공부");
await userEvent.click(screen.getByText("추가"));
expect(screen.getByText("공부")).toBeInTheDocument();
});
🛠 도구: React Testing Library + Jest
🧠 적합한 상황
브라우저에서 진짜 사용자가 하는 행동 그대로 재현
// Cypress 예제
cy.visit("/login");
cy.get("input[name='id']").type("psi7218");
cy.get("input[name='password']").type("1234");
cy.get("button[type='submit']").click();
cy.contains("환영합니다").should("be.visible");
🛠 도구: Cypress, Playwright
🧠 적합한 상황
| 도구 | 분류 | 테스트 실행 환경 | 주로 사용되는 테스트 | 주체 |
|---|---|---|---|---|
| Jest | Test Runner (기반) | Node.js | Unit / Integration | 함수, 로직 |
| RTL (React Testing Library) | UI 테스트 도구 | JSDOM | Unit / Integration | 컴포넌트 |
| Cypress | E2E 툴 (브라우저 기반) | 브라우저 | E2E | 전체 UI & 서버 |
| Playwright | E2E 툴 (MS 개발) | 브라우저 | E2E | 전체 시스템 |
작성된 테스트 코드를 실행해서 결과를 판단 후 출력하는 실행기
RTL의 경우, DOM(UI)탐색만 가능해서 단독으로 실행은 불가능 → RTL + Jest 로 하는 이유
| 테스트 유형 | 목적 | 예시 상황 | 사용하는 도구 |
|---|---|---|---|
| Unit | 작은 로직 단위 검증 | 함수, 계산기, 유틸 | ✅ Jest |
| Integration | 컴포넌트 간 연결 | 버튼 클릭 → 결과 표시 | ✅ RTL + Jest |
| E2E | 전체 사용 흐름 시뮬레이션 | 로그인 → 이동 → 로그아웃 | ✅ Cypress / Playwright |
테스트 코드를 왜 작성하셨나요?
개발하면서 테스트가 꼭 필요하다고 느꼈던 순간이 있었나요?
테스트 코드 작성은 프로젝트 일정에 도움이 되었나요, 오히려 방해되었나요?
컴포넌트를 테스트할 때 중요한 기준이 있으신가요?
TDD 해보셨나요?
Cypress와 Playwright의 차이점을 알고 계신가요?
JSDOM 환경에서 안 되는 테스트는 어떤 게 있나요?
CI/CD 환경에서 테스트는 어떻게 구성하셨나요?
E2E 테스트가 너무 느리다면 어떻게 개선하실 건가요?
테스트가 깨졌는데, 실제로는 정상일 경우 어떻게 처리하나요?