Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

심현준 1주차 과제 제출 #6

Open
wants to merge 1 commit into
base: feature/tdd-bdd-research
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 84 additions & 0 deletions 1주차/심현준.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# 유닛(단위) 테스트 개념

### 유닛테스트 정의

- 코드의 가장 작은 기능적 단위를 독립적으로 테스트하는 프로세스
- 예시
- 개별 함수 , 메서드
- 컴포넌트
- 모듈 단위

### 유닛테스트의 목적

- 버그의 조기 발견
- 문서화 효과
- 테스트 코드만 보고도 협업자의 코드를 이해할 수 있음
- 리팩토링 안전성 확보
- 코드 수정 시 기존 기능이 정상 동작하는지 검증 가능
- 더 나은 설계 유도

### 유닛테스트 작성시 주의할 점

- 다른 의존성들을 격리시켜 순수하게 해당 단위의 동작만 검증
- 의존성원칙(DIP)를 준수한다.
1. 상위 모듈은 하위 모듈에 의존하지 않고, 추상화에 의존한다.
2. 추상화는 구체화에 의존해서는 안되며, 구체화가 추상화에 의존해야한다.
- 실제 코드보다 간결하고 이해하기 쉽게 작성

### 대표적인 유닛테스트 도구

### Jest

- 자바스크립트 테스팅 프레임워크
- CommonJS(require) 기반이나 import 문법도 지원 (babel 설정 필요)
- 타입스크립트 사용시 추가 의존성 필요 (ts-jest, @types/jest)
- nodeJs 환경에서 동작하며 테스트러너 역할
- JavaScript / Typescript , Node, React , Angular등 다양한 프로젝트 지원
- 풍부한 커뮤니티와 생태계
- 주요 기능:
- 스냅샷 테스트 지원
- test(), expect() 등의 기본 테스트 API 제공
- Mock 시스템 (jest.fn(), jest.mock() 등)
- 비동기 테스트 지원 (async/await)
- Watch 모드 (파일 변경 시 자동 테스트)
- 테스트 실행, 결과 보고, 코드 커버리지

### Vitest

- JS/TS 테스팅 프레임워크 , 테스트러너
- Typescript 기본 지원
- 네이티브 ESModule(import) 방식으로 더 빠른 실행 속도
- 별도 변환 과정 없이 직접 실행
- 주요 기능:
- Jest와 유사한 API 제공 (높은 호환성)
- 멀티스레드 테스트 실행 지원 (test.concurrent)
- 스냅샷 테스팅
- 내장 UI 인터페이스
- 코드 커버리지
- Vite 설정을 그대로 사용 가능 (설정 용이)
- Vite 기반 프로젝트에 최적화

### 좋은 테스트 작성 원칙

> **Arrage - Act - Assert (3A) 패턴을 사용한다. or GWT (given-when-then)**

- Arrange(Given) : 테스트 수행시 필요한 조건들을 준비하는 단계
- 모든 테스팅마다 준비 과정을 반복하는 것은 번거롭다. 최대한 재사용할 수 있는 구조로 만들자
- Act(When) : 테스트 동작 수행 단계
- 의도적으로 실패할 수 있도록 검증하자.
- Assert(Then): 결과 검증 단계
- 결과 검증시, 해당 테스팅이 목적에 맞는지, 단일 책임을 지키고 있는지 고려해본다.

> **FIRST 원칙**

- Fast - 느린것에 대한 의존성 낮추기
- 테스트가 빠르게 수행될 수 있도록, 파일, DB접근, 네트워크요청 등에 대한 의존성을 낮춘다.
- Isolated - 최소한의 유닛으로 검증하기
- 독립적, 집중적인 단위를 유지한다.
- Repeatable - 실행마다 동일한 결과를 유지
- 테스트시마다 수행 결과에 변동이 있으면 안된다. ( 외부 환경에 대한 의존을 배제 )
- Self - Validatiing - 스스로 결과를 검증하기
- 테스팅 프레임워크, 라이브러리 자체적으로 수행 결과를 검증 ,리포팅
- CI/CD에 테스팅 스테이지 추가
- Timely - 테스트코드 작성이 유의미할 수 있도록 시기적절하게 작성.
- 배포 이전에 테스트코드를 작성하자.