كيفية إعداد Cypress مع Next.js
Cypress هو أداة تشغيل اختبارات تُستخدم لـ اختبارات نهاية إلى نهاية (E2E) و اختبار المكونات. ستوضح لك هذه الصفحة كيفية إعداد Cypress مع Next.js وكتابة أول اختباراتك.
تحذير:
- إصدارات Cypress الأقدم من 13.6.3 لا تدعم TypeScript الإصدار 5 مع
moduleResolution:"bundler". ومع ذلك، تم حل هذه المشكلة في Cypress الإصدار 13.6.3 وما بعده. cypress v13.6.3
الإعداد اليدوي
لإعداد Cypress يدويًا، قم بتثبيت cypress كتبعية تطوير:
npm install -D cypress
# أو
yarn add -D cypress
# أو
pnpm install -D cypressأضف أمر open الخاص بـ Cypress إلى حقل scripts في ملف package.json:
{
"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 تلقائيًا في مشروعك.
إنشاء أول اختبار E2E باستخدام Cypress
تأكد من أن ملف cypress.config يحتوي على التكوين التالي:
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 Home() {
return (
<div>
<h1>Home</h1>
<Link href="/about">About</Link>
</div>
)
}import Link from 'next/link'
export default function About() {
return (
<div>
<h1>About</h1>
<Link href="/">Home</Link>
</div>
)
}أضف اختبارًا للتحقق من أن التنقل يعمل بشكل صحيح:
describe('Navigation', () => {
it('should navigate to the about page', () => {
// ابدأ من الصفحة الرئيسية
cy.visit('http://localhost:3000/')
// ابحث عن رابط يحتوي على سمة href تشمل "about" وانقر عليه
cy.get('a[href*="about"]').click()
// يجب أن يتضمن الرابط الجديد "/about"
cy.url().should('include', '/about')
// يجب أن تحتوي الصفحة الجديدة على h1 بعنوان "About"
cy.get('h1').contains('About')
})
})تشغيل اختبارات E2E
سيقوم Cypress بمحاكاة مستخدم يتصفح تطبيقك، وهذا يتطلب تشغيل خادم Next.js. نوصي بتشغيل اختباراتك على كود الإنتاج لمحاكاة سلوك التطبيق الفعلي بشكل أقرب.
قم بتشغيل npm run build && npm run start لبناء تطبيق Next.js الخاص بك، ثم قم بتشغيل npm run cypress:open في نافذة طرفية أخرى لبدء Cypress وتشغيل مجموعة اختبارات E2E.
معلومة مفيدة:
- يمكنك استخدام
cy.visit("/")بدلاً منcy.visit("http://localhost:3000/")عن طريق إضافةbaseUrl: 'http://localhost:3000'إلى ملف التكوينcypress.config.js.- بدلاً من ذلك، يمكنك تثبيت حزمة
start-server-and-testلتشغيل خادم Next.js للإنتاج بالتزامن مع Cypress. بعد التثبيت، أضف"test": "start-server-and-test start http://localhost:3000 cypress"إلى حقلscriptsفي ملفpackage.json. تذكر إعادة بناء تطبيقك بعد إجراء تغييرات جديدة.
إنشاء أول اختبار مكون باستخدام Cypress
تقوم اختبارات المكونات ببناء وتثبيت مكون معين دون الحاجة إلى تجميع التطبيق بالكامل أو بدء خادم.
حدد اختبار المكونات في تطبيق Cypress، ثم حدد Next.js كإطار العمل الأمامي. سيتم إنشاء مجلد cypress/component في مشروعك، وسيتم تحديث ملف cypress.config.js لتمكين اختبار المكونات.
تأكد من أن ملف cypress.config يحتوي على التكوين التالي:
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 AboutPage from '../../pages/about'
describe('<AboutPage />', () => {
it('should render and display expected content', () => {
// ثبت مكون React لصفحة About
cy.mount(<AboutPage />)
// يجب أن تحتوي الصفحة الجديدة على h1 بعنوان "About"
cy.get('h1').contains('About')
// تحقق من وجود رابط بالرابط المتوقع
// *متابعة* الرابط أكثر ملاءمة لاختبار E2E
cy.get('a[href="/"]').should('be.visible')
})
})معلومة مفيدة:
- لا يدعم Cypress حاليًا اختبار المكونات لـ
asyncServer Components. نوصي باستخدام اختبارات E2E.- نظرًا لأن اختبارات المكونات لا تتطلب خادم Next.js، فقد لا تعمل ميزات مثل
<Image />التي تعتمد على توفر خادم افتراضيًا.
تشغيل اختبارات المكونات
قم بتشغيل npm run cypress:open في طرفيتك لبدء Cypress وتشغيل مجموعة اختبارات المكونات.
التكامل المستمر (CI)
بالإضافة إلى الاختبار التفاعلي، يمكنك أيضًا تشغيل Cypress بدون واجهة مستخدم باستخدام الأمر cypress run، وهو أكثر ملاءمة لبيئات التكامل المستمر:
{
"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 والتكامل المستمر من هذه المصادر: