테스트

[Jest] Jest 함수 실행 순서

eess 2024. 7. 29. 18:22

 

Jest Globals

테스트 프레임워크 중 하나인 Jest에는 다음과 같은 전역 객체와 함수들을 제공하고 있습니다. 

 

beforeAll

  • 파일 안의 각 테스트가 실행되기 전 실행됩니다.
  • 콜백 함수가 promise를 반환하는 경우, promise가 이행(fulfilled)될 때까지 기다립니다.
  • 여러 테스트에서 사용되는 전역 상태를 설정(set up)하려는 경우 사용할 수 있습니다.

beforeEach

  • 파일 안의 각 테스트가 실행되기 전 실행됩니다.
  • 콜백 함수가 promise를 반환하는 경우, promise가 이행(fulfilled)될 때까지 기다립니다.
  • 각 테스트에서 사용되는 전역 상태를 재설정(reset)하려는 경우 사용할 수 있습니다.

afterAll

  • 파일 안의 모든 테스트가 완료된 후 실행됩니다.
  • 콜백 함수가 promise를 반환하는 경우, promise가 이행(fulfilled)될 때까지 기다립니다.
  • 테스트 전반에 걸쳐 사용되는 전역 상태를 정리(clean up)하려는 경우 사용할 수 있습니다.

afterEach

  • 파일 안의 각 테스트가 완료된 후 실행됩니다.
  • 콜백 함수가 promise를 반환하는 경우, promise가 이행(fulfilled)될 때까지 기다립니다.
  • 각 테스트에서 생성된 임시 상태를 정리(clean up)하려는 경우 사용할 수 있습니다.

describe

  • 여러 개의 테스트를 묶어서 그룹화해주는 함수입니다.
  • 테스트 케이스를 그룹화하는 목적의 함수이기 때문에, beforeAll, beforeEach, afterAll, afterEach와 같이 비동기 작업을 기다리는 로직을 넣을 수 없습니다.

it / test

  • 테스트할 내용을 적는 함수입니다. 
  • 콜백 함수가 promise를 반환하는 경우, promise가 이행(fulfilled)될 때까지 기다립니다.

 

실행 순서

describe가 중첩되지 않았다면, < beforeAll - beforeEach - test - afterEach - afterAll > 의 순서로 진행되겠죠. 

describe가 중첩된다면 어떻게 될까요?

아래와 같이 describe 블록 안팎에 globals 함수들을 배치했을 때 어떤 순서로 실행되는지 보겠습니다.

describe('Sample Test', () => {
  beforeAll(() => {
    console.log('✅ Outer before all');
  });

  beforeEach(() => {
    console.log('✅ Outer before each');
  });

  describe('sample test', () => {
    beforeAll(() => {
      console.log('✅ Inner before all');
    });
    
    beforeEach(() => {
      console.log('✅ Inner before Each');
    });
    
    test('test1', () => {
      console.log('✅ Sample test1');
      expect(true).toBe(true);
    });
    
    test('test2', () => {
      console.log('✅ Sample test2');
      expect(true).toBe(true);
    });

    afterEach(() => {
      console.log('✅ Inner after each');
    });

    afterAll(() => {
      console.log('✅ Inner after all');
    });
  });

  afterEach(() => {
    console.log('✅ Outer after each');
  });

  afterAll(() => {
    console.log('✅ Outer after all');
  });
});

 

결과

 

    ✅ Outer before all
    ✅ Inner before all
    ✅ Outer before each
    ✅ Inner before Each
    ✅ Sample test1
    ✅ Inner after each
    ✅ Outer after each
    ✅ Outer before each
    ✅ Inner before Each
    ✅ Sample test2
    ✅ Inner after each
    ✅ Outer after each
    ✅ Inner after all
    ✅ Outer after all

 

정리

중첩된 describe 블록이 있는 경우

  • 내부에 있는 beforeAll은 외부에 있는 beforeEach보다 먼저 실행됩니다.
  • beforeEach는 외부에 있든 내부에 있든, test 블록마다 실행됩니다.
    • 외부에 있는 beforeEach가 먼저 실행되고, 이후 내부에 있는 beforeEach가 실행됩니다.
  • afterEach도 외부에 있는 내부에 있든, test 블록마다 실행됩니다.
    • 내부에 있는 afterEach가 먼저 실행되고, 이후 외부에 있는 afterEach가 실행됩니다. (beforeEach와 반대)

beforeEach가 왠지 의도대로 실행되지 않는다면 실행순서와 우선순위를 다시 한 번 살펴보는 것이 좋습니다. 

 

 

참고

1. https://jestjs.io/docs/setup-teardown 

2. https://joshua-toth.medium.com/jests-beforeeach-may-not-be-running-the-way-you-think-it-does-c81599d83649