본문으로 바로가기

테스트를 구동하기 전에 모듈을 임포트하는 등의 작업 혹은 테스트를 구동한 후에 처리해야 하는 작업 등 테스트 전, 후에 작업을 해야할 경우가 종종 있습니다.

 

setup 

테스트 전, 후에 트리거 되는 코드 조각들은 (before | after)(All | Each) 내부에 넣으면 됩니다.

 

beforeAll, afterAll

In some cases, you only need to do setup once, at the beginning of a file. This can be especially bothersome when the setup is asynchronous, so you can't do it inline. Jest provides beforeAll and afterAll to handle this situation.

 

beforeEach, afterEach
If you have some work you need to do repeatedly for many tests, you can use beforeEach and afterEach.

 

아래 처럼 사용하면 됩니다만, 보통 후술할 test scope 내부에 넣어서 하는 경우가 대부분입니다.

beforeAll(() => console.log('start test! intialize DB'));

beforeEach(() => console.log('beforeEach test'));

test('should 3', () => {
  return expect(1 + 2).toBe(3);
});

test('should 4', () => {
  return expect(2 + 2).toBe(4);
});

afterAll(() => console.log('end test!'));

afterEach(() => console.log('afterEach test'));

 

scope (test block)

When they are inside a describe block, the before and after blocks only apply to the tests within that describe block.

여기서 주의해야 할 점은, top-level beforeEach는 scope와 상관없이 매번 트리거된다는 것입니다.

scope와 관계 없이 반드시 트리거되어야 하는 동작을 설정하면 유용합니다.

 

* 문서에서는 test를 사용했는데 사실 it을 써도 똑같습니다. it('should 3', () => expect(3).toBe(3));

// scope에 관계 없이 매번 트리거 됨
beforeEach(() => console.log('top level beforeEach'));

describe('test block one', () => {
  beforeEach(() => console.log('inner block one'));
  test('should 3', () => expect(1 + 2).toBe(3));
  test('should 3', () => expect(1 + 2).toBe(3));
});

describe('test block two', () => {
  beforeEach(() => console.log('inner block two'));
  test('should 3', () => expect(1 + 2).toBe(3));
});

// top level beforeEach
// inner block one
// top level beforeEach
// inner block one
// top level beforeEach
// inner block two

 

여기서 잠깐. scope 내에 있는 것만 set up 되는 건 알겠습니다만, execute order가 조금 헷갈릴 수도 있습니다.

실행되는 순서가 약간 tricky 할 수 있다는 거죠. 아래 코드를 살펴봅시다.

 

describe('outer', () => {
  console.log('describe outer-a');

  describe('describe inner 1', () => {
    console.log('describe inner 1');
    test('test 1', () => {
      console.log('test for describe inner 1');
      expect(true).toEqual(true);
    });
  });

  console.log('describe outer-b');

  test('test 1', () => {
    console.log('test for describe outer');
    expect(true).toEqual(true);
  });

  describe('describe inner 2', () => {
    console.log('describe inner 2');
    test('test for describe inner 2', () => {
      console.log('test for describe inner 2');
      expect(false).toEqual(false);
    });
  });

  console.log('describe outer-c');
});

// describe outer-a
// describe inner 1
// describe outer-b
// describe inner 2
// describe outer-c
// test for describe inner 1
// test for describe outer
// test for describe inner 2

 

결론적으로는, test 함수 내부의 작업들은 test block 내의 작업이 모두 실행된 후에야 실행되는 것을 확인할 수 있습니다.

이러한 실행 순서가 문제가 될 정도의 세밀한 테스트 코드를 짜야할 경우가 생길 수 있으니 유의해둡시다.


darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체