logo
Published on

[React Testing] setup과 teardown

Authors
  • avatar

    jangth

모든 테스트는 독립적으로 실행되어야 한다. 각 테스트가 서로 영향을 준다면 해당 테스트의 결과가 통과 하더라도 신뢰할 수 없다.

이러한 테스트 독립성을 보장하기 위해 setup과 teardown을 활용할 수 있다.

  • setup : 테스트를 실행하기 전 수행해야 하는 전처리작업
  • teardown : 테스트를 실행한 후 수행해야하는 후처리 작업

setup과 teardown 작업을 수행하여 테스트 시작 전후로 다른 테스트에 영향을 미치지 않도록 초기화 하거나 데이터 세팅을 할 수 있고 반복적인 작업을 정의 할 수 있다.


setup - beforeEach, beforeAll

  • each : 각각의 테스트 실행 전 실행된다. 하지만 describe 내에서만 실행되면 describe 블럭내에 있는 테스트에만 영향을 준다.
  • all : 모든 테스트 테스트 실행전에 호출되지만, 실행 전에 단 한번만 호출된다.
  • each와 all이 함께 사용된다면 all이 먼저 실행되고 each가 실행된다.
beforeEach(() => {
  console.log('root - beforeEach')
}) // 2
beforeAll(() => {
  console.log('root - beforeAll')
}) // 1 가장 먼저 실행됨
descibe('test ', () => {
  beforeEach(() => {
    console.log('descibe - beforeEach')
  }) // 3
})

teardown - afterEach, afterAll

  • setup과 유사하지만 호출되는 시점이 다르다
  • each : 각각의 테스트 완료된 후에 실행, 테스트에 의해 생성된 상태를 초기화할 경우 사용, 하지만 describe 내에 정의했다면 describe 블럭내에 있는 테스트 완료후 실행된다.
  • all : 모든 테스트 실행 후 호출되지만, 스커프 및 파일 내에 테스트 실행이 모두 완료된 후 단 한번만 호출
afterEach(() => {
  console.log('root afterEach')
}) // 1 테스트 완료 후 가장먼저 실행
afterAll(() => {
  console.log('root afterAll')
}) // 3 모든 테스트 종료후 1번만 실행
describe('test', () => {
  console.log('describe after')
}) // 2

테스트 파일 내에서 전역변수를 사용하여 조건부로 동작을 분리하는 것은 좋지 않다.

만약 이전 테스트에서 전역 변수 someCondition을 사용하고 업데이트 했다면, 다른 테스트에 영향을 줄 수 있다.

let someCondition = false;
beforeEach(() => {
	if(someCondition) {
		await render(<Test />)
	} else {
		//...
	}
})

setup-teardown을 파일단위가 아니라 앱 전체에 적용

import '@testing-library/jest-dom'

// 모킹한 모듈의 호출 히스토리(기록) 초기화
afterEach(() => {
  jest.clearAllMocks()
})

// 기록뿐만 아니라 설정된 모킹한 모듈의 구현도 초기화한다.
afterAll(() => {
  jest.resetAllMocks()
})

Object.defineProperty(window, 'matchMedia', {
  writable: true,
  value: jest.fn().mockImplementation((query) => ({
    matches: false,
    media: query,
    onchange: null,
    addListener: jest.fn(), // deprecated
    removeListener: jest.fn(), // deprecated
    addEventListener: jest.fn(),
    removeEventListener: jest.fn(),
    dispatchEvent: jest.fn(),
  })),
})

✅ Object.defineProperty(....) Object.defineProperty(....)는 window.matchMeadia 메서드를 jest 테스트 환경에 모킹하는 것이다. (window.matchMeadia는 CSS 미디어 쿼리가 문서와 일치하는지 여부를 확인하는 기능이다.)