Cypress
는 End-to-End (E2E) 및 Component Testing에 사용되는 테스트 러너입니다.
create-next-app
과 with-cypress 예제를 함께 사용하여 빠르게 시작할 수 있습니다.
npx create-next-app@latest --example with-cypress with-cypress-app
Cypress
를 시작하기 위해 cypress
패키지를 설치하세요:
npm install --save-dev cypress
package.json
의 scripts
필드에 Cypress
를 추가하세요:
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"cypress": "cypress open",
}
처음으로 Cypress
를 실행하여 권장하는 폴더 구조를 사용하는 예제를 생성하세요:
npm run cypress
생성된 예제와 Cypress
문서의 Writing Your First Test 섹션을 살펴보면 Cypress
에 익숙해지는 데 도움이 될 것입니다.
Cypress
문서에는 이 두 가지 테스트 유형의 차이점과 각각을 사용하는 적절한 시기에 대한 가이드가 있습니다.
다음의 두 개의 Next.js 페이지를 가정합니다:
pages/index.js
import Link from 'next/link';
export default function Home() {
return (
<nav>
<h1>Homepage</h1>
<Link href="/about">About</Link>
</nav>
);
}
pages/about.js
export default function About() {
return (
<div>
<h1>About Page</h1>
<Link href="/">Homepage</Link>
</div>
);
}
내비게이션이 올바르게 작동하는지 확인하는 테스트를 추가하세요:
cypress/e2e/app.cy.js
describe('Navigation', () => {
it('should navigate to the about page', () => {
// index 페이지에서 시작합니다
cy.visit('http://localhost:3000/');
// "about"을 포함하는 href 속성을 가진 링크를 찾아 클릭합니다
cy.get('a[href*="about"]').click();
// 새로운 URL은 "/about"을 포함해야 합니다
cy.url().should('include', '/about');
// 새로운 페이지는 "About page"라는 h1 요소를 포함해야 합니다
cy.get('h1').contains('About Page');
});
});
cypress.config.js
구성 파일에 baseUrl: 'http://localhost:3000'
을 추가한다면 cy.visit("/") 대신 cy.visit("http://localhost:3000/")
를 사용할 수 있습니다.
첫 번째 Cypress
컴포넌트 테스트 작성하기
컴포넌트 테스트는 전체 애플리케이션을 번들로 묶거나 서버를 실행할 필요 없이 특정 컴포넌트를 빌드하고 마운트합니다. 이를 통해 성능이 개선된 테스트를 수행할 수 있으며 Cypress E2E
테스트와 동일한 API를 제공합니다.
참고: 컴포넌트 테스트는 Next.js 서버를 실행하지 않기 때문에
<Image />
와getServerSideProps
와 같은 기능은 기본적으로 동작하지 않습니다. 컴포넌트 테스트 내에서 이러한 기능을 작동시키는 예제에 대해서는 Cypress Next.js 문서를 참조하세요.
이전 섹션의 컴포넌트와 같은 컴포넌트를 가정하고 예상된 출력이 렌더링되는지 확인하는 테스트를 추가하세요:
pages/about.cy.js
import AboutPage from './about.js';
describe('<AboutPage />', () => {
it('should render and display expected content', () => {
// About 페이지를 위한 React 컴포넌트를 마운트합니다
cy.mount(<AboutPage />);
// 새로운 페이지는 "About page"라는 h1 요소를 포함해야 합니다
cy.get('h1').contains('About Page');
// 예상된 URL을 가진 링크가 존재하는지 확인합니다
// *링크를* 따라가는 것은 E2E 테스트에 더 적합합니다
cy.get('a[href="/"]').should('be.visible');
});
});
Cypress E2E 테스트는 실제 Next.js 애플리케이션을 테스트하므로 Cypress를 시작하기 전에 Next.js 서버를 실행해야 합니다. 실제 코드에 대해 테스트를 실행하여 애플리케이션의 동작과 더 가깝게 모사할 수 있도록 권장합니다.
다음을 실행하여 Next.js 서버를 빌드한 후에 Cypress를 시작하고 E2E 테스트 스위트를 실행하세요:
npm run build
npm run start
npm run cypress -- --e2e
참고: 대안으로
start-server-and-test
패키지를 설치하고package.json
의 scripts 필드에 추가할 수 있습니다:"test": "start-server-and-test start http://localhost:3000 cypress"
로 설정하여 Next.js 프로덕션 서버를 Cypress와 함께 시작할 수 있습니다. 변경 사항을 적용한 후에 애플리케이션을 다시 빌드해야 합니다.
npm run cypress -- --component를 실행하여 Cypress를 시작하고 컴포넌트 테스트 스위트를 실행하세요.
지금까지 Cypress를 실행하면 상호작용하는 브라우저가 열리는데, CI 환경에서는 이상적이지 않습니다. cypress run
명령어를 사용하여 Cypress를 헤드리스(headless) 모드로 실행할 수도 있습니다:
package.json
"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와 CI에 관련한 더 많은 정보는 다음 리소스를 참조하세요: