반응형
위 글에서 이어진다.
문제
현재 유닛 테스트, 통합테스트는 로컬 환경에서만 가능하다.
이걸 배포시에 자동으로 테스트한뒤 배포해보자(배포구성은 이미 되어있음)
유닛테스트, 통합테스트 분리하기
우선 유닛테스트 환경과 통합테스트환경을 분리해주자.
jest.unit.config.js를 작성해주었다.
나는 유닛테스트 코드들은 test, 통합테스트 코드들은 tests 디렉토리에 위치시켜서 이들을 구분할 것이다.
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
testMatch: ['**/test/*.(ts|tsx)'], //test 내부에 있는 ts코드들만 테스트
};
package.json에서 명령어를 등록해주자.
...
scripts:{
...
"test": "sh ./scripts/run-test.sh", //통합테스트 스크립트 실행
"unitTest": "jest --config jest.unit.config.js --coverage", //유닛테스트
}
이러면 npm test를 하면 통합테스트가, npm run unitTest를 하면 유닛테스트가 실행된다.
자동화시키기
도커 띄우기
github action에서 docker-compose.yml을 그대로 사용해서 컨테이너를 구성해줄 수 있었다.
- name: 🐋 Docker-compose 준비
working-directory: ./
run: |
docker-compose up -d
문제 발생
wait-for-it.sh를 제대로 실행시킬 수 없는 문제가 발생했다.
그래서 통합테스트 환경을 run-test.sh를 실행시키지 않고, 따로 yml에서 정의해주었다.
wait-for-it도 그냥 수행해주지 않고 mysql 도커 기다리기라는 job을 하나 만들어서 기다려주었다.
- name: 🐋 Docker-compose 준비
working-directory: ./
run: |
docker-compose up -d
- name: ⏰mysql 도커 기다리기
run: |
until docker exec mySQLContainer mysqladmin ping -P 3306 -u root -p$DB_PASSWORD | grep "mysqld is alive" ; do
>&2 echo "MySQL is unavailable - waiting for it... "
sleep 1
done
- name: ✅테스트 수행
working-directory: ./
run: |
npm run unitTest
npx jest --runInBand --setupFiles dotenv/config
- name: 🐋 Docker-compose Down
working-directory: ./
run: docker-compose down
결과
반응형