Cypressを使ったE2EテストをGithubActionsで回して結果をHTMLレポートでまとめる

この記事はちゅらデータアドベントカレンダーの25日目の記事でござる
# やったこと
Cypressを使ったE2EテストをGithubActionsで回して結果をHTMLレポートでまとめる（リモートブランチにpushしたタイミングでCIを回してE2Eテストを実行する）

# 本記事で紹介しないこと
Cypressを利用したE2Eテスト作成の手順（CypressStudioを使ったブラウザ操作から簡単に作成できるが今回は紹介しない。別の機会に紹介する）

# 構成
ディレクトリ構成はこちら

```
root
├── .github
│   └── workflows
│       └── cypress-test.yml
└── e2e
    ├── cypress
    │   ├── integration
    │   │   └── churadata.spec.js
    │   └── support
    │       └── index.js
    ├── cypress.json
    └── package.json
```

# 前提
e2e/cypress/integration配下に任意のcypressのテストを配置済みとする
今回は例として沖縄のとあるデータ分析会社のHPにアクセスするE2Eテストファイルを用意した

- e2e/cypress/integration/churadata.spec.js

```
describe('test_churadata_hp', function() {
    it('test_recruitment', function() {
     cy.viewport(1440, 798);
     // churadataのHPにアクセス
     cy.visit('https://churadata.okinawa/');
     // 採用ページを開く
     cy.get('#mainvisual_top > .inner > .btn_blue > a > span').click();
     // データエンジニアの採用ページを開く
     cy.get('#gm > .flex > :nth-child(5) > a').click();
     cy.get(':nth-child(7) > :nth-child(3) > a').click();
     // システムエンジニアの採用ページを開く
     cy.get('#breadcrumb > :nth-child(2) > a').click();
     cy.get(':nth-child(7) > :nth-child(5) > a').click();
    })
})
```

# 手順
以下のファイルを作成する

- e2e/package.json


```
{
  "name": "e2e",
  "version": "0.0.0",
  "main": "index.js",
  "author": "dai zamurai",
  "description": "e2e test",
  "dependencies": {
    "cypress": "^8.7.0"
  },
  "devDependencies": {
    "mochawesome": "^7.0.1",
    "mochawesome-merge": "^4.2.0",
    "mochawesome-report-generator": "^6.0.1"
  }
}
```

- e2e/cypress.json

```
{
  "pluginsFile": false,
  "modifyObstructiveCode": false,
  "experimentalStudio": true,
  "reporter": "mochawesome",
  "reporterOptions": {
    "reportDir": "cypress/results",
    "overwrite": false,
    "html": false,
    "json": true
  },
  "screenshotsFolder": "cypress/results/screenshots",
  "videosFolder": "cypress/results/videos"
}

```

- e2e/cypress/support/index.js

```
// CypressによるE2Eテストが実施される前に読み込まれるファイル
import addContext from 'mochawesome/addContext'

Cypress.on('test:after:run', (test, runnable) => {
  if (test.state === 'failed') {
    addContext(
      { test },
      `./screenshots/${location.pathname.replace(/(.*)\//, '')}/${runnable.parent.title} -- ${
        test.title
      } (failed).png`
    )
  }
  addContext({ test }, `./videos/${location.pathname.replace(/(.*)\//, '')}.mp4`)
})

```


- .github/workflows/cypress-test.yml

```
name: e2e_test
on: [push]
jobs:
  cypress-run:
    runs-on: ubuntu-latest
    steps:
      - name: checkout repository
        uses: actions/checkout@v2
      - name: install japanese font
        run: sudo apt-get install -y fonts-noto-cjk
      - name: install cypress report module
        run: npm install --save-dev mochawesome mochawesome-merge mochawesome-report-generator
        working-directory: e2e
      # cypress test run
      - name: cypress run
        uses: cypress-io/github-action@v2
        with:
          working-directory: e2e
          browser: chrome
          headless: true
        # cypress debug
        # env:
        #   DEBUG: 'cypress:*'
      - name: cypress report create html
        if: always()
        working-directory: e2e
        run: |
          npx mochawesome-merge "cypress/results/mochawesome*.json" > cypress/results/merge-report.json
          npx marge cypress/results/merge-report.json -o cypress/results
      # upload artifact for debug
      - name: upload-mochawesome-report
        if: always()
        uses: actions/upload-artifact@v2
        with:
          name: mochawesome-report
          path: |
            ./e2e/cypress/results

```

# 結果
GitHubのリポートリポジトリにpushすると、GithubActionsでE2Eテストが実行され、
Artifactsのmochawesome-reportからzipをDLして解凍すると以下のようなE2Eテストの実行結果と動画が貼り付けられたHTMLレポートが確認できる
※ちなみにE2Eテストが失敗したときにはキャプチャまで貼り付けて記録してくれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936440/61c941f7-bfa5-d3d2-b9db-a75b41a988f0.png)

# 終わり

便利な世でござる