1. beforeAll
- 실행 시점: 해당 describe 블록 내의 모든 테스트가 실행되기 전에 딱 한 번만 실행
- 용도
- 모든 테스트에서 공통으로 사용할 리소스를 한 번만 설정할 때
- 데이터베이스 연결과 같이 비용이 많이 드는 설정
- 변경되지 않는 상수나 설정값 초기화
- 모든 테스트에서 공통으로 사용할 리소스를 한 번만 설정할 때
describe('Database Tests', () => {
let connection;
beforeAll(async () => {
// DB 연결은 한 번만 수행
connection = await Database.connect();
});
it('test 1', () => { /* ... */ });
it('test 2', () => { /* ... */ });
});
2. beforeAll
- 실행 시점: 각각의 테스트 케이스가 실행되기 전에 매번 실행
- 용도
- 각 테스트마다 독립적인 환경이 필요할 때
- 테스트 간의 상태 간섭을 방지할 때
- 매 테스트마다 초기화가 필요한 데이터
describe('User Tests', () => {
let user;
beforeEach(() => {
// 매 테스트마다 새로운 user 객체 생성
user = { name: 'Test', age: 20 };
});
it('should update name', () => {
user.name = 'Updated';
expect(user.name).toBe('Updated');
});
it('should update age', () => {
// 이전 테스트의 영향을 받지 않고 초기값으로 시작
user.age = 25;
expect(user.age).toBe(25);
});
});
IDE의 자동완성을 무지성으로 적용한 제가 겪었던 실수..
describe('환경 변수 테스트', () => {
// 잘못된 사용: beforeAll
beforeAll(() => {
process.env.TEST_VAR = 'initial';
});
it('첫 번째 테스트', () => {
process.env.TEST_VAR = 'modified';
expect(process.env.TEST_VAR).toBe('modified');
});
it('두 번째 테스트', () => {
// 이전 테스트의 영향으로 'modified' 값이 유지됨
expect(process.env.TEST_VAR).toBe('modified'); // 예상치 못한 결과
});
// 올바른 사용: beforeEach
beforeEach(() => {
process.env.TEST_VAR = 'initial';
});
it('첫 번째 테스트', () => {
process.env.TEST_VAR = 'modified';
expect(process.env.TEST_VAR).toBe('modified');
});
it('두 번째 테스트', () => {
// 매 테스트마다 초기화되어 'initial' 값으로 시작
expect(process.env.TEST_VAR).toBe('initial');
});
});