Cypress یک فریمورک تست end-to-end (E2E) مدرن و منبعباز (open-source) برای برنامههای وب است که بر پایه JavaScript/TypeScript کار میکند. این ابزار بهطور خاص برای تست رابط کاربری (UI) و رفتار واقعی برنامههای وب در مرورگر طراحی شده و جایگزین محبوب Selenium در بسیاری از پروژهها شده است.
Cypress چیه؟
Cypress مستقیماً درون مرورگر (مثل Chrome،Engine) اجرا میشود و به جای استفاده از WebDriver (مثل Selenium)، کنترل کامل روی مرورگر و کد برنامه را دارد. این ویژگی باعث میشود:
- تستها سریعتر باشند.
- دیباگ آسانتر باشد (با اسکرینشات، ویدیو و لاگهای دقیق).
- از Flake-y tests (تستهای ناپایدار) کمتری داشته باشیم.
چه موقع از Cypress استفاده میشه؟
| سناریو | توضیح |
|---|---|
| تست End-to-End (E2E) | شبیهسازی رفتار واقعی کاربر از ورود تا خروج (مثلاً ثبتنام، خرید، ویرایش پروفایل). |
| تست Integration | تست تعامل بین کامپوننتها، API و UI با هم. |
| تست Component (در React/Vue/Angular) | تست جداگانه کامپوننتهای UI بدون نیاز به سرور (با Cypress Component Testing). |
| تست در CI/CD | اجرای خودکار تستها در GitHub Actions، GitLab CI، Jenkins و… |
| تست برنامههای SPA (Single Page Apps) | مثل React, Vue, Angular که تغییرات سریع UI دارند. |
مزایای کلیدی Cypress
| مزیت | توضیح |
|---|---|
| سرعت بالا | تستها در مرورگر واقعی اجرا میشوند، نه از راه دور. |
| دیباگ آسان | تایمتراول، اسکرینشات خودکار، ویدیو، لاگ DOM. |
| اجرای موازی | در Cypress Cloud (پولی) یا با ابزارهای دیگر. |
| نوشتن آسان | سینتکس ساده و خوانا با Mocha + Chai. |
| بدون نیاز به WebDriver | نصب و راهاندازی سادهتر از Selenium. |
مثال ساده (تست ورود به سیستم)
describe('تست ورود', () => {
it('ورود موفق با اطلاعات صحیح', () => {
cy.visit('https://example.com/login')
cy.get('#username').type('user@test.com')
cy.get('#password').type('123456')
cy.get('button[type="submit"]').click()
cy.url().should('include', '/dashboard')
cy.contains('خوش آمدید').should('be.visible')
})
})چه موقع نباید از Cypress استفاده کرد؟
| مورد | دلیل |
|---|---|
| تست اپلیکیشن موبایل native | فقط برای وب است (هرچند با افزونههایی میتوان تست کرد). |
| تست مرورگرهای قدیمی (IE) | پشتیبانی محدودی دارد. |
| تست غیرمرورگری (مثل API تنها) | بهتر است از Jest, Supertest یا Postman استفاده شود. |
خلاصه
Cypress = ابزار قدرتمند، سریع و کاربرپسند برای تست خودکار رابط کاربری وب
استفاده اصلی: تست E2E و Component در برنامههای مدرن وب (React, Vue, Angular و…)
اگر پروژه وب داری و میخوای تستهای قابل اعتماد، سریع و قابل نگهداری داشته باشی — Cypress انتخاب عالیه.
در پروژههای Next.js و Angular میتونی به راحتی از Cypress برای تست End-to-End (E2E) و Component Testing استفاده کنی. در ادامه راهنمای کامل و عملی برای هر دو فریمورک رو میبینی (با دستورات نصب، تنظیمات و مثال واقعی).
Cypress در پروژه Next.js
مرحله ۱: نصب Cypress
npm install cypress --save-dev
# یا با yarn
yarn add cypress --devمرحله ۲: راهاندازی اولیه
npx cypress openاین دستور:
- پوشه
cypress/رو ایجاد میکنه - فایلهای تنظیمات (
cypress.config.ts) رو میسازه - مرورگر Cypress رو باز میکنه
مرحله ۳: تنظیمات برای Next.js (مهم!)
در cypress.config.ts این تنظیمات رو اضافه کن:
import { defineConfig } from 'cypress'
export default defineConfig({
e2e: {
baseUrl: 'http://localhost:3000', // آدرس dev server Next.js
setupNodeEvents(on, config) {
// اختیاری: task برای کار با Node.js
},
},
component: {
devServer: {
framework: 'next',
bundler: 'webpack',
},
},
})این تنظیمات به Cypress میگه که چطور Next.js رو اجرا کنه.
مرحله ۴: اجرای تست E2E
# در ترمینال جداگانه
npm run dev # اجرای Next.js
# در ترمینال دیگر
npx cypress open # یا npx cypress runمثال: تست صفحه اصلی (pages/index.tsx)
// cypress/e2e/home.cy.ts
describe('صفحه اصلی', () => {
it('باید عنوان درست نمایش دهد', () => {
cy.visit('/')
cy.contains('Welcome to Next.js').should('be.visible')
})
it('باید به صفحه درباره برود', () => {
cy.visit('/')
cy.get('a[href="/about"]').click()
cy.url().should('include', '/about')
cy.contains('About Page').should('be.visible')
})
})تست کامپوننت (Component Testing) در Next.js
- یک فایل تست بساز:
components/Button.cy.tsx
// components/Button.cy.tsx
import { Button } from '@/components/Button'
describe('Button Component', () => {
it('باید کلیک شود و متن تغییر کند', () => {
const onClick = cy.stub().as('clickHandler')
cy.mount(<Button onClick={onClick}>کلیک کن</Button>)
cy.contains('کلیک کن').click()
cy.get('@clickHandler').should('have.been.called')
})
})- در
cypress.config.tsمطمئن شو کهcomponentفعال باشه. - اجرا:
npx cypress open --componentCypress در پروژه Angular
مرحله ۱: نصب Cypress
ng add @cypress/schematicاین دستور بهصورت خودکار:
- Cypress رو نصب میکنه
- تنظیمات رو به
angular.jsonوcypress.config.tsاضافه میکنه- فایلهای نمونه میسازه
مرحله ۲: تنظیمات خودکار (اگر دستی میخوای)
در cypress.config.ts:
import { defineConfig } from 'cypress'
export default defineConfig({
e2e: {
baseUrl: 'http://localhost:4200', // آدرس Angular dev server
supportFile: 'cypress/support/e2e.ts',
},
component: {
devServer: {
framework: 'angular',
bundler: 'webpack',
},
},
})مرحله ۳: اجرای تست
# ترمینال ۱
ng serve
# ترمینال ۲
npx cypress open
# یا
npx cypress runمثال: تست صفحه لاگین
// cypress/e2e/login.cy.ts
describe('صفحه ورود', () => {
beforeEach(() => {
cy.visit('/login')
})
it('باید با اطلاعات صحیح وارد شود', () => {
cy.get('[data-cy=username]').type('admin@test.com')
cy.get('[data-cy=password]').type('123456')
cy.get('[data-cy=submit]').click()
cy.url().should('include', '/dashboard')
cy.get('[data-cy=welcome]').should('contain', 'خوش آمدید')
})
})نکته: از
data-cyبه جای کلاس یا آیدی استفاده کن تا تستها پایدار بمونن.
تست کامپوننت در Angular
// src/app/button/button.component.cy.ts
import { ButtonComponent } from './button.component'
describe('ButtonComponent', () => {
it('باید کلیک شود', () => {
const clickSpy = cy.spy().as('clickSpy')
cy.mount(ButtonComponent, {
componentProperties: {
clicked: clickSpy
}
})
cy.get('button').click()
cy.get('@clickSpy').should('have.been.called')
})
})مقایسه سریع
| ویژگی | Next.js | Angular |
|---|---|---|
| نصب | npm install cypress + دستی | ng add @cypress/schematic (خودکار) |
| Component Testing | پشتیبانی کامل | پشتیبانی کامل |
baseUrl | http://localhost:3000 | http://localhost:4200 |
| CI/CD | GitHub Actions + cypress run | همان |
اجرای در CI/CD (مثال GitHub Actions)
# .github/workflows/cypress.yml
name: Cypress Tests
on: [push]
jobs:
cypress:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install dependencies
run: npm ci
- name: Run Next.js/Angular + Cypress
run: |
npm run dev & npx wait-on http://localhost:3000
npx cypress runنکات طلایی
| نکته | توضیح |
|---|---|
از data-cy استفاده کن | برای انتخاب المنتها در تست (مثلاً data-cy="submit-btn") |
از cy.intercept() برای API استفاده کن | ماک کردن درخواستها |
تستها رو در beforeEach ریست کن | برای استقلال تستها |
| از Cypress Studio استفاده کن | برای ساخت سریع تست (در GUI) |
منابع رسمی
- Next.js + Cypress: https://nextjs.org/docs/testing#cypress
- Angular + Cypress: https://cypress.io/angular