Nextjs 14에서 Cypress 설정하는 방법 초보자 가이드

Nextjs 14에서 Cypress 설정하는 방법 초보자 가이드
Cozy CodingPosted On Jul 23, 20246 min read

넥스트.자스와 함께 사이프레스 설정하기

사이프레스는 End-to-End (E2E) 및 컴포넌트 테스트에 사용되는 테스트 러너입니다. 이 페이지에서는 넥스트.자스와 함께 사이프레스를 설정하고 첫 번째 테스트를 작성하는 방법을 안내해 드립니다.

주의: 컴포넌트 테스트의 경우, 사이프레스는 현재 넥스트.자스 버전 14와 async 서버 컴포넌트를 지원하지 않습니다. 이 문제들은 추적 중입니다. 현재 컴포넌트 테스트는 넥스트.자스 버전 13에서 작동하며, async 서버 컴포넌트에 대해서는 E2E 테스트를 권장합니다. 사이프레스는 현재 TypeScript 버전 5와 moduleResolution: "bundler"를 지원하지 않습니다. 이 문제는 추적 중에 있습니다.

빠른 시작

create-next-app을 사용하여 with-cypress 예제를 통해 빠르게 시작할 수 있어요.

npx create-next-app@latest --example with-cypress with-cypress-app

수동 설정

수동으로 Cypress를 설정하려면, cypress를 개발 의존성으로 설치하세요:

npm install -D cypress
# 또는
yarn add -D cypress
# 또는
pnpm install -D cypress

package.json 스크립트 필드에 Cypress를 실행하는 명령어를 추가하세요:

{
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint",
    "cypress:open": "cypress open"
  }
}

첫 번째로 Cypress를 실행하여 Cypress 테스트 스위트를 엽니다:

npm run cypress:open

E2E 테스트 및/또는 컴포넌트 테스트를 구성할 수 있습니다. 이러한 옵션 중 하나를 선택하면 프로젝트에 cypress.config.js 파일과 cypress 폴더가 자동으로 생성됩니다.

첫 번째 Cypress E2E 테스트 작성 방법

cypress.config.js 파일이 다음 구성을 갖고 있는지 확인하세요.

import { defineConfig } from 'cypress'

export default defineConfig({
  e2e: {
    setupNodeEvents(on, config) {},
  },
})
const { defineConfig } = require('cypress')

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {},
  },
})

그런 다음 두 개의 새로운 Next.js 파일을 생성하십시오:

import Link from 'next/link'

export default function Page() {
  return (
    <div>
      <h1>Home</h1>
      <Link href="/about">About</Link>
    </div>
  )
}
import Link from 'next/link'
 
export default function Page() {
  return (
    <div>
      <h1>About</h1>
      <Link href="/">Home</Link>
    </div>
  )
}

내비게이션이 올바르게 작동하는지 확인하는 테스트를 추가해보세요:

describe('Navigation', () => {
  it('should navigate to the about page', () => {
    // 처음에는 홈페이지에서 시작합니다
    cy.visit('http://localhost:3000/')
 
    // "about"이라는 href 속성을 포함하는 링크를 찾아 클릭합니다
    cy.get('a[href*="about"]').click()
 
    // 새로운 URL에 "/about"이 포함되어야 합니다
    cy.url().should('include', '/about')
 
    // 새 페이지에는 "About"이라는 제목이 있는 h1 요소가 있어야 합니다
    cy.get('h1').contains('About')
  })
})

E2E 테스트 실행하기

심심하지 않게 릴레이하면, Cypress는 사용자가 애플리케이션을 탐색하는 것을 시뮬레이션합니다. 이를 위해서는 Next.js 서버가 실행 중이어야 합니다. 생산 코드에 대한 테스트를 실행하여 애플리케이션이 어떻게 동작할지를 더 가깝게 반영할 것을 권장합니다.

Next.js 애플리케이션을 빌드하려면 npm run build && npm run start를 실행한 후, 다른 터미널 창에서 npm run cypress:open을 실행하여 Cypress를 시작하고 E2E 테스트 스위트를 실행하세요.

알아두면 좋은 사실: cypress.config.js 구성 파일에 baseUrl: 'http://localhost:3000'을 추가하여 cy.visit("/") 대신 cy.visit("http://localhost:3000/")를 사용할 수 있습니다. 또는 start-server-and-test 패키지를 설치하여 Next.js 프로덕션 서버를 Cypress와 함께 실행할 수 있습니다. 설치 후 package.json 스크립트 필드에 "test": "start-server-and-test start http://localhost:3000 cypress"를 추가하세요. 새 변경 사항 이후 애플리케이션을 다시 빌드하는 것을 잊지 마세요.

첫 번째 Cypress 컴포넌트 테스트 만들기

컴포넌트 테스트는 전체 응용 프로그램을 번들하거나 서버를 시작할 필요 없이 특정 컴포넌트를 빌드하고 마운트합니다.

Cypress 앱에서 Component Testing을 선택한 다음 프론트엔드 프레임워크로 Next.js를 선택하십시오. 프로젝트에 cypress/component 폴더가 생성되고 cypress.config.js 파일이 업데이트되어 컴포넌트 테스트를 활성화합니다.

cypress.config.js 파일이 다음 구성을 가지고 있는지 확인하세요:

import { defineConfig } from 'cypress'

export default defineConfig({
  component: {
    devServer: {
      framework: 'next',
      bundler: 'webpack',
    },
  },
})
const { defineConfig } = require('cypress')
 
module.exports = defineConfig({
  component: {
    devServer: {
      framework: 'next',
      bundler: 'webpack',
    },
  },
})

이전 섹션에서와 같은 컴포넌트를 전제로 하여, 예상된 출력이 렌더링되는지 확인하는 테스트를 추가해보세요:

import Page from '../../app/page'
 
describe('<Page />', () => {
  it('예상된 콘텐츠가 렌더링되고 표시되어야 합니다', () => {
    // Home 페이지에 대한 React 컴포넌트를 마운트합니다
    cy.mount(<Page />)
 
    // 새로운 페이지에 "Home"이라는 h1 태그가 있어야 합니다
    cy.get('h1').contains('Home')
 
    // 예상된 URL을 가진 링크가 존재하는지 확인합니다
    // 링크를 따라가는 것은 E2E 테스트에 더 적합합니다
    cy.get('a[href="/about"]').should('be.visible')
  })
})

알아두면 좋은 사항: Cypress는 현재 async Server Components에 대한 컴포넌트 테스트를 지원하지 않습니다. E2E 테스트를 권장합니다. 컴포넌트 테스트는 Next.js 서버가 필요하지 않기 때문에, 서버를 필요로 하는 'Image'와 같은 기능은 기본적으로 작동하지 않을 수 있습니다.

컴포넌트 테스트 실행

터미널에서 npm run cypress:open을 실행하여 Cypress를 시작하고 컴포넌트 테스트 스위트를 실행하세요.

지속적인 통합 (CI)

대화식 테스트 외에도 CI 환경에 더 적합한 cypress run 명령을 사용하여 Cypress를 실행할 수 있습니다.

{
  "scripts": {
    //...
    "e2e": "start-server-and-test dev http://localhost:3000 \"cypress open --e2e\"",
    "e2e:headless": "start-server-and-test dev http://localhost:3000 \"cypress run --e2e\"",
    "component": "cypress open --component",
    "component:headless": "cypress run --component"
  }
}

이 리소스를 통해 Cypress 및 지속적 통합에 대해 더 알아볼 수 있어요:

  • Cypress 예제와 함께 Next.js
  • Cypress 지속적 통합 문서
  • Cypress GitHub Actions 가이드
  • 공식 Cypress GitHub 액션
  • Cypress Discord