# 테스트 시작하기

## 빠른 시작

### 1단계: 테스트 패키지 설치

```bash
cd /Users/hyungiahn/Documents/code/TK-FB-Project/api.hyungi.net
npm install
```

### 2단계: 첫 번째 테스트 실행

```bash
# 모든 테스트 실행
npm test

# 특정 파일만 테스트
npm test -- tests/unit/services/workReportService.test.js

# Watch 모드 (파일 변경 시 자동 재실행)
npm run test:watch
```

### 3단계: 커버리지 확인

```bash
# 커버리지와 함께 테스트 실행
npm run test:coverage

# 커버리지 리포트 HTML 보기
open coverage/lcov-report/index.html
```

---

## 디렉토리 구조

```
tests/
├── README.md                           # 이 파일
├── setup.js                            # Jest 전역 설정
├── helpers/
│   └── mockData.js                     # 테스트용 더미 데이터
├── unit/
│   ├── services/                       # 서비스 레이어 테스트
│   │   └── workReportService.test.js   # ✅ 작성 완료 (예제)
│   ├── controllers/                    # 컨트롤러 테스트 (미작성)
│   └── models/                         # 모델 테스트 (미작성)
└── integration/                        # 통합 테스트 (미작성)
```

---

## 다음 단계: 테스트 파일 작성

### 우선순위 1: 서비스 레이어 테스트 작성

다음 서비스들에 대한 테스트 파일을 작성하세요:

```bash
tests/unit/services/
├── workReportService.test.js          # ✅ 완료
├── attendanceService.test.js          # ⬜ TODO
├── dailyWorkReportService.test.js     # ⬜ TODO
├── workerService.test.js              # ⬜ TODO (간단)
├── projectService.test.js             # ⬜ TODO (간단)
├── issueTypeService.test.js           # ⬜ TODO (간단)
├── toolsService.test.js               # ⬜ TODO
├── dailyIssueReportService.test.js    # ⬜ TODO
├── uploadService.test.js              # ⬜ TODO (간단)
└── analysisService.test.js            # ⬜ TODO
```

**추천 작성 순서:**
1. **workReportService.test.js** ✅ (이미 완료 - 참고용)
2. **workerService.test.js** (간단한 CRUD, 시작하기 좋음)
3. **projectService.test.js** (간단한 CRUD)
4. **attendanceService.test.js** (복잡도 중간)
5. **나머지 서비스들...**

### 우선순위 2: 컨트롤러 테스트

서비스 레이어 테스트가 어느정도 완료되면 컨트롤러 테스트를 시작하세요.

### 우선순위 3: 통합 테스트

마지막으로 실제 HTTP 요청을 테스트하는 통합 테스트를 작성하세요.

---

## 예제 테스트 작성 방법

### 서비스 레이어 테스트 템플릿

```javascript
const serviceName = require('../../../services/serviceName');
const { ValidationError, NotFoundError, DatabaseError } = require('../../../utils/errors');

// 모델 모킹
jest.mock('../../../models/modelName');
const modelName = require('../../../models/modelName');

describe('ServiceName', () => {
  beforeEach(() => {
    jest.clearAllMocks();
  });

  describe('methodName', () => {
    it('should succeed when valid data provided', async () => {
      // Arrange
      const mockData = { /* ... */ };
      modelName.method.mockResolvedValue(mockData);

      // Act
      const result = await serviceName.methodName(params);

      // Assert
      expect(result).toEqual(expectedResult);
      expect(modelName.method).toHaveBeenCalledWith(expectedParams);
    });

    it('should throw ValidationError when invalid data', async () => {
      // Act & Assert
      await expect(serviceName.methodName(invalidParams))
        .rejects.toThrow(ValidationError);
    });
  });
});
```

---

## 유용한 명령어

```bash
# 특정 describe 블록만 테스트
npm test -- --testNamePattern="createWorkReportService"

# 실패한 테스트만 재실행
npm test -- --onlyFailures

# 병렬 실행 비활성화 (디버깅 시)
npm test -- --runInBand

# 상세 출력
npm run test:verbose
```

---

## 목표 커버리지

- **서비스 레이어**: 80% 이상
- **컨트롤러**: 70% 이상
- **전체**: 75% 이상

---

## 도움말

전체 가이드는 프로젝트 루트의 `TESTING_GUIDE.md`를 참고하세요:

```bash
cat /Users/hyungiahn/Documents/code/TK-FB-Project/TESTING_GUIDE.md
```

---

**Happy Testing! 🧪**
