인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

dony님의 프로필 이미지
dony

작성한 질문수

실무에 바로 적용하는 프런트엔드 테스트 - 1부. 테스트 기초: 단위・통합 테스트

setup, teardown 동작 순서

작성

·

56

0

안녕하세요!
setup, teardown 강의를 보며 실습하고 있습니다.

  1. beforeAll 내에 console이 첫번째로 찍히다가 afterAll과 함께 사용할 경우에는 afterAll 바로 직전(마지막 바로 앞)에 찍히고 있습니다. (afterAll을 지울 경우에는 첫번째로 찍히고 있습니다.)

  2. beforeEach는 it을 실행하는 횟수만큼 실행되는거 같은데요. describe내에 선언한 beforeEach는 describe내에 호출한 it의 횟수만큼 실행되는게 맞는거 같은데 root의 beforeEach, afterEach도 it의 횟수만큼 실행되는게 맞을까요?

제가 사용한 코드와 출력화면 입니다.

import { screen } from '@testing-library/react';
import React from 'react';

import TextField from '@/components/TextField';
import render from '@/utils/test/render';

beforeEach(() => {
  console.log('2. root - beforeEach');
});
beforeAll(() => {
  console.log('1. root - beforeAll');
});

afterEach(() => {
  console.log('5. root - afterEach');
});
afterAll(() => {
  console.log('6. root - afterAll');
});

describe('placeholder', () => {
  beforeEach(() => {
    console.log('3. placeholder - beforeEach');
  });
  afterEach(() => {
    console.log('4. placeholder - afterEach');
  });
  it('기본 placeholder "텍스트를 입력해 주세요."가 노출된다.', async () => {
    await render(<TextField />);
    const textInput = screen.getByPlaceholderText('텍스트를 입력해 주세요.');

    expect(textInput).toBeInTheDocument();
  });

  it('placeholder prop에 따라 placeholder가 변경된다.', async () => {
    await render(<TextField placeholder="상품명을 입력해 주세요." />);
    const textInput = screen.getByPlaceholderText('상품명을 입력해 주세요.');

    expect(textInput).toBeInTheDocument();
  });
});

/** 실행 결과
2. root - beforeEach
3. placeholder - beforeEach
4. placeholder - afterEach
5. root - afterEach
2. root - beforeEach
3. placeholder - beforeEach
4. placeholder - afterEach
5. root - afterEach
1. root - beforeAll
6. root - afterAll
*/

 

답변 1

0

코드 조커, 오프님의 프로필 이미지
코드 조커, 오프
지식공유자

안녕하세요!

질문주신 내용 답변드립니다.

  1. beforeAll 내에 console이 첫번째로 찍히다가 afterAll과 함께 사용할 경우에는 afterAll 바로 직전(마지막 바로 앞)에 찍히고 있습니다. (afterAll을 지울 경우에는 첫번째로 찍히고 있습니다.)

    1. vitest의 경우 포매팅을 위해 기본 console 클래스의 동작을 가로채어 로그를 찍도록 구현되어 있는대요. 이 구현 과정에서 로깅의 타이밍이 보장되지 않는 걸로 보입니다. 실제로 setup, teardown의 코드 실행 자체는 beforeAll -> beforeEach -> afterEach -> afterAll 로 이뤄지나 log 자체의 동작때문에 다르게 찍히는 걸로 보입니다. vite.config.jsdisableConsoleIntercept옵션을 true설정하면 예상한 순서대로 로그가 찍히는 것을 확인할 수 있습니다..!

  2. beforeEach는 it을 실행하는 횟수만큼 실행되는거 같은데요. describe내에 선언한 beforeEach는 describe내에 호출한 it의 횟수만큼 실행되는게 맞는거 같은데 root의 beforeEach, afterEach도 it의 횟수만큼 실행되는게 맞을까요?

    1. 넵 맞습니다. 다만, root의 beforeEach, afterEach 모든 it의 개수와 비례하여 실행됩니다~!

dony님의 프로필 이미지
dony
질문자

순서대로 잘 실행됩니다!
답변 감사합니다 🙇🏻‍♀️

말씀해주신 옵션을 찾아보던 중에 console 관련 다른 옵션들도 있어 다른 수강생분들을 위해 남겨봅니다.

  • disableConsoleIntercept: vitest에서 console의 출력을 가로채는 기능 disable 여부 (default: false) -> 해당 옵션을 true로 할 경우 test results 창이 아니라 터미널에서 vitest 실행 명령어를 입력해야 출력됩니다.

  • silent: console 출력 여부를 설정 (default: false)

  • printConsoleTrace: 해당 console이 호출된 위치를 출력할지 여부를 설정 (default: false)

dony님의 프로필 이미지
dony

작성한 질문수

질문하기