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