TroubleShooting/Vitest

[vitest] beforeEach와 beforeAll의 차이점 - 실수하기 쉬운 환경변수 테스트 예제

머지?는 병합입니다 2025. 2. 22. 23:43

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');
  });
});