Running Cypress integration tests before deployment with Github Actions
We will be using a simple Next.js application and will deploy to Vercel, but it doesn't matter what framework and deployment platform you use.
Prepare the Tests
To start, make sure that you have a passing integration tests in place, if you are getting started with Cypress, you can add it in your project. Now let's verify everything is green:
cypress run --headless
💡 We run Cypress in headless mode because this is how we will execute in Github Actions later.
The workflow
We will be running the integration tests in Firefox and Chrome only, then do the deployment once the integration tests passes.
Define the workflow file
Let's create a .github/workflows/deploy.yml file in the root of the project and put this:
name: Deploy
on:
  push:
    branches:
      - main
			
jobs:
💡 This will trigger a workflow run everytime you push to the main branch.
Running the tests
Since we are running the integration tests in two browsers, it's good to utilize Github Action's parallel job execution by creating a separate job for Chrome and Firefox, that way the tests are running at the same time.
Adding the job for Chrome
In the workflow file, add a job and name it chrome-integration-test:
...
jobs:
  chrome-integration-test:
    runs-on: ubuntu-latest
    steps:
First, checkout the repository:
...
    steps:
      - name: Setup Checkout
        uses: actions/checkout@v2
As describe in their repo: "This action checks-out your repository under $GITHUB_WORKSPACE, so your workflow can access it.".
Then, add a step to cache the dependencies:
...
    steps:
      # Setup Checkout
      - name: Cache dependencies
        uses: actions/cache@v2
        with:
          key: integration-test-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
          path: |
            ~/.cache/Cypress
            node_modules
This is important when executing the tests later on as it will cache the files, so that once installation is done, we don't need to re-install Cypress, read more here why
Next, install the dependencies:
...
    steps:
      # Setup Checkout
      # Cache dependencies
      - name: Install dependencies
        run: npm install
Finally, execute the tests:
...
    steps:
      # Setup Checkout
      # Cache dependencies
      # Install dependencies
      - name: Execute tests
        uses: cypress-io/github-action@v2
        with:
          start: npm run dev
          browser: chrome
          headless: true
This will run your tests in Chrome and in headless mode as mentioned earlier. Take note the start: npm run dev option, as we are using a Next.js application, Cypress will expect that the app server is running (normally in http://localhost:3000) since there are page visits in the integration test.
Adding the job for Firefox
Like with Chrome, add a job but name it firefox-integration-test, since most are duplicate steps, we will skip to the execute test step:
...
  firefox-integration-test:
    runs-on: ubuntu-latest
    
    steps:
      # Setup Checkout
      # Cache dependencies
      # Install dependencies
      - name: Execute tests
        uses: cypress-io/github-action@v2
        with:
          start: npm run dev
          browser: firefox
          headless: true
Deployment
Once the chrome-integration-test and firefox-integration-test jobs are completed, we can trigger the deployment, now add the deploy job like so:
...
  chrome-integration-test:
  firefox-integration-test:
  deploy:
    runs-on: ubuntu-latest
    
    needs: [chrome-integration-test, firefox-integration-test]
		
    steps:
      - name: Setup Checkout
        uses: actions/checkout@v2
      - name: Install dependencies
        run: npm install
      - name: Deploy
        uses: amondnet/vercel-action@v20
        with:
          vercel-token: ${{ secrets.VERCEL_TOKEN }}
          vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
          vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
          vercel-args: '--prod'
💡 The needs property will delay the deploy job from starting. Learn more.

Final workflow
The workflow file used in our example can be found here.
Takeaways
We created a separate job for testing in Chrome and Firefox as those are the two most commonly used browsers, but you can simplify running the integration tests directly in the deploy job.
