Continuous integration

Continuous Integration (CI) is a practice in software development where developers frequently merge their code changes into a shared repository. Each merge triggers automated tests to ensure that new changes don't break the application. This tutorial explains CI in simple terms and how to integrate Cypress into your CI pipeline.

What is Continuous Integration (CI)?

  • Definition: CI automates the process of testing and building code changes after every commit or pull request.
  • Why It's Important:
    • Detects bugs early.
    • Ensures the codebase is always in a working state.
    • Speeds up development by reducing manual testing efforts.

How Cypress Fits into CI

Cypress is a great tool for testing applications in a CI pipeline because it:

  • Runs headlessly (without opening a browser UI).
  • Integrates easily with CI tools.
  • Provides detailed test logs, screenshots, and videos for debugging.

Common CI Tools

Here are some popular CI tools you can use with Cypress:

  • GitHub Actions (built into GitHub)
  • Jenkins (open-source automation tool)
  • CircleCI (cloud-based CI/CD)
  • GitLab CI/CD (integrated into GitLab repositories)
  • Azure DevOps (Microsoft’s CI/CD solution)

Setting Up CI with Cypress

Let's walk through integrating Cypress with a CI tool. We'll use GitHub Actions as an example.

Add Cypress to Your Project

Install Cypress in your project:

npm install cypress --save-dev

Write Cypress Tests

Ensure you have some Cypress tests written. Example:

Javascript
Copy
describe('My First Test', () => {
  it('visits the homepage', () => {
    cy.visit('https://example.com');
    cy.contains('Welcome').should('be.visible');
  });
});

Create a CI Workflow

For GitHub Actions, create a file named .github/workflows/cypress.yml in your project and add the following:

YAML
Copy
name: Run Cypress Tests

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  cypress-run:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Install Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 16

      - name: Install dependencies
        run: npm install

      - name: Run Cypress tests
        run: npx cypress run

Commit and Push

Push the workflow file to your repository. GitHub Actions will automatically run your Cypress tests on every push or pull request to the main branch.

Parallelization in CI

For large test suites, Cypress can run tests in parallel to speed up execution.

How to Enable Parallelization

  • Set Up a Cypress Dashboard Account:
  • Record Key: Add your dashboard's record key to your CI environment variables.
  • Modify CI Configuration: Update your CI script to include parallelization:
npx cypress run --record --parallel --key

Adding Artifacts for Debugging

Save test results, screenshots, and videos for easier debugging.

Example in GitHub Actions:

Add the following steps to save artifacts:

YAML
Copy
      - name: Upload Cypress screenshots and videos
        uses: actions/upload-artifact@v3
        with:
          name: Cypress-artifacts
          path: cypress/screenshots,cypress/videos

Example CI Integrations

Here's how Cypress integrates with other CI tools:

Jenkins

1. Install the Jenkins Node.js plugin.

2. Add a build step to install Cypress:

npm install

3. Run Cypress tests:

npx cypress run

CircleCI

1. Create a .circleci/config.yml file:

YAML
Copy
version: 2.1
jobs:
  cypress:
    docker:
      - image: cypress/base:16
    steps:
      - checkout
      - run:
          name: Install dependencies
          command: npm install
      - run:
          name: Run Cypress tests
          command: npx cypress run
workflows:
  version: 2
  test:
    jobs:
      - cypress

GitLab CI/CD

1. Add a .gitlab-ci.yml file:

YAML
Copy
stages:
  - test

cypress-tests:
  stage: test
  image: cypress/base:16
  script:
    - npm install
    - npx cypress run

Best Practices for CI with Cypress

  • Run Tests in Headless Mode: Use npx cypress run for faster execution.
  • Keep Tests Independent: Ensure tests don’t rely on the results of previous tests.
  • Mock Data: Use fixtures and stubs to avoid hitting real APIs.
  • Save Debugging Artifacts: Capture screenshots and videos of failures.
  • Use Environment Variables: Securely pass API keys and other sensitive data.

Monitoring with Cypress Dashboard

The Cypress Dashboard provides a centralized view of all your test runs. It includes:

  • Test status (passed/failed).
  • Screenshots and videos for failures.
  • Performance metrics.

Enable the dashboard by running:

npx cypress run --record --key