Вичерпний посібник з Cypress, потужного фреймворку для наскрізного тестування, що охоплює встановлення, написання тестів, налагодження, інтеграцію з CI/CD та найкращі практики.
Cypress: Повний посібник з наскрізного тестування для вебзастосунків
У сучасному світі веб-розробки, що стрімко розвивається, забезпечення якості та надійності вебзастосунків має першочергове значення. Наскрізне (End-to-End, E2E) тестування відіграє вирішальну роль у перевірці того, що всі компоненти застосунку бездоганно працюють разом з точки зору користувача. Cypress став провідним фреймворком для E2E-тестування, пропонуючи дружній до розробників досвід, потужні функції та чудову продуктивність. Цей вичерпний посібник проведе вас через усе, що потрібно знати для початку роботи з Cypress та ефективного тестування ваших вебзастосунків.
Що таке Cypress?
Cypress — це інструмент для тестування фронтенду нового покоління, створений для сучасного вебу. На відміну від традиційних фреймворків для тестування, які запускають тести в браузері, Cypress працює безпосередньо в браузері, надаючи вам неперевершений контроль і видимість поведінки вашого застосунку. Він розроблений, щоб бути швидким, надійним і простим у використанні, що робить його популярним вибором серед розробників та QA-інженерів у всьому світі. Cypress написаний на JavaScript і виконується в браузері, що робить його дуже продуктивним і надає неперевершений доступ до внутрішніх компонентів застосунку.
Ключові переваги використання Cypress
- Дружній до розробників: Cypress надає чистий та інтуїтивно зрозумілий API, що полегшує написання та налагодження тестів.
- Подорожі в часі: Cypress робить знімки стану вашого застосунку під час виконання кожної команди тесту, дозволяючи вам повернутися назад у часі і побачити, що саме відбулося в будь-який момент.
- Перезавантаження в реальному часі: Cypress автоматично перезавантажується, коли ви вносите зміни у свої тести, забезпечуючи миттєвий зворотний зв'язок.
- Автоматичне очікування: Cypress автоматично чекає, поки елементи стануть видимими або доступними для взаємодії, перш ніж виконувати дії, усуваючи необхідність у явних очікуваннях.
- Контроль мережі: Cypress дозволяє вам створювати стаби для мережевих запитів і відповідей, що дає змогу симулювати різні сценарії та тестувати обробку помилок у вашому застосунку.
- Можливості для налагодження: Cypress надає чудові інструменти для налагодження, включаючи потужний дебагер та детальні повідомлення про помилки.
- Кросбраузерне тестування: Cypress підтримує кілька браузерів, включаючи Chrome, Firefox, Edge та Electron.
- Тестування без графічного інтерфейсу (Headless): Запускайте тести в headless-режимі для швидшого виконання в середовищах CI/CD.
- Вбудовані твердження (Assertions): Cypress надає багатий набір вбудованих тверджень для перевірки очікуваної поведінки вашого застосунку.
Встановлення та налаштування
Почати роботу з Cypress дуже просто. Ось як його встановити:
- Передумови: Переконайтеся, що на вашій системі встановлено Node.js та npm (Node Package Manager). Ви можете завантажити їх з офіційного сайту Node.js.
- Встановіть Cypress: Відкрийте термінал або командний рядок, перейдіть до каталогу вашого проєкту та виконайте наступну команду:
- Відкрийте Cypress: Після завершення встановлення ви можете відкрити Cypress Test Runner, виконавши:
npm install cypress --save-dev
npx cypress open
Ця команда запустить Cypress Test Runner, який надає графічний інтерфейс для запуску та налагодження ваших тестів.
Написання вашого першого тесту Cypress
Давайте створимо простий тест для перевірки того, що домашня сторінка вебсайту завантажується коректно. Створіть новий файл з назвою `example.cy.js` у каталозі `cypress/e2e` вашого проєкту.
// cypress/e2e/example.cy.js
describe('Мій перший тест', () => {
it('Відвідує Kitchen Sink', () => {
cy.visit('https://example.cypress.io')
cy.contains('type').click()
cy.url().should('include', '/commands/actions')
cy.get('.action-email')
.type('fake@email.com')
.should('have.value', 'fake@email.com')
})
})
Давайте розберемо цей тест:
- `describe()`: Визначає набір тестів (test suite), який є колекцією пов'язаних тестів.
- `it()`: Визначає окремий тестовий випадок (test case) у наборі тестів.
- `cy.visit()`: Переходить за вказаною URL-адресою.
- `cy.contains()`: Знаходить елемент, що містить вказаний текст.
- `.click()`: Клікає на вибраний елемент.
- `cy.url()`: Отримує поточну URL-адресу сторінки.
- `.should()`: Робить твердження (assertion) про стан застосунку.
- `cy.get()`: Вибирає елемент за допомогою CSS-селектора.
- `.type()`: Вводить текст у вибраний елемент.
- `.should('have.value', 'fake@email.com')`: Стверджує, що значення елемента дорівнює 'fake@email.com'.
Запустіть цей тест у Cypress Test Runner, щоб побачити його в дії. Ви повинні побачити, як браузер переходить на вебсайт Cypress Kitchen Sink, клікає на посилання "type" і перевіряє URL.
Команди Cypress
Cypress надає широкий спектр команд для взаємодії з вашим застосунком. Ось деякі з найчастіше використовуваних команд:
- `cy.visit(url)`: Переходить за вказаною URL-адресою.
- `cy.get(selector)`: Вибирає елемент за допомогою CSS-селектора.
- `cy.contains(content)`: Вибирає елемент, що містить вказаний текст.
- `cy.click()`: Клікає на вибраний елемент.
- `cy.type(text)`: Вводить текст у вибраний елемент.
- `cy.clear()`: Очищує вміст елемента input або textarea.
- `cy.submit()`: Відправляє форму.
- `cy.check()`: Встановлює прапорець (checkbox) або перемикач (radio button).
- `cy.uncheck()`: Знімає прапорець (checkbox).
- `cy.select(value)`: Вибирає опцію з випадаючого списку.
- `cy.scrollTo(position)`: Прокручує сторінку до вказаної позиції.
- `cy.trigger(event)`: Викликає DOM-подію на вибраному елементі.
- `cy.request(url, options)`: Робить HTTP-запит на вказану URL-адресу.
- `cy.intercept(route, handler)`: Перехоплює HTTP-запити, що відповідають вказаному маршруту.
- `cy.wait(time)`: Очікує вказану кількість часу.
- `cy.reload()`: Перезавантажує поточну сторінку.
- `cy.go(direction)`: Переходить на попередню або наступну сторінку в історії браузера.
- `cy.url()`: Отримує поточну URL-адресу сторінки.
- `cy.title()`: Отримує заголовок сторінки.
- `cy.window()`: Отримує об'єкт window.
- `cy.document()`: Отримує об'єкт document.
- `cy.viewport(width, height)`: Встановлює розмір області перегляду (viewport).
Це лише деякі з багатьох команд, доступних у Cypress. Зверніться до документації Cypress для повного списку команд та їх опцій.
Твердження (Assertions) в Cypress
Твердження використовуються для перевірки очікуваної поведінки вашого застосунку. Cypress надає багатий набір вбудованих тверджень, які ви можете використовувати для перевірки стану елементів, URL-адреси, заголовка тощо. Твердження додаються ланцюжком після команд Cypress за допомогою методу `.should()`.
Ось деякі поширені приклади тверджень:
- `.should('be.visible')`: Стверджує, що елемент видимий.
- `.should('not.be.visible')`: Стверджує, що елемент невидимий.
- `.should('be.enabled')`: Стверджує, що елемент активний.
- `.should('be.disabled')`: Стверджує, що елемент неактивний.
- `.should('have.text', 'очікуваний текст')`: Стверджує, що елемент має вказаний текст.
- `.should('contain', 'очікуваний текст')`: Стверджує, що елемент містить вказаний текст.
- `.should('have.value', 'очікуване значення')`: Стверджує, що елемент має вказане значення.
- `.should('have.class', 'очікуваний клас')`: Стверджує, що елемент має вказаний клас.
- `.should('have.attr', 'назва атрибута', 'очікуване значення')`: Стверджує, що елемент має вказаний атрибут і значення.
- `.should('have.css', 'css властивість', 'очікуване значення')`: Стверджує, що елемент має вказану CSS-властивість і значення.
- `.should('have.length', очікувана довжина)`: Стверджує, що елемент має вказану довжину (наприклад, кількість елементів у списку).
Ви також можете створювати власні твердження відповідно до ваших конкретних потреб.
Найкращі практики написання тестів Cypress
Дотримання найкращих практик допоможе вам писати більш надійні, ефективні та легкі в обслуговуванні тести Cypress. Ось кілька рекомендацій:
- Пишіть чіткі та лаконічні тести: Кожен тест повинен фокусуватися на певній функціональності або сценарії. Уникайте написання надто складних тестів, які важко зрозуміти та підтримувати.
- Використовуйте змістовні назви тестів: Давайте вашим тестам описові назви, які чітко вказують, що саме вони тестують.
- Уникайте жорсткого кодування значень: Використовуйте змінні або файли конфігурації для зберігання значень, які можуть змінюватися з часом.
- Використовуйте власні команди: Створюйте власні команди для інкапсуляції логіки, що повторно використовується, і робіть ваші тести більш читабельними.
- Ізолюйте тести: Кожен тест повинен бути незалежним від інших тестів. Уникайте залежності від стану застосунку з попередніх тестів.
- Прибирайте після тестів: Скидайте стан застосунку після кожного тесту, щоб переконатися, що наступні тести починаються з чистого аркуша.
- Використовуйте data-атрибути: Використовуйте data-атрибути (наприклад, `data-testid`) для вибору елементів у ваших тестах. Data-атрибути менш схильні до змін, ніж CSS-класи або ID, що робить ваші тести більш стійкими до змін в UI.
- Уникайте явних очікувань: Cypress автоматично чекає, поки елементи стануть видимими або доступними для взаємодії. Уникайте використання явних очікувань (наприклад, `cy.wait()`), якщо це не є абсолютно необхідним.
- Тестуйте користувацькі сценарії: Зосередьтеся на тестуванні користувацьких сценаріїв (user flows), а не окремих компонентів. Це допоможе вам переконатися, що ваш застосунок працює коректно з точки зору користувача.
- Регулярно запускайте тести: Інтегруйте тести Cypress у ваш CI/CD-пайплайн і регулярно їх запускайте, щоб виявляти помилки на ранніх етапах процесу розробки.
Просунуті техніки Cypress
Стаби та моки (Stubbing and Mocking)
Cypress дозволяє вам створювати стаби для мережевих запитів і відповідей, що дає змогу симулювати різні сценарії та тестувати обробку помилок у вашому застосунку. Це особливо корисно для тестування функцій, які залежать від зовнішніх API або сервісів.
Щоб створити стаб для мережевого запиту, ви можете використовувати команду `cy.intercept()`. Наприклад, код нижче створює стаб для GET-запиту до `/api/users` і повертає мок-відповідь:
cy.intercept('GET', '/api/users', {
statusCode: 200,
body: [
{ id: 1, name: 'John Doe' },
{ id: 2, name: 'Jane Doe' }
]
}).as('getUsers')
Потім ви можете дочекатися перехопленого запиту за допомогою `cy.wait('@getUsers')` і перевірити, чи ваш застосунок коректно обробляє мок-відповідь.
Робота з локальним сховищем та файлами cookie
Cypress надає команди для взаємодії з локальним сховищем та файлами cookie. Ви можете використовувати ці команди для встановлення, отримання та очищення локального сховища та файлів cookie у ваших тестах.
Щоб встановити елемент локального сховища, ви можете використовувати команду `cy.window()` для доступу до об'єкта window, а потім використати метод `localStorage.setItem()`. Наприклад:
cy.window().then((win) => {
win.localStorage.setItem('myKey', 'myValue')
})
Щоб отримати елемент локального сховища, ви можете використовувати команду `cy.window()`, а потім метод `localStorage.getItem()`. Наприклад:
cy.window().then((win) => {
const value = win.localStorage.getItem('myKey')
expect(value).to.equal('myValue')
})
Щоб встановити файл cookie, ви можете використовувати команду `cy.setCookie()`. Наприклад:
cy.setCookie('myCookie', 'myCookieValue')
Щоб отримати файл cookie, ви можете використовувати команду `cy.getCookie()`. Наприклад:
cy.getCookie('myCookie').should('have.property', 'value', 'myCookieValue')
Обробка завантаження файлів
Cypress надає плагін під назвою `cypress-file-upload`, який спрощує завантаження файлів у ваших тестах. Щоб встановити плагін, виконайте наступну команду:
npm install -D cypress-file-upload
Потім додайте наступний рядок до вашого файлу `cypress/support/commands.js`:
import 'cypress-file-upload';
Потім ви можете використовувати команду `cy.uploadFile()` для завантаження файлу. Наприклад:
cy.get('input[type="file"]').attachFile('example.txt')
Робота з IFrames
Тестування IFrames може бути складним, але Cypress надає спосіб взаємодії з ними. Ви можете використовувати команду `cy.frameLoaded()` для очікування завантаження IFrame, а потім команду `cy.iframe()` для отримання об'єкта document IFrame.
cy.frameLoaded('#myIframe')
cy.iframe('#myIframe').find('button').click()
Cypress та безперервна інтеграція/безперервне розгортання (CI/CD)
Інтеграція Cypress у ваш CI/CD-пайплайн є важливою для забезпечення якості вашого застосунку. Ви можете запускати тести Cypress в headless-режимі у вашому середовищі CI/CD. Ось як:
- Встановіть Cypress: Переконайтеся, що Cypress встановлено як залежність у вашому проєкті.
- Налаштуйте CI/CD: Налаштуйте ваш CI/CD-пайплайн для запуску тестів Cypress після кожної збірки.
- Запустіть Cypress у headless-режимі: Використовуйте команду `cypress run` для запуску тестів Cypress у headless-режимі.
Приклад конфігурації CI/CD (з використанням GitHub Actions):
name: Cypress Tests
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
cypress-run:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16
- name: Install dependencies
run: npm install
- name: Cypress run
uses: cypress-io/github-action@v5
with:
start: npm start
wait-on: 'http://localhost:3000'
Ця конфігурація запускатиме тести Cypress щоразу, коли код надсилається до гілки `main` або створюється pull-запит до гілки `main`. Дія `cypress-io/github-action` спрощує процес запуску тестів Cypress у GitHub Actions.
Налагодження тестів Cypress
Cypress надає чудові інструменти для налагодження, які допоможуть вам виявляти та виправляти проблеми у ваших тестах. Ось кілька порад щодо налагодження тестів Cypress:
- Використовуйте Cypress Test Runner: Cypress Test Runner надає візуальний інтерфейс для запуску та налагодження ваших тестів. Ви можете проходити тести по одній команді, перевіряти стан застосунку та переглядати детальні повідомлення про помилки.
- Використовуйте команду `cy.pause()`: Команда `cy.pause()` призупиняє виконання вашого тесту і дозволяє вам перевірити стан застосунку в інструментах розробника браузера.
- Використовуйте команду `cy.debug()`: Команда `cy.debug()` виводить вибраний елемент у консоль, дозволяючи вам перевірити його властивості та атрибути.
- Використовуйте інструменти розробника браузера: Інструменти розробника браузера надають велику кількість інформації про ваш застосунок, включаючи DOM, мережеві запити та логи консолі.
- Уважно читайте повідомлення про помилки: Cypress надає детальні повідомлення про помилки, які можуть допомогти вам визначити причину помилки. Звертайте увагу на повідомлення про помилку та стек-трейс.
Cypress у порівнянні з іншими фреймворками для тестування
Хоча Cypress є потужним фреймворком для наскрізного тестування, важливо розуміти, як він співвідноситься з іншими популярними варіантами. Ось короткий огляд:
- Selenium: Selenium — це широко використовуваний фреймворк для автоматизованого тестування. Хоча він гнучкий і підтримує кілька мов, його налаштування та підтримка можуть бути складними. Cypress пропонує простіший та більш дружній до розробників досвід, особливо для застосунків на основі JavaScript.
- Puppeteer: Puppeteer — це бібліотека для Node, яка надає високорівневий API для керування headless Chrome або Chromium. Вона чудово підходить для скрейпінгу та автоматизації завдань браузера, але може вимагати більше ручного налаштування для наскрізного тестування порівняно з Cypress.
- Playwright: Playwright — це ще один кросбраузерний фреймворк для автоматизації, розроблений Microsoft. Він має схожість з Puppeteer, але пропонує ширшу підтримку браузерів. Cypress має унікальний дебагер з функцією подорожі в часі та більш інтегрований досвід тестування.
Вибір фреймворку залежить від конкретних потреб та вимог вашого проєкту. Cypress є чудовим вибором для сучасних вебзастосунків, які вимагають швидкого, надійного та дружнього до розробників наскрізного тестування.
Реальні приклади використання Cypress
Давайте розглянемо кілька реальних прикладів того, як Cypress можна використовувати для тестування різних типів вебзастосунків:
Тестування застосунку для електронної комерції
Ви можете використовувати Cypress для тестування різних користувацьких сценаріїв у застосунку для електронної комерції, таких як:
- Пошук товарів
- Додавання товарів у кошик
- Оформлення та розміщення замовлення
- Керування налаштуваннями облікового запису
Ось приклад тесту Cypress, який перевіряє, що користувач може успішно додати товар у свій кошик:
it('Додає товар у кошик', () => {
cy.visit('/products')
cy.get('.product-card').first().find('button').click()
cy.get('.cart-count').should('have.text', '1')
})
Тестування застосунку соціальної мережі
Ви можете використовувати Cypress для тестування взаємодій користувачів у застосунку соціальної мережі, таких як:
- Створення нового допису
- Лайк допису
- Коментування допису
- Підписка на інших користувачів
Ось приклад тесту Cypress, який перевіряє, що користувач може успішно створити новий допис:
it('Створює новий допис', () => {
cy.visit('/profile')
cy.get('#new-post-textarea').type('Привіт, світе!')
cy.get('#submit-post-button').click()
cy.get('.post').first().should('contain', 'Привіт, світе!')
})
Тестування банківського застосунку
Для банківських застосунків Cypress можна використовувати для тестування критично важливих функцій, таких як:
- Безпечний вхід в систему
- Перевірка балансу рахунку
- Переказ коштів
- Керування бенефіціарами
Тест для перевірки переказу коштів може виглядати так (з відповідними стабами для безпеки):
it('Успішно переказує кошти', () => {
cy.visit('/transfer')
cy.get('#recipient-account').type('1234567890')
cy.get('#amount').type('100')
cy.intercept('POST', '/api/transfer', { statusCode: 200, body: { success: true } }).as('transfer')
cy.get('#transfer-button').click()
cy.wait('@transfer')
cy.get('.success-message').should('be.visible')
})
Висновок
Cypress — це потужний та універсальний фреймворк для наскрізного тестування, який може допомогти вам забезпечити якість та надійність ваших вебзастосунків. Його дружній до розробників API, потужні функції та відмінна продуктивність роблять його популярним вибором серед розробників та QA-інженерів у всьому світі. Дотримуючись найкращих практик, викладених у цьому посібнику, ви зможете писати ефективні тести Cypress, які допоможуть вам виявляти помилки на ранніх етапах процесу розробки та надавати високоякісне програмне забезпечення вашим користувачам.
Оскільки вебзастосунки продовжують розвиватися, важливість наскрізного тестування буде тільки зростати. Використання Cypress та його інтеграція у ваш робочий процес розробки дозволить вам створювати більш надійні, стабільні та зручні для користувача веб-рішення.