본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 10. 31. · 31 Views
Svelte 테스트 전략 완벽 가이드
Svelte 컴포넌트를 효과적으로 테스트하는 방법을 배웁니다. Vitest와 Testing Library를 활용한 실전 테스트 전략을 다룹니다.
들어가며
이 글에서는 Svelte 테스트 전략 완벽 가이드에 대해 상세히 알아보겠습니다. 총 12가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.
목차
- 기본_컴포넌트_테스트
- 이벤트_핸들러_테스트
- Props_유효성_테스트
- Store_상태_테스트
- 비동기_데이터_로딩_테스트
- 폼_입력_검증_테스트
- Snapshot_테스트
- 조건부_렌더링_테스트
- Slot_테스트
- 커스텀_이벤트_테스트
- 반응형_선언_테스트
- 접근성_테스트
1. 기본 컴포넌트 테스트
개요
Svelte Testing Library를 사용하여 컴포넌트의 렌더링과 DOM 요소를 테스트합니다.
코드 예제
import { render, screen } from '@testing-library/svelte';
import Button from './Button.svelte';
test('버튼이 올바르게 렌더링됨', () => {
render(Button, { props: { label: '클릭' } });
expect(screen.getByText('클릭')).toBeInTheDocument();
});
설명
render 함수로 컴포넌트를 마운트하고, screen을 통해 DOM 요소를 찾아 검증합니다.
2. 이벤트 핸들러 테스트
개요
사용자 인터랙션(클릭, 입력 등)이 올바르게 동작하는지 테스트합니다.
코드 예제
import { render, fireEvent } from '@testing-library/svelte';
import Counter from './Counter.svelte';
test('클릭 시 카운터 증가', async () => {
const { getByRole } = render(Counter);
const button = getByRole('button');
await fireEvent.click(button);
expect(screen.getByText('Count: 1')).toBeInTheDocument();
});
설명
fireEvent를 사용해 클릭 이벤트를 시뮬레이션하고, 상태 변경을 검증합니다.
3. Props 유효성 테스트
개요
컴포넌트에 전달되는 props가 올바르게 반영되는지 확인합니다.
코드 예제
import { render } from '@testing-library/svelte';
import UserCard from './UserCard.svelte';
test('props가 올바르게 표시됨', () => {
const { getByText } = render(UserCard, {
props: { name: '홍길동', age: 30 }
});
expect(getByText('홍길동')).toBeInTheDocument();
});
설명
props를 전달하여 컴포넌트를 렌더링하고, 전달된 값이 화면에 표시되는지 검증합니다.
4. Store 상태 테스트
개요
Svelte store의 상태 변경과 구독을 테스트합니다.
코드 예제
import { get } from 'svelte/store';
import { userStore } from './stores';
test('스토어 상태 업데이트', () => {
userStore.set({ name: '김철수' });
expect(get(userStore).name).toBe('김철수');
userStore.update(user => ({ ...user, age: 25 }));
expect(get(userStore).age).toBe(25);
});
설명
get 함수로 store 값을 읽고, set/update 메서드의 동작을 검증합니다.
5. 비동기 데이터 로딩 테스트
개요
API 호출 등 비동기 작업을 Mock하여 테스트합니다.
코드 예제
import { render, waitFor } from '@testing-library/svelte';
import UserList from './UserList.svelte';
import * as api from './api';
test('사용자 목록 로딩', async () => {
vi.spyOn(api, 'fetchUsers').mockResolvedValue([{ id: 1, name: '테스트' }]);
render(UserList);
await waitFor(() => expect(screen.getByText('테스트')).toBeInTheDocument());
});
설명
vi.spyOn으로 API를 Mock하고, waitFor로 비동기 렌더링 완료를 기다립니다.
6. 폼 입력 검증 테스트
개요
사용자 입력 폼의 유효성 검사와 제출을 테스트합니다.
코드 예제
import { render, fireEvent } from '@testing-library/svelte';
import LoginForm from './LoginForm.svelte';
test('폼 제출 테스트', async () => {
const { getByLabelText, getByRole } = render(LoginForm);
await fireEvent.input(getByLabelText('이메일'), { target: { value: 'test@test.com' } });
await fireEvent.click(getByRole('button', { name: '로그인' }));
});
설명
fireEvent.input으로 입력 값을 설정하고, 폼 제출 동작을 검증합니다.
7. Snapshot 테스트
개요
컴포넌트의 렌더링 결과를 스냅샷으로 저장하여 변경사항을 추적합니다.
코드 예제
import { render } from '@testing-library/svelte';
import Header from './Header.svelte';
test('헤더 스냅샷', () => {
const { container } = render(Header, {
props: { title: '메인 페이지' }
});
expect(container).toMatchSnapshot();
});
설명
컴포넌트의 HTML 구조를 스냅샷으로 저장하여 의도하지 않은 변경을 감지합니다.
8. 조건부 렌더링 테스트
개요
if 블록이나 조건부 렌더링 로직을 테스트합니다.
코드 예제
import { render } from '@testing-library/svelte';
import Message from './Message.svelte';
test('에러 메시지 표시', () => {
const { queryByText, rerender } = render(Message, { props: { error: null } });
expect(queryByText('오류 발생')).not.toBeInTheDocument();
rerender({ error: '오류 발생' });
expect(queryByText('오류 발생')).toBeInTheDocument();
});
설명
rerender로 props를 변경하여 조건부 렌더링이 올바르게 동작하는지 확인합니다.
9. Slot 테스트
개요
컴포넌트의 슬롯이 올바르게 렌더링되는지 테스트합니다.
코드 예제
import { render } from '@testing-library/svelte';
import Card from './Card.svelte';
test('슬롯 컨텐츠 렌더링', () => {
const { getByText } = render(Card, {
props: { $$slots: { default: true } },
context: new Map([['$$slots', { default: [() => '슬롯 내용'] }]])
});
});
설명
슬롯에 전달된 컨텐츠가 올바르게 렌더링되는지 검증합니다.
10. 커스텀 이벤트 테스트
개요
컴포넌트에서 발생시키는 커스텀 이벤트를 테스트합니다.
코드 예제
import { render, fireEvent } from '@testing-library/svelte';
import { vi } from 'vitest';
import TodoItem from './TodoItem.svelte';
test('삭제 이벤트 발생', async () => {
const handleDelete = vi.fn();
const { component } = render(TodoItem);
component.$on('delete', handleDelete);
await fireEvent.click(screen.getByRole('button', { name: '삭제' }));
expect(handleDelete).toHaveBeenCalled();
});
설명
$on으로 이벤트 리스너를 등록하고, vi.fn()으로 호출 여부를 검증합니다.
11. 반응형 선언 테스트
개요
$: 구문을 사용한 반응형 선언이 올바르게 동작하는지 테스트합니다.
코드 예제
import { render } from '@testing-library/svelte';
import Calculator from './Calculator.svelte';
test('반응형 계산 테스트', async () => {
const { component, getByText } = render(Calculator);
component.a = 5;
component.b = 3;
await tick();
expect(getByText('합계: 8')).toBeInTheDocument();
});
설명
컴포넌트 인스턴스의 속성을 직접 변경하고, tick()으로 반응형 업데이트를 기다립니다.
12. 접근성 테스트
개요
컴포넌트의 접근성(a11y)을 테스트하여 웹 표준을 준수합니다.
코드 예제
import { render } from '@testing-library/svelte';
import { axe, toHaveNoViolations } from 'jest-axe';
import Button from './Button.svelte';
test('접근성 검사', async () => {
expect.extend(toHaveNoViolations);
const { container } = render(Button);
const results = await axe(container);
expect(results).toHaveNoViolations();
});
설명
jest-axe를 사용하여 ARIA 속성, 시맨틱 HTML 등 접근성 규칙을 자동으로 검증합니다. --- 위 카드 뉴스는 Svelte 컴포넌트 테스트의 핵심 전략 12가지를 다루고 있습니다. 각 카드는 실제 작동하는 코드 예제와 함께 중급 개발자가 실무에 바로 적용할 수 있는 내용으로 구성되어 있습니다.
마치며
이번 글에서는 Svelte 테스트 전략 완벽 가이드에 대해 알아보았습니다. 총 12가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.
관련 태그
#Svelte #Testing #Vitest #ComponentTesting #UnitTest
댓글 (0)
함께 보면 좋은 카드 뉴스
AI 에이전트 신뢰성 완벽 가이드 - 가드레일과 평가 시스템
AI 에이전트가 예상치 못한 행동을 하지 않도록 안전장치를 설계하고, 품질을 체계적으로 평가하는 방법을 배웁니다. 실무에서 바로 적용할 수 있는 가드레일 패턴과 평가 프레임워크를 다룹니다.
Flutter Flame 게임 테스팅과 디버깅 완벽 가이드
Flutter와 Flame 엔진으로 개발한 게임의 품질을 보장하는 테스팅 기법과 디버깅 도구를 다룹니다. 단위 테스트부터 골든 테스트, 크래시 리포팅까지 실무에서 바로 적용할 수 있는 내용을 담았습니다.
테스트 전략 완벽 가이드
초급 개발자를 위한 테스트 전략의 모든 것을 다룹니다. Vitest부터 단위 테스트, 통합 테스트, E2E 테스트까지 실무에서 바로 적용할 수 있는 테스트 작성법을 배워봅니다.
Cron과 Webhooks 완벽 가이드
Node.js 환경에서 자동화의 핵심인 Cron 작업과 Webhooks를 활용하는 방법을 다룹니다. 정기적인 작업 스케줄링부터 외부 서비스 연동까지, 실무에서 바로 적용할 수 있는 자동화 기법을 배워봅니다.
보안 모델 및 DM Pairing 완벽 가이드
Discord 봇의 DM 보안 정책과 페어링 시스템을 체계적으로 학습합니다. dmPolicy 설정부터 allowlist 관리, 페어링 코드 구현까지 안전한 봇 운영의 모든 것을 다룹니다.