Cypress является мощным инструментом для энд-ту-энд тестирования веб-приложений на JavaScript. Интеграция Cypress с GitHub Actions позволяет автоматизировать запуск тестов при каждом коммите, pull request или на расписании, обеспечивая постоянную проверку качества кода.
Проект с Cypress требует наличия Node.js и npm. Для установки Cypress используется стандартная команда:
npm install cypress --save-dev
После установки создается структура проекта Cypress с папками
cypress/integration, cypress/fixtures,
cypress/support и конфигурационным файлом
cypress.config.js.
Файл конфигурации позволяет задавать базовый URL, таймауты и плагины:
const { defineConfig } = require('cypress');
module.exports = defineConfig({
e2e: {
baseUrl: 'https://example.com',
supportFile: 'cypress/support/e2e.js',
specPattern: 'cypress/integration/**/*.cy.js',
defaultCommandTimeout: 8000,
pageLoadTimeout: 10000,
},
});
GitHub Actions использует YAML-файлы для описания пайплайнов, которые
хранятся в .github/workflows. Простейший workflow для
Cypress включает три этапа: установка зависимостей, запуск сервера и
выполнение тестов.
name: Cypress Tests
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
cypress-run:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm ci
- name: Start application
run: npm start &
env:
NODE_ENV: test
- name: Run Cypress tests
run: npx cypress run
Ключевые моменты:
npm ci используется для точной установки зависимостей,
соответствующих package-lock.json.& позволяет запускать сервер приложения в
фоне, чтобы Cypress мог подключиться к нему.npx cypress run выполняет все тесты в
headless-режиме.Для ускорения workflow рекомендуется использовать кэширование
node_modules и Cypress бинарников:
- name: Cache node modules
uses: actions/cache@v3
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Cache Cypress binary
uses: actions/cache@v3
with:
path: ~/.cache/Cypress
key: cypress-binary-${{ hashFiles('package-lock.json') }}
Кэширование значительно снижает время выполнения тестов, особенно при больших проектах.
Cypress поддерживает параллельное выполнение тестов, что критично для
крупных наборов тестов. В GitHub Actions это реализуется через параметр
--parallel и использование record key:
- name: Run Cypress in parallel
run: npx cypress run --record --parallel --key ${{ secrets.CYPRESS_RECORD_KEY }}
Особенности:
--record отправляет результаты на Dashboard Cypress для
аналитики.--parallel распределяет тесты между потоками, ускоряя
прогон.Cypress поддерживает различные форматы отчетов, включая JUnit и HTML. Для интеграции с CI удобно использовать JUnit:
- name: Run Cypress tests with JUnit reporter
run: npx cypress run --reporter junit --reporter-options "mochaFile=results/test-results.xml"
Дальше можно добавить шаг для публикации отчетов:
- name: Upload test results
uses: actions/upload-artifact@v3
with:
name: cypress-results
path: results/test-results.xml
Cypress позволяет передавать переменные через env в
workflow:
- name: Run Cypress with environment variables
run: npx cypress run
env:
BASE_URL: https://staging.example.com
API_KEY: ${{ secrets.API_KEY }}
В тестах доступ к этим переменным осуществляется через
Cypress.env('BASE_URL').
cypress/included:12.14.0), упрощающие конфигурацию.retries в конфигурации:e2e: {
retries: {
runMode: 2,
openMode: 0,
},
}
jobs:
cypress-e2e:
runs-on: ubuntu-latest
strategy:
matrix:
node: [16, 18]
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node }}
- run: npm ci
- run: npm start &
- run: npx cypress run --record --key ${{ secrets.CYPRESS_RECORD_KEY }}
- uses: actions/upload-artifact@v3
with:
name: cypress-videos
path: cypress/videos
Использование матриц позволяет тестировать проект на разных версиях Node.js, повышая надёжность кросс-окружений.
Эта интеграция превращает Cypress в полноценный инструмент CI/CD, обеспечивая автоматическое тестирование при каждом изменении кода и позволяя быстро выявлять ошибки на ранних этапах разработки.