-
Notifications
You must be signed in to change notification settings - Fork 2
husky로 커밋 전 테스트 실행 구축 하기
Sunny edited this page Nov 22, 2024
·
2 revisions
- test 파일을 unit 테스트와 e2e 테스트 모두 test 폴더 내에서 관리하기로 하였으므로 test 폴더 내에 config 폴더를 생성하여 unit, e2e config 파일을 생성해 주었습니다.
- 각 config파일은 jest에서 어떤 파일을 test파일로 감지하여 실행할지를 나타내고 있습니다.
- Unit과 e2e를 합쳐 한번에 모든 테스트가 돌아가도록 구현할 수 있었는데 혹시나 테스트를 따로 해야할 일이 생길수도 있다는 생각에 따로 생성 해주었습니다.
수정 내용
```json
// jest.config.json
{
"moduleFileExtensions": ["js", "json", "ts"],
"rootDir": "../../",
"testEnvironment": "node",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
},
"testMatch": [
"<rootDir>/test/**/*.spec.ts"
],
"moduleNameMapper": {
"^src/(.*)$": "<rootDir>/src/$1"
},
"collectCoverageFrom": [
"test/**/*.(t|j)s"
],
"coverageDirectory": "./coverage/unit",
"verbose": true,
"testPathIgnorePatterns": [
"/node_modules/",
"/dist/"
],
"roots": [
"<rootDir>/test/"
],
"moduleDirectories": [
"node_modules",
"src"
]
}
```
```json
//jest-e2e.config.json
{
"moduleFileExtensions": ["js", "json", "ts"],
"rootDir": "../../",
"testEnvironment": "node",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
},
"testMatch": [
"<rootDir>/test/**/*.e2e-spec.ts"
],
"moduleNameMapper": {
"^src/(.*)$": "<rootDir>/src/$1"
},
"collectCoverageFrom": [
"test/**/*.(t|j)s"
],
"coverageDirectory": "./coverage/e2e",
"verbose": true,
"testPathIgnorePatterns": [
"/node_modules/",
"/dist/"
],
"roots": [
"<rootDir>/test/"
],
"moduleDirectories": [
"node_modules",
"src"
]
}
```
{
"name": "@web20-camon/api",
...
"scripts": {
...
"test": "jest --config ./test/config/jest.config.json",
"test:e2e": "jest --config ./test/config/jest-e2e.config.json"
},
...
}
- 각 서버의 package.json 수정이 필요합니다. 그 중 api 서버의 수정 내용입니다.
- 가장 주의해야 할 점은 package.json의 name을 root package.json에서 명시해준 name으로 변경해주어야 한다는 것입니다. 그래야 모노레포가 인식을 하더라구요.
- nest 에서 기본적으로 제공하는 test script는 삭제해주고 unit test를 위한 스크립트와 e2e 테스트를 위한 스크립트를 변경해 주었습니다.
- 앞서 작성한 config 파일을 jest —config 옵션으로 명시하여 실행시키면서, 각각 알맞게 테스트 파일이 실행되도록 스크립트를 작성했습니다.
"scripts": {
...
"test:api": "pnpm --filter @web20-camon/api test && pnpm --filter @web20-camon/api test:e2e",
"test:chat": "pnpm --filter @web20-camon/chat test",
"test:media": "pnpm --filter @web20-camon/media test"
},
- 모노레포의 scripts에 위와 같은 스크립트를 추가해주었습니다.
- 각 api, chat, media 서버 마다 테스트 스크립트를 만들고 —filter 옵션으로 해당 워크스페이스의 파일만 test 할 수 있도록 하였습니다.
- api서버는 unit test와 e2e test가 모두 실행될 수 있도록 작성하였습니다.
- chat과 media 서버는 어떻게 테스트가 이루어질지 몰라 일단 기본으로 두었습니다.
#변경된 파일 워크스페이스 찾기
CHANGED_FILES=$(git diff --cached --name-only)
# API서버 테스트
if echo "$CHANGED_FILES" | grep -q "^apps/api/"; then
echo "\033[34m🧪 Running API tests...\033[0m"
pnpm test:api || {
echo "\033[31m❌ API tests failed. Please fix the failing tests and try again.\033[0m"
exit 1
}
fi
# Chat서버 테스트
if echo "$CHANGED_FILES" | grep -q "^apps/chat/"; then
echo "\033[34m🧪 Running Chat tests...\033[0m"
pnpm test:chat || {
echo "\033[31m❌ Chat tests failed. Please fix the failing tests and try again.\033[0m"
exit 1
}
fi
# Media서버 테스트
if echo "$CHANGED_FILES" | grep -q "^apps/media/"; then
echo "\033[34m🧪 Running Media tests...\033[0m"
pnpm test:media || {
echo "\033[31m❌ Media tests failed. Please fix the failing tests and try again.\033[0m"
exit 1
}
fi
- 기존의 husky 스크립트에 위와 같은 코드를 추가해주었습니다.
- git diff 명령어로 코드가 변경된 워크스페이스들을 찾고, 이에 해당한다면 각 서버의 test 명령어를 실행하도록 구현하였습니다.
- 만약 test에 실패할 경우 exit1로 commit이 올라가지 않도록 했습니다.
- Mediasoup 포트 매핑 문제
- swagger 같은 응답 코드에 다양한 응답 보여주기
- Sudo가 계속 비밀번호를 요청함
- Docker 이미지가 너무 크다
- Git action에서 도커 이미지 빌드 시간을 단축시켜보자
- Docker compose를 이용해서 메모리 사용률을 줄여보자
- 방송 녹화 시 CPU 과부하 문제를 해결해보자
- Release 브랜치? 너 필요해?
- 로딩이 너무 짧아…!
- NestJS ORM으로 무엇을 사용해야 할까?
- WebRTC를 이용한 1:N 스트리밍 서비스에서 시그널링 서버가 필요할까?
- 실시간 채팅 구현: 인메모리 방식을 선택한 이유
- MySQL 아키텍처 개선: DB 의존성 분리와 서버 역할 명확화
- 브라우저 창이 최소화되면 비디오 송출이 안된다…!
- Mediasoup 기본 개념
- DLTS와 Signaling
- Tell, Don't Ask (TDA) 원칙이란
- VPC(Virtual Private Cloud) 학습 정리
- 순환참조: A 서비스 ‐ B 서비스 vs. A 서비스 ‐ B 레포지토리
- Dto 메서드 전략
- WebRTC란?
- 자바스크립트 패키지 매니저(npm, yarn, pnpm)
- shadcn/ui을 이용해 UI 개발 생산성 높이기
- React 이벤트 핸들러 네이밍(on vs handle)
- React-router-dom의 createBrowserRouter을 사용해보기
- fetch vs axios