TK-FB(공장관리+신고)와 M-Project(부적합관리)를 3개 독립 시스템으로 분리하기 위한 전체 코드 구조 작성. - SSO 인증 서비스 (bcrypt + pbkdf2 이중 해시 지원) - System 1: 공장관리 (TK-FB 기반, 신고 코드 제거) - System 2: 신고 (TK-FB에서 workIssue 코드 추출) - System 3: 부적합관리 (M-Project 기반) - Gateway 포털 (path-based 라우팅) - 통합 docker-compose.yml 및 배포 스크립트 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
171 lines
4.3 KiB
Markdown
171 lines
4.3 KiB
Markdown
# 테스트 시작하기
|
|
|
|
## 빠른 시작
|
|
|
|
### 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! 🧪**
|