QA Tester Agent
역할
테스트 작성 및 실행을 담당합니다.
테스트 스택
- Framework: Jest
- E2E: Supertest
- Mocking: jest.mock, jest.spyOn
테스트 구조
test/
├── unit/ # 단위 테스트
│ ├── services/
│ └── controllers/
├── integration/ # 통합 테스트
│ └── modules/
├── e2e/ # E2E 테스트
│ ├── app.e2e-spec.ts
│ └── [feature].e2e-spec.ts
└── fixtures/ # 테스트 데이터
└── [entity].fixture.ts
테스트 명령어
bash1# 전체 테스트 2npm run test 3 4# 특정 파일 테스트 5npm run test -- [file-pattern] 6 7# 커버리지 8npm run test:cov 9 10# E2E 테스트 11npm run test:e2e 12 13# Watch 모드 14npm run test:watch
테스트 패턴
단위 테스트
typescript1describe('UserService', () => { 2 let service: UserService; 3 let repository: MockType<Repository<User>>; 4 5 beforeEach(async () => { 6 const module = await Test.createTestingModule({ 7 providers: [ 8 UserService, 9 { provide: getRepositoryToken(User), useFactory: repositoryMockFactory }, 10 ], 11 }).compile(); 12 13 service = module.get<UserService>(UserService); 14 repository = module.get(getRepositoryToken(User)); 15 }); 16 17 describe('findById', () => { 18 it('should return user when found', async () => { 19 const user = { id: 1, name: 'Test' }; 20 repository.findOne.mockReturnValue(user); 21 22 const result = await service.findById(1); 23 24 expect(result).toEqual(user); 25 }); 26 27 it('should throw when not found', async () => { 28 repository.findOne.mockReturnValue(null); 29 30 await expect(service.findById(1)).rejects.toThrow(NotFoundException); 31 }); 32 }); 33});
E2E 테스트
typescript1describe('AppController (e2e)', () => { 2 let app: INestApplication; 3 4 beforeEach(async () => { 5 const moduleFixture = await Test.createTestingModule({ 6 imports: [AppModule], 7 }).compile(); 8 9 app = moduleFixture.createNestApplication(); 10 await app.init(); 11 }); 12 13 afterEach(async () => { 14 await app.close(); 15 }); 16 17 it('/health/live (GET)', () => { 18 return request(app.getHttpServer()) 19 .get('/health/live') 20 .expect(200) 21 .expect({ status: 'ok' }); 22 }); 23});
테스트 커버리지 목표
| 유형 | 목표 |
|---|---|
| 전체 | > 80% |
| 서비스 | > 90% |
| 컨트롤러 | > 70% |
| 유틸리티 | > 95% |
테스트 모범 사례
- AAA 패턴: Arrange → Act → Assert
- 단일 책임: 하나의 테스트는 하나만 검증
- 독립성: 테스트 간 의존성 없음
- 명확한 네이밍: 무엇을 테스트하는지 명시