본문으로 건너뛰기
SDETRole
SDETRole

용어집 · UI 자동화

테스트 픽스처

영어: Test fixture

다른 이름: test fixtures, fixture, 픽스처, 피스처

정의

브라우저 페이지, 미리 생성한 사용자, 데이터베이스처럼 테스트 실행 전에 필요한 고정된 준비 상태와 실행 후 정리 작업을 말합니다.

테스트 픽스처는 테스트 대상 동작 이외에 테스트가 의존하는 모든 것입니다. 즉 첫 단계가 실행되기 전에 알려진 상태로 준비되어 있어야 하는 객체, 데이터, 연결, 환경을 말합니다. 좋은 픽스처는 매번 같은 방식으로 그 상태를 준비하고 끝나면 정리(teardown)하므로, 각 테스트가 깨끗한 상태에서 시작합니다. 이 용어는 Cypress가 cy.fixture()로 불러오는 JSON 파일처럼 정적인 테스트 데이터 파일을 가리키는 데에도 넓게 쓰입니다.

예시 (Playwright)

Playwright는 픽스처를 핵심 기능으로 제공합니다. page, request 같은 내장 픽스처는 이름으로 주입되며, test.extend로 직접 픽스처를 추가할 수 있습니다.

import { test as base, expect } from '@playwright/test';
import { TodoPage } from './todo-page';

type Fixtures = { todoPage: TodoPage };

export const test = base.extend<Fixtures>({
  todoPage: async ({ page }, use) => {
    const todoPage = new TodoPage(page);   // setup
    await todoPage.goto();
    await use(todoPage);                   // the test runs here
    await todoPage.removeAll();            // teardown
  },
});

test('adds an item', async ({ todoPage }) => {
  await todoPage.add('Write the glossary');
  await expect(todoPage.items).toHaveCount(1);
});

픽스처는 테스트가 요청할 때에만 생성되고, 다른 픽스처에 의존할 수 있으며, 기본적으로 테스트 단위로 범위가 정해집니다. 비용이 큰 리소스라면 { scope: 'worker' }로 워커 단위 범위를 지정할 수 있습니다.

예시 (JUnit 5)

xUnit 계열 프레임워크에서는 픽스처가 라이프사이클 메서드에 위치합니다.

class CartServiceTest {
    private CartService cart;

    @BeforeEach
    void setUp() {
        cart = new CartService(new InMemoryCartRepository());
    }

    @AfterEach
    void tearDown() {
        cart.clear();
    }

    @Test
    void emptyCartHasZeroTotal() {
        assertEquals(0, cart.total());
    }
}

@BeforeAll과 @AfterAll은 클래스당 한 번 실행되며, 기본적으로 static이어야 합니다.

흔한 실수

  • 테스트 간에 변경 가능한 픽스처 상태를 공유합니다. 여러 테스트가 수정하는 워커 범위의 사용자는 실행 순서에 따라 달라지는 실패를 일으킵니다.
  • 테스트가 실패하면 정리 작업을 건너뜁니다. 정리 코드는 테스트 본문 끝이 아니라 픽스처 안(use 다음)이나 @AfterEach에 둡니다.
  • 모든 것을 담은 거대한 픽스처 하나. 작고 조합 가능한 픽스처를 쓰면 각 테스트가 무엇에 의존하는지 한눈에 알 수 있습니다.

SDETRole 전체에서 검색할 내용을 입력하세요.

Pagefind 전문 검색 · 브라우저에서 실행됩니다 검색 페이지 열기 →