본문으로 바로가기
제품데스크톱 도구TASTECAD도면 확인TASTEFILES파일 관리TASTEFTP파일 전송TASTESSH원격 작업공간TASTEZIP압축과 해제개발 도구TASTECODERust 통합 개발 환경TASTESTUDIO통합 개발·테스트 환경TASTEETL데이터 통합(ETL)서버TASTEREMOTE원격 데스크톱 서버TASTEGEO공간정보 서버TASTEMAIL메일 작업공간시작하기다운로드문서구매모든 제품
마켓플레이스
소식
개발소식오늘의 개발 소식개발 문서프로그래밍 언어RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron알고리즘알고리즘 기초알고리즘 핵심알고리즘 심화실무 알고리즘
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스커뮤니티 안내
협업기술 전수홈페이지 구축데스크톱 앱 구축릴리스·결제 파이프라인판매 파트너문의
서비스원격 데스크톱설치 패키지 커스텀
TASTEDEV
제품

데스크톱 도구

TASTECAD복잡한 도면을 가볍게 열다TASTEFILES필요한 파일만, 가장 빠르게TASTEFTP파일이 오가는 가장 단정한 길TASTESSH서버와 나 사이, 더 단단한 연결TASTEZIP더 빠르게 묶고, 더 안전하게 풀다

개발 도구

TASTECODERust 앱을 편집 · 빌드 · 디버깅 · 테스트까지 한 창에서TASTESTUDIO편집부터 원격 테스트와 승인 기반 AI 수정까지TASTEETL값을 보며 데이터를 옮깁니다

서버

TASTEREMOTE우리 회사 서버로 운영하는 원격 데스크톱TASTEGEOGeoServer 호환 공간정보 서버를 Rust로 다시 세웁니다TASTEMAIL메일의 주도권을 다시 내 손에

시작하기

다운로드모든 제품 최신 판문서제품 사용법구매구독 · 영구 라이선스모든 제품모든 제품 한눈에
모든 제품
마켓플레이스소식
개발

소식

오늘의 개발 소식언어 · 프레임워크 · GitHub · AI 공식 발표개발 문서언어 · 프레임워크 · 알고리즘 안내서

프로그래밍 언어

RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart

프레임워크

프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular
서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express
앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron

알고리즘

알고리즘 기초복잡도 분석 · 정렬 · 탐색 · 기본 자료구조 · 트리와 힙알고리즘 핵심그래프 탐색 · 최단 경로와 최소 신장 트리 · 동적 계획법 · 탐욕 알고리즘 · 분할 정복 · 백트래킹알고리즘 심화문자열 알고리즘 · 수학과 정수론 · 비트 연산 · 구간 트리 · 유니온 파인드실무 알고리즘코딩 면접 풀이 전략 · LRU 캐시 · 레이트 리미터 · 일관된 해시
개발 문서 전체 보기
커뮤니티
프로젝트빌더와 작업 발견개발 로그결정과 시행착오프롬프트재사용 가능한 지시AI 도구 이슈Claude · Codex · Gemini 문제와 우회법쇼케이스완성된 결과커뮤니티 안내공개하고 함께 만드는 방식
협업
기술 전수Rust·egui 네이티브 앱 만들기홈페이지 구축10개 언어, 계정, 문서·다운로드데스크톱 앱 구축Rust·egui, WebView 없이릴리스·결제 파이프라인서명 · MSI·deb·rpm·AppImage · 해시판매 파트너소개하고 결제액의 30% 받기문의구축 · 제휴 · 투자 문의
서비스
원격 데스크톱브라우저로 내 컴퓨터에 접속설치 패키지 커스텀필요한 기능만, 설정은 미리
구매
KO
한국어EnglishDeutschEspañolFrançaisItalianoPortuguês (Brasil)日本語简体中文繁體中文
로그인
로그인
TASTEDEV

작은 도구부터, 더 좋은 개발까지.

support@tastedev.netTASTEDEV 후원하기
제품제품군구매문서다운로드마켓플레이스고객 지원
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스
정책개인정보처리방침이용약관구독 약관환불 정책커뮤니티 운영 정책
계정로그인가입하기
방문자
오늘
012345678901234567890123456789012345678901234567890123456789
어제
012345678901234567890123456789012345678901234567890123456789
누적 조회
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
상호
지엑스소프트
대표자
최영구
사업자등록번호
853-44-00368
주소
인천광역시 미추홀구 경인로 351 9층 V24
전화
+82-10-4404-1523
이메일
whitecalvin@tastedev.net
개인정보 보호책임자
최영구

© 2026 TASTEDEV제품 정보는 현재 검증된 개발 소스를 기준으로 합니다.출시·고도화 중

Vue.js · Nuxt 문서
Vue.js · Nuxt
Vue와 Nuxt 시작하기프로젝트 구조핵심 개념: SFC, 반응성, 컴포넌트, Nuxt 라우팅데이터와 상태 관리테스트빌드와 배포
토론

Vue.js · Nuxt 안내서 · 5/6

테스트

Vue 프로젝트의 테스트는 보통 세 층으로 나눕니다. composable과 스토어 같은 순수 로직은 Vitest로, 컴포넌트는 Vitest와 Vue Test Utils로, 사용자의 실제 흐름은 Playwright 같은 E2E 도구로 검사합니다. Nuxt 프로젝트에서는 @nuxt/test-utils가 Nuxt 환경을 테스트 안에 띄워 줍니다.

Vitest 준비

create-vue에서 Vitest를 골랐다면 설정이 이미 되어 있습니다. 직접 추가할 때는 다음 패키지를 설치합니다.

npm install -D vitest @vue/test-utils jsdom

vitest.config.ts에서 Vite 설정을 이어받고, 브라우저 API를 흉내 내는 jsdom 환경을 지정합니다.

import { fileURLToPath } from "node:url";
import { mergeConfig, defineConfig, configDefaults } from "vitest/config";
import viteConfig from "./vite.config";

export default mergeConfig(
  viteConfig,
  defineConfig({
    test: {
      environment: "jsdom",
      exclude: [...configDefaults.exclude, "e2e/**"],
      root: fileURLToPath(new URL("./", import.meta.url)),
    },
  }),
);

npm run test:unit(또는 npx vitest)을 실행하면 감시 모드로 테스트가 돌고, 파일을 저장할 때마다 관련 테스트만 다시 실행됩니다.

로직과 스토어 테스트

composable은 일반 함수처럼 부르고 결과를 확인합니다. Pinia 스토어는 테스트마다 새 Pinia를 활성화해 서로 영향을 주지 않게 합니다.

import { describe, it, expect, beforeEach } from "vitest";
import { setActivePinia, createPinia } from "pinia";
import { useCounter } from "@/composables/useCounter";
import { useCartStore } from "@/stores/cart";

describe("useCounter", () => {
  it("increment와 double", () => {
    const { count, double, increment } = useCounter(1);
    increment();
    expect(count.value).toBe(2);
    expect(double.value).toBe(4);
  });
});

describe("cart store", () => {
  beforeEach(() => setActivePinia(createPinia()));

  it("같은 상품은 수량이 늘어난다", () => {
    const cart = useCartStore();
    cart.add({ id: 1, name: "책", price: 100 });
    cart.add({ id: 1, name: "책", price: 100 });
    expect(cart.items[0].qty).toBe(2);
    expect(cart.total).toBe(200);
  });
});

컴포넌트 테스트

Vue Test Utils의 mount는 컴포넌트를 렌더링한 래퍼를 돌려줍니다. props를 넘기고, 요소를 찾아 이벤트를 일으킨 뒤 화면 글자나 내보낸 이벤트를 확인합니다. DOM 갱신은 비동기이므로 trigger와 setValue는 await합니다.

import { describe, it, expect } from "vitest";
import { mount } from "@vue/test-utils";
import TodoItem from "@/components/TodoItem.vue";

describe("TodoItem", () => {
  it("글자를 보여 주고 삭제 이벤트를 내보낸다", async () => {
    const wrapper = mount(TodoItem, { props: { text: "장보기", done: false } });

    expect(wrapper.text()).toContain("장보기");

    await wrapper.find("button").trigger("click");
    expect(wrapper.emitted("remove")?.[0]).toEqual(["user"]);
  });
});

전역 플러그인이 필요한 컴포넌트는 mount(Comp, { global: { plugins: [router, createPinia()] } })처럼 넘깁니다. 구현 세부보다 사용자가 보는 결과를 확인하는 테스트가 리팩터링에 강합니다.

Nuxt 테스트 유틸리티

Nuxt 컴포넌트는 자동 가져오기와 Nuxt 컴포저블에 기대므로 일반 jsdom 환경에서는 그대로 돌지 않습니다. @nuxt/test-utils는 테스트 안에서 Nuxt 런타임을 띄우는 nuxt 환경과 mountSuspended를 제공합니다.

npm install -D @nuxt/test-utils vitest @vue/test-utils happy-dom
// vitest.config.ts
import { defineVitestConfig } from "@nuxt/test-utils/config";

export default defineVitestConfig({
  test: { environment: "nuxt" },
});
// tests/counter.nuxt.test.ts
import { it, expect } from "vitest";
import { mountSuspended } from "@nuxt/test-utils/runtime";
import AppCounter from "~/components/AppCounter.vue";

it("Nuxt 환경에서 렌더링된다", async () => {
  const wrapper = await mountSuspended(AppCounter);
  expect(wrapper.text()).toContain("0");
});

mountSuspended는 비동기 setup과 useFetch를 기다린 뒤 결과를 돌려줍니다. 서버 API 호출은 registerEndpoint로 가짜 응답을 등록할 수 있습니다.

Playwright로 E2E 테스트

E2E 테스트는 실제 브라우저로 앱을 열어 사용자처럼 조작합니다. create-vue에서 Playwright를 골랐거나 npm init playwright@latest로 추가합니다.

// e2e/home.spec.ts
import { test, expect } from "@playwright/test";

test("검색어로 목록을 거른다", async ({ page }) => {
  await page.goto("/");
  await page.getByPlaceholder("검색").fill("Vue");
  await expect(page.getByRole("listitem")).toHaveCount(1);
});

playwright.config.ts의 webServer 항목에 개발 서버나 미리보기 서버 실행 명령을 적어 두면 테스트 전에 자동으로 서버가 켜집니다. npx playwright test로 실행하고, --ui를 붙이면 단계별로 살펴볼 수 있습니다.

정리

  • 로직·스토어·컴포넌트는 Vitest와 Vue Test Utils로 빠르게 검사합니다.
  • Pinia 스토어 테스트에서는 테스트마다 setActivePinia(createPinia())를 부릅니다.
  • Nuxt 컴포넌트는 @nuxt/test-utils의 nuxt 환경과 mountSuspended로 테스트합니다.
  • 핵심 사용자 흐름은 Playwright E2E 테스트로 실제 브라우저에서 확인합니다.
이 장에 대해 질문이 있나요?
이전 장데이터와 상태 관리다음 장빌드와 배포

댓글 0개

인기 댓글순최신순

로그인 · 로그인하면 댓글을 남길 수 있습니다.