Testing

Nuxt 애플리케이션을 테스트하는 방법.
모듈 작성자인 경우, 모듈 작성자 가이드에서 더 구체적인 정보를 확인할 수 있습니다.

Nuxt는 @nuxt/test-utils를 통해 Nuxt 애플리케이션의 엔드 투 엔드 및 유닛 테스트에 대한 일급 지원을 제공합니다. @nuxt/test-utils는 현재 Nuxt 자체에서 사용하는 테스트와 모듈 생태계 전반의 테스트를 구동하는 테스트 유틸리티 및 설정 라이브러리입니다.

Installation

다른 테스트 의존성을 직접 관리할 수 있도록, @nuxt/test-utils는 여러 선택적 peer dependency와 함께 제공됩니다. 예를 들어:

  • 런타임 Nuxt 환경으로 happy-domjsdom 중에서 선택할 수 있습니다.
  • 엔드 투 엔드 테스트 러너로 vitest, cucumber, jest, playwright 중에서 선택할 수 있습니다.
  • playwright-core는 내장 브라우저 테스트 유틸리티를 사용하려는 경우(그리고 테스트 러너로 @playwright/test를 사용하지 않는 경우)에만 필요합니다.
npm i --save-dev @nuxt/test-utils vitest @vue/test-utils happy-dom playwright-core

Unit Testing

현재 Nuxt 런타임 환경이 필요한 코드를 위한 유닛 테스트 환경을 제공하고 있습니다. 현재는 vitest만 지원 합니다(다른 런타임을 추가하기 위한 기여는 언제나 환영합니다).

Setup

  1. nuxt.config 파일에 @nuxt/test-utils/module을 추가합니다(선택 사항). 이는 Nuxt DevTools에 Vitest 통합을 추가하여 개발 중에 유닛 테스트를 실행할 수 있게 해줍니다.
export default defineNuxtConfig({
  modules: [
    '@nuxt/test-utils/module',
  ],
})
  1. 다음 내용을 가진 vitest.config.ts를 생성합니다:
import { defineConfig } from 'vitest/config'
import { defineVitestProject } from '@nuxt/test-utils/config'

export default defineConfig({
  test: {
    projects: [
      {
        test: {
          name: 'unit',
          include: ['test/{e2e,unit}/*.{test,spec}.ts'],
          environment: 'node',
        },
      },
      await defineVitestProject({
        test: {
          name: 'nuxt',
          include: ['test/nuxt/*.{test,spec}.ts'],
          environment: 'nuxt',
        },
      }),
    ],
  },
})
vitest 설정 파일에서 @nuxt/test-utils를 import 할 때, package.json"type": "module"이 지정되어 있거나 vitest 설정 파일 이름을 적절히 변경해야 합니다.

예: vitest.config.m{ts,js}.

.env.test 파일을 사용하여 테스트용 환경 변수를 설정할 수 있습니다.

Using a Nuxt Runtime Environment

Vitest projects를 사용하면 어떤 테스트가 어떤 환경에서 실행될지 세밀하게 제어할 수 있습니다:

  • 유닛 테스트: 일반 유닛 테스트는 test/unit/에 두세요 - 속도를 위해 Node 환경에서 실행됩니다.
  • Nuxt 테스트: Nuxt 런타임 환경에 의존하는 테스트는 test/nuxt/에 두세요 - Nuxt 런타임 환경 내에서 실행됩니다.

Alternative: Simple Setup

더 단순한 설정을 선호하고 모든 테스트를 Nuxt 환경에서 실행하고 싶다면, 기본 설정을 사용할 수 있습니다:

import { defineVitestConfig } from '@nuxt/test-utils/config'

export default defineVitestConfig({
  test: {
    environment: 'nuxt',
    // Nuxt 전용 환경 옵션을 선택적으로 설정할 수 있습니다
    // environmentOptions: {
    //   nuxt: {
    //     rootDir: fileURLToPath(new URL('./playground', import.meta.url)),
    //     domEnvironment: 'happy-dom', // 'happy-dom' (기본값) 또는 'jsdom'
    //     overrides: {
    //       // 전달하고 싶은 다른 Nuxt 설정
    //     }
    //   }
    // }
  },
})

기본적으로 environment: 'nuxt'를 사용하는 단순 설정을 사용 중이라면, 필요에 따라 테스트 파일별로 Nuxt 환경벗어날 수 있습니다.

// @vitest-environment node
import { test } from 'vitest'

test('my test', () => {
  // ... Nuxt 환경 없이 테스트!
})
이 접근 방식은 Nuxt Vite 플러그인은 실행되지만 Nuxt entry와 nuxtApp은 초기화되지 않는 하이브리드 환경을 만들기 때문에 권장되지 않습니다. 이는 디버깅이 어려운 오류로 이어질 수 있습니다.

Organizing Your Tests

프로젝트 기반 설정을 사용하면, 다음과 같이 테스트를 구성할 수 있습니다:

Directory structure
test/
├── e2e/
   └── ssr.test.ts
├── nuxt/
   ├── components.test.ts
   └── composables.test.ts
├── unit/
   └── utils.test.ts

물론 어떤 테스트 구조든 선택할 수 있지만, 테스트 안정성을 위해 Nuxt 런타임 환경 테스트와 Nuxt 엔드 투 엔드 테스트를 분리하는 것이 중요합니다.

TypeScript Support in Tests

기본적으로 test/nuxt/tests/nuxt/ 디렉터리의 테스트 파일은 Nuxt 앱 TypeScript 컨텍스트에 포함됩니다. 이는 이들 파일이 Nuxt 별칭(~/, @/, #imports 등)을 인식하고, TypeScript가 Nuxt 앱에서 동작하는 자동 임포트를 인지한다는 의미입니다.

이는 Nuxt 런타임 환경이 필요한 테스트만 이 디렉터리에 배치하는 권장 구조와 일치합니다. test/unit/ 같은 다른 디렉터리의 유닛 테스트는 필요하다면 수동으로 추가할 수 있습니다.
Adding other test directories

Nuxt Vitest 환경에서 실행할 다른 디렉터리의 테스트가 있다면, 설정에 추가하여 Nuxt 앱 TypeScript 컨텍스트에 포함시킬 수 있습니다:

nuxt.config.ts
export default defineNuxtConfig({
  typescript: {
    tsConfig: {
      include: [
        // 이 경로는 생성된 .nuxt/tsconfig.json 기준 상대 경로입니다
        '../test/other-nuxt-context/**/*',
      ],
    },
  },
})
유닛 테스트는 자동 임포트나 composable 같은 Nuxt 런타임 기능에 의존해서는 안 됩니다. 테스트가 소스 파일(예: ~/utils/helpers)에서 import 하는 경우에만 TypeScript 경로 별칭 지원을 추가하고, Nuxt 전용 기능을 위해서는 추가하지 마세요.

Running Tests

프로젝트 설정을 사용하면, 서로 다른 테스트 스위트를 실행할 수 있습니다:

# 모든 테스트 실행
npx vitest

# 유닛 테스트만 실행
npx vitest --project unit

# Nuxt 테스트만 실행
npx vitest --project nuxt

# watch 모드로 테스트 실행
npx vitest --watch
Nuxt 환경 내에서 테스트를 실행하면, 테스트는 happy-dom 또는 jsdom 환경에서 실행됩니다. 테스트가 실행되기 전에 전역 Nuxt 앱이 초기화되며(예: app.vue에 정의한 플러그인이나 코드 실행 포함),이는 테스트에서 전역 상태를 변경하지 않도록 특히 주의해야 함을 의미합니다(또는 필요하다면 이후에 상태를 초기화해야 합니다).

🎭 Built-In Mocks

@nuxt/test-utils는 DOM 환경을 위한 몇 가지 내장 mock을 제공합니다.

intersectionObserver

기본값은 true이며, IntersectionObserver API를 위한 기능이 없는 더미 클래스를 생성합니다.

indexedDB

기본값은 false이며, fake-indexeddb를 사용해 IndexedDB API의 동작하는 mock을 생성합니다.

이들은 vitest.config.ts 파일의 environmentOptions 섹션에서 설정할 수 있습니다:

import { defineVitestConfig } from '@nuxt/test-utils/config'

export default defineVitestConfig({
  test: {
    environmentOptions: {
      nuxt: {
        mock: {
          intersectionObserver: true,
          indexedDb: true,
        },
      },
    },
  },
})

🛠️ Helpers

@nuxt/test-utils는 Nuxt 앱 테스트를 더 쉽게 하기 위한 여러 helper를 제공합니다.

mountSuspended

mountSuspended는 Nuxt 환경 내에서 어떤 Vue 컴포넌트든 마운트할 수 있게 해주며, 비동기 setup과 Nuxt 플러그인에서 제공하는 injection에 접근할 수 있습니다.

내부적으로 mountSuspended@vue/test-utilsmount를 감싸고 있으므로, 전달 가능한 옵션과 이 유틸리티 사용법에 대해서는 Vue Test Utils 문서를 참고하세요.

예시:

// tests/components/SomeComponents.nuxt.spec.ts
import { mountSuspended } from '@nuxt/test-utils/runtime'
import { SomeComponent } from '#components'

it('can mount some component', async () => {
  const component = await mountSuspended(SomeComponent)
  expect(component.text()).toMatchInlineSnapshot(
    '"This is an auto-imported component"',
  )
})
// tests/components/SomeComponents.nuxt.spec.ts
import { mountSuspended } from '@nuxt/test-utils/runtime'
import App from '~/app.vue'

// tests/App.nuxt.spec.ts
it('can also mount an app', async () => {
  const component = await mountSuspended(App, { route: '/test' })
  expect(component.html()).toMatchInlineSnapshot(`
      "<div>This is an auto-imported component</div>
      <div> I am a global component </div>
      <div>/</div>
      <a href="/test"> Test link </a>"
    `)
})

renderSuspended

renderSuspended@testing-library/vue를 사용해 Nuxt 환경 내에서 어떤 Vue 컴포넌트든 렌더링할 수 있게 해주며, 비동기 setup과 Nuxt 플러그인에서 제공하는 injection에 접근할 수 있습니다.

이는 screen, fireEvent와 같은 Testing Library 유틸리티와 함께 사용해야 합니다. 이를 사용하려면 프로젝트에 @testing-library/vue를 설치하세요.

추가로, Testing Library는 정리(cleanup)를 위해 테스트 전역(global)에 의존합니다. Vitest 설정에서 이를 활성화해야 합니다.

전달된 컴포넌트는 <div id="test-wrapper"></div> 내부에 렌더링됩니다.

예시:

// tests/components/SomeComponents.nuxt.spec.ts
import { renderSuspended } from '@nuxt/test-utils/runtime'
import { SomeComponent } from '#components'
import { screen } from '@testing-library/vue'

it('can render some component', async () => {
  await renderSuspended(SomeComponent)
  expect(screen.getByText('This is an auto-imported component')).toBeDefined()
})
// tests/App.nuxt.spec.ts
import { renderSuspended } from '@nuxt/test-utils/runtime'
import App from '~/app.vue'

it('can also render an app', async () => {
  const html = await renderSuspended(App, { route: '/test' })
  expect(html).toMatchInlineSnapshot(`
    "<div id="test-wrapper">
      <div>This is an auto-imported component</div>
      <div> I am a global component </div>
      <div>Index page</div><a href="/test"> Test link </a>
    </div>"
  `)
})

mockNuxtImport

mockNuxtImport를 사용하면 Nuxt의 자동 임포트 기능을 mock 할 수 있습니다. 예를 들어, useStorage를 mock 하려면 다음과 같이 할 수 있습니다:

import { mockNuxtImport } from '@nuxt/test-utils/runtime'

mockNuxtImport('useStorage', () => {
  return () => {
    return { value: 'mocked storage' }
  }
})

// 여기서 테스트를 작성하세요
mockNuxtImport는 테스트 파일당 각 mock 대상 import에 대해 한 번만 사용할 수 있습니다. 실제로는 vi.mock으로 변환되는 매크로이며, Vitest 문서에 설명된 대로 vi.mock은 hoist 됩니다.

Nuxt import를 mock 해야 하고 테스트 간에 서로 다른 구현을 제공해야 하는 경우, vi.hoisted를 사용해 mock을 생성하고 노출한 뒤, 해당 mock을 mockNuxtImport에서 사용할 수 있습니다. 그러면 mock 된 import에 접근할 수 있고, 테스트 간에 구현을 변경할 수 있습니다. 실행 간 mock 상태 변경을 되돌리기 위해 각 테스트 전후에 mock을 복원하는 것에 주의하세요.

import { vi } from 'vitest'
import { mockNuxtImport } from '@nuxt/test-utils/runtime'

const { useStorageMock } = vi.hoisted(() => {
  return {
    useStorageMock: vi.fn(() => {
      return { value: 'mocked storage' }
    }),
  }
})

mockNuxtImport('useStorage', () => {
  return useStorageMock
})

// 그런 다음, 테스트 내부에서
useStorageMock.mockImplementation(() => {
  return { value: 'something else' }
})

mockComponent

mockComponent를 사용하면 Nuxt 컴포넌트를 mock 할 수 있습니다. 첫 번째 인자는 PascalCase의 컴포넌트 이름이거나 컴포넌트의 상대 경로일 수 있습니다. 두 번째 인자는 mock 컴포넌트를 반환하는 팩토리 함수입니다.

예를 들어, MyComponent를 mock 하려면 다음과 같이 할 수 있습니다:

import { mockComponent } from '@nuxt/test-utils/runtime'

mockComponent('MyComponent', {
  props: {
    value: String,
  },
  setup (props) {
    // ...
  },
})

// 상대 경로나 alias도 동작합니다
mockComponent('~/components/my-component.vue', () => {
  // 또는 팩토리 함수
  return defineComponent({
    setup (props) {
      // ...
    },
  })
})

// 또는 SFC를 사용해 mock 컴포넌트로 리다이렉트할 수 있습니다
mockComponent('MyComponent', () => import('./MockComponent.vue'))

// 여기서 테스트를 작성하세요

Note: 팩토리 함수에서는 hoist 되기 때문에 로컬 변수를 참조할 수 없습니다. Vue API나 다른 변수에 접근해야 한다면, 팩토리 함수 내부에서 import 해야 합니다.

import { mockComponent } from '@nuxt/test-utils/runtime'

mockComponent('MyComponent', async () => {
  const { ref, h } = await import('vue')

  return defineComponent({
    setup (props) {
      const counter = ref(0)
      return () => h('div', null, counter.value)
    },
  })
})

registerEndpoint

registerEndpoint를 사용하면 mock 데이터를 반환하는 Nitro endpoint를 생성할 수 있습니다. 이는 데이터를 표시하기 위해 API에 요청을 보내는 컴포넌트를 테스트할 때 유용합니다.

첫 번째 인자는 endpoint 이름입니다(예: /test/). 두 번째 인자는 mock 데이터를 반환하는 팩토리 함수입니다.

예를 들어, /test/ endpoint를 mock 하려면 다음과 같이 할 수 있습니다:

import { registerEndpoint } from '@nuxt/test-utils/runtime'

registerEndpoint('/test/', () => ({
  test: 'test-field',
}))

기본적으로 요청은 GET 메서드를 사용해 이루어집니다. 함수 대신 객체를 두 번째 인자로 설정하여 다른 메서드를 사용할 수 있습니다.

import { registerEndpoint } from '@nuxt/test-utils/runtime'

registerEndpoint('/test/', {
  method: 'POST',
  handler: () => ({ test: 'test-field' }),
})

Note: 컴포넌트에서 외부 API로 요청을 보내는 경우, baseURL을 사용한 뒤 Nuxt Environment Override Config ($test)를 사용해 이를 비워서 모든 요청이 Nitro 서버로 가도록 할 수 있습니다.

Conflict with End-To-End Testing

@nuxt/test-utils/runtime@nuxt/test-utils/e2e는 서로 다른 테스트 환경에서 실행되어야 하므로 같은 파일에서 사용할 수 없습니다.

@nuxt/test-utils의 엔드 투 엔드 및 유닛 테스트 기능을 모두 사용하고 싶다면, 테스트를 별도의 파일로 분리할 수 있습니다. 그런 다음 특수 주석 // @vitest-environment nuxt를 사용해 파일별로 테스트 환경을 지정하거나, 런타임 유닛 테스트 파일 이름을 .nuxt.spec.ts 확장자로 지정할 수 있습니다.

app.nuxt.spec.ts

import { mockNuxtImport } from '@nuxt/test-utils/runtime'

mockNuxtImport('useStorage', () => {
  return () => {
    return { value: 'mocked storage' }
  }
})

app.e2e.spec.ts

import { $fetch, setup } from '@nuxt/test-utils/e2e'

await setup({
  setupTimeout: 10000,
})

// ...

Using @vue/test-utils

Nuxt에서 유닛 테스트를 위해 @vue/test-utils만 단독으로 사용하고 싶고, Nuxt composable, 자동 임포트 또는 컨텍스트에 의존하지 않는 컴포넌트만 테스트하는 경우, 다음 단계를 따라 설정할 수 있습니다.

  1. 필요한 의존성을 설치합니다.
npm i --save-dev vitest @vue/test-utils happy-dom @vitejs/plugin-vue
  1. 다음 내용을 가진 vitest.config.ts를 생성합니다:
import { defineConfig } from 'vitest/config'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
  plugins: [vue()],
  test: {
    environment: 'happy-dom',
  },
})
  1. package.json에 테스트용 새 명령을 추가합니다.
"scripts": {
  "build": "nuxt build",
  "dev": "nuxt dev",
  ...
  "test": "vitest"
},
  1. 다음 내용을 가진 간단한 <HelloWorld> 컴포넌트 app/components/HelloWorld.vue를 생성합니다:
<template>
  <p>Hello world</p>
</template>
  1. 새로 생성한 컴포넌트에 대한 간단한 유닛 테스트 ~/components/HelloWorld.spec.ts를 생성합니다.
import { describe, expect, it } from 'vitest'
import { mount } from '@vue/test-utils'

import HelloWorld from './HelloWorld.vue'

describe('HelloWorld', () => {
  it('component renders Hello world properly', () => {
    const wrapper = mount(HelloWorld)
    expect(wrapper.text()).toContain('Hello world')
  })
})
  1. vitest 명령을 실행합니다.
npm run test

축하합니다, 이제 Nuxt에서 @vue/test-utils로 유닛 테스트를 시작할 준비가 되었습니다! 즐거운 테스트 되세요!

End-To-End Testing

엔드 투 엔드 테스트를 위해, 테스트 러너로 Vitest, Jest, Cucumber, Playwright를 지원합니다.

Setup

@nuxt/test-utils/e2e helper 메서드를 사용하는 각 describe 블록에서, 시작하기 전에 테스트 컨텍스트를 설정해야 합니다.

test/my-test.spec.ts
import { describe, test } from 'vitest'
import { $fetch, setup } from '@nuxt/test-utils/e2e'

describe('My test', async () => {
  await setup({
    // test context options
  })

  test('my test', () => {
    // ...
  })
})

내부적으로 setup은 Nuxt 테스트 환경을 올바르게 설정하기 위해 beforeAll, beforeEach, afterEach, afterAll에서 여러 작업을 수행합니다.

setup 메서드에는 아래 옵션을 사용하세요.

Nuxt Config

  • rootDir: 테스트 대상이 될 Nuxt 앱이 있는 디렉터리 경로.
    • 타입: string
    • 기본값: '.'
  • configFile: 설정 파일 이름.
    • 타입: string
    • 기본값: 'nuxt.config'

Timings

  • setupTimeout: setupTest가 작업을 완료하는 데 허용되는 시간(밀리초). 전달된 옵션에 따라 Nuxt 애플리케이션의 빌드 또는 파일 생성이 포함될 수 있습니다.
    • 타입: number
    • 기본값: 120000 또는 Windows에서는 240000
  • teardownTimeout: 브라우저 종료 등 테스트 환경을 정리하는 데 허용되는 시간(밀리초).
    • 타입: number
    • 기본값: 30000

Features

  • build: 별도의 빌드 단계를 실행할지 여부.
    • 타입: boolean
    • 기본값: true (browser 또는 server가 비활성화되었거나 host가 제공된 경우 false)
  • server: 테스트 스위트에서 요청에 응답할 서버를 실행할지 여부.
    • 타입: boolean
    • 기본값: true (host가 제공된 경우 false)
  • port: 제공된 경우, 실행되는 테스트 서버 포트를 해당 값으로 설정합니다.
    • 타입: number | undefined
    • 기본값: undefined
  • host: 제공된 경우, 새 서버를 빌드하고 실행하는 대신 테스트 대상으로 사용할 URL입니다. 배포된 애플리케이션이나 이미 실행 중인 로컬 서버에 대해 "실제" 엔드 투 엔드 테스트를 실행하는 데 유용하며, 테스트 실행 시간을 크게 줄일 수 있습니다. 아래의 target host 엔드 투 엔드 예시를 참고하세요.
    • 타입: string
    • 기본값: undefined
  • browser: 내부적으로 Nuxt test utils는 브라우저 테스트를 수행하기 위해 playwright를 사용합니다. 이 옵션이 설정되면 브라우저가 실행되며 이후 테스트 스위트에서 제어할 수 있습니다.
    • 타입: boolean
    • 기본값: false
  • browserOptions
    • 타입: 다음 속성을 가진 object
      • type: 실행할 브라우저 타입 - chromium, firefox, webkit 중 하나
      • launch: 브라우저 실행 시 playwright에 전달될 옵션 object. 전체 API 레퍼런스를 참고하세요.
  • runner: 테스트 스위트에 사용할 러너를 지정합니다. 현재는 Vitest를 권장합니다.
    • 타입: 'vitest' | 'jest' | 'cucumber'
    • 기본값: 'vitest'
Target host end-to-end example

엔드 투 엔드 테스트의 일반적인 사용 사례는 프로덕션에 일반적으로 사용되는 환경에서 실행 중인 배포된 애플리케이션에 대해 테스트를 실행하는 것입니다.

로컬 개발 또는 자동 배포 파이프라인의 경우, 별도의 로컬 서버에 대해 테스트하는 것이 더 효율적이며, 테스트 프레임워크가 테스트 사이마다 다시 빌드하도록 하는 것보다 일반적으로 더 빠릅니다.

엔드 투 엔드 테스트를 위해 별도의 target host를 사용하려면, setup 함수의 host 속성에 원하는 URL을 제공하기만 하면 됩니다.

import { createPage, setup } from '@nuxt/test-utils/e2e'
import { describe, expect, it } from 'vitest'

describe('login page', async () => {
  await setup({
    host: 'http://localhost:8787',
  })

  it('displays the email and password fields', async () => {
    const page = await createPage('/login')
    expect(await page.getByTestId('email').isVisible()).toBe(true)
    expect(await page.getByTestId('password').isVisible()).toBe(true)
  })
})

APIs

$fetch(url)

서버 렌더링된 페이지의 HTML을 가져옵니다.

import { $fetch } from '@nuxt/test-utils/e2e'

const html = await $fetch('/')

fetch(url)

서버 렌더링된 페이지의 응답을 가져옵니다.

import { fetch } from '@nuxt/test-utils/e2e'

const res = await fetch('/')
const { body, headers } = res

url(path)

주어진 페이지의 전체 URL(테스트 서버가 실행 중인 포트 포함)을 가져옵니다.

import { url } from '@nuxt/test-utils/e2e'

const pageUrl = url('/page')
// 'http://localhost:6840/page'

Testing in a Browser

@nuxt/test-utils 내에서 Playwright를 사용한 브라우저 테스트를, 프로그래밍 방식 또는 Playwright 테스트 러너를 통해 내장 지원합니다.

createPage(url)

vitest, jest 또는 cucumber 내에서, createPage를 사용해 설정된 Playwright 브라우저 인스턴스를 생성하고(선택적으로) 실행 중인 서버의 경로로 이동시킬 수 있습니다. 사용 가능한 API 메서드에 대해서는 Playwright 문서에서 더 자세히 확인할 수 있습니다.

import { createPage } from '@nuxt/test-utils/e2e'

const page = await createPage('/page')
// `page` 변수에서 모든 Playwright API에 접근할 수 있습니다

Testing with Playwright Test Runner

또한 Playwright 테스트 러너 내에서 Nuxt를 테스트하기 위한 일급 지원을 제공합니다.

npm i --save-dev @playwright/test @nuxt/test-utils

앞에서 이 섹션에서 언급한 setup() 함수와 동일한 설정 세부 정보를 사용해 전역 Nuxt 설정을 제공할 수 있습니다.

playwright.config.ts
import { fileURLToPath } from 'node:url'
import { defineConfig, devices } from '@playwright/test'
import type { ConfigOptions } from '@nuxt/test-utils/playwright'

export default defineConfig<ConfigOptions>({
  use: {
    nuxt: {
      rootDir: fileURLToPath(new URL('.', import.meta.url)),
    },
  },
  // ...
})
Read more in 전체 예시 설정 보기.

테스트 파일에서는 @nuxt/test-utils/playwright에서 직접 expecttest를 사용해야 합니다:

tests/example.test.ts
import { expect, test } from '@nuxt/test-utils/playwright'

test('test', async ({ page, goto }) => {
  await goto('/', { waitUntil: 'hydration' })
  await expect(page.getByRole('heading')).toHaveText('Welcome to Playwright!')
})

또는 테스트 파일 내에서 Nuxt 서버를 직접 설정할 수도 있습니다:

tests/example.test.ts
import { expect, test } from '@nuxt/test-utils/playwright'

test.use({
  nuxt: {
    rootDir: fileURLToPath(new URL('..', import.meta.url)),
  },
})

test('test', async ({ page, goto }) => {
  await goto('/', { waitUntil: 'hydration' })
  await expect(page.getByRole('heading')).toHaveText('Welcome to Playwright!')
})