— 컴포넌트 테스트와 실제 브라우저의 결합
Vitest Browser Mode는 실제 브라우저에서 컴포넌트 단위 테스트를 실행하는 새로운 테스트 방식이다.
JSDOM 기반의 단위 테스트와 E2E 사이의 공백을 메우는 접근으로, Vitest v4부터 Stable로 제공된다.


기존 Vitest/Jest 테스트는 대부분 JSDOM에서 실행된다. 이는 빠르고 유용하지만 다음과 같은 한계가 있다.
localStorage, sessionStoragenavigator.clipboardIntersectionObserver, ResizeObserver이런 Web API는 모킹이 필요하거나 정확하지 않다.
Vitest Browser Mode는 실제 Chrome/Firefox/WebKit에서 컴포넌트를 렌더링해 이 문제를 제거한다.
E2E (Playwright/Cypress)
Vitest Browser Mode
즉, 컴포넌트 테스트의 현실성을 크게 끌어올린 방식이다.
render()는 asyncimport { render } from 'vitest-browser-react';
test('render', async () => {
const screen = await render(<Component />);
});
screen (query 함수 포함)getByText, getByRole 등은 HTMLElement가 아닌 Locator를 반환한다.
const heading = screen.getByRole('heading');
expect(heading).toHaveTextContent('Hello');
await expect.element()상태 변화가 있는 경우, Locator를 대상으로 polling 기반 검증을 사용한다.
await expect
.element(screen.getByRole('heading'))
.toHaveTextContent('updated');
waitFor 개념에 해당const buttons = screen.getByRole('button');
expect(buttons).toHaveLength(2);
expect(buttons.first()).toHaveTextContent('First');
expect(buttons.last()).toHaveTextContent('Second');
getAllBy... 없음await expect
.element(screen.getByRole('heading'))
.not.toBeInTheDocument();
queryBy... 없음not.toBeInTheDocument() 사용Locator 자체에 인터랙션 메서드가 있다.
await screen.getByRole('button').click();
.click(), .fill(), .selectOptions() 등act() 불필요Vitest Browser Mode는 브라우저 실행 방식을 Provider로 분리한다.
playwright (권장)
preview
webdriverio
실무에서는 Playwright Provider가 사실상 표준이다.
*.browser.ts(x)browser.enabled = trueheadless: true브라우저 실행 전 1회:
playwright install --with-deps
Vitest Browser Mode는 새로운 테스트 러너가 아니다.
컴포넌트 테스트의 실행 환경을 현실로 끌어오는 방식이다.
이 네 가지를 동시에 요구한다면,
Vitest Browser Mode는 충분히 표준 테스트 도구 후보에 올라와 있다.