github actionでE2Eのテストを実装する
repository: https://github.com/mr-ijij/e2e-github-action
概要
Cypressを使用して、github actionのJobでE2Eを行う。 失敗した場合Slackに通知を飛ばす。
Cypressについて
Webアプリの自動テストツール。
- javascriptで動く
- 環境の構築がすごい楽
- 自動待機機能: ネットワークリクエストやDOMの変更が完了するまで自動的に待機
- スクリーンショットとビデオ録画: テストの実行過程をスクリーンショットやビデオで記録ができる
- OSSである
- Repository: https://github.com/cypress-io/cypress
- Document: https://docs.cypress.io/guides/overview/why-cypress
あらゆるテストが可能
- E2E
- IT(統合テスト)
- UT
1. ./github/workflow/e2e.ymlについて
https://github.com/mr-ijij/e2e-github-action/blob/main/.github/workflows/e2e.yml
ジョブの実行について
on:
push: # ブランチをpushしたタイミングで実行
workflow_dispatch: # 手動で実行できるようにする
workflow_dispatchを入れると下記から実行可能
定期実行するには下記のように書き換える
on:
schedule:
- cron: '0 * * * *' # 毎時0分に実行(UTC)
job部分の説明
jobs:
# ここでは "e2e" という名前のジョブを定義している。
e2e:
# このジョブが実行される環境を指定。"ubuntu-latest" は最新版のUbuntuを意味する。
runs-on: ubuntu-latest
steps:
# ステップ1: GitHubリポジトリのコードをチェックアウト(ダウンロード)する.
- name: Checkout
uses: actions/checkout@v3
# ステップ2: jq(コマンドラインJSONプロセッサ)をインストールする。Slackへの通知するメッセージの作成で使用する。
- name: Install jq
run: sudo apt-get install jq
# ステップ3: Cypressテストを実行。
- name: Cypress run
# 公式がactionを用意している。https://github.com/cypress-io/github-action
uses: cypress-io/github-action@v3
with:
# プロジェクトのcypress.config.jsファイルが存在するディレクトリを指定。
project: ./
# 使用するブラウザを指定。ここではChromeを使用。
browser: chrome
# テスト対象のURLを指定。
wait-on: "https://e2e-github-action.vercel.app/"
# 上記URLの応答を待つ最大時間(秒)。
wait-on-timeout: 60
env:
# 環境変数を設定。これらはGitHub Secretsから取得される。
CYPRESS_USER_NAME: ${{ secrets.USER_NAME }}
CYPRESS_PASSWORD: ${{ secrets.PASSWORD }}
# ステップ4: テスト失敗時にSlackへ通知するメッセージを準備。
- name: Prepare Slack Message
if: failure() # このステップはテストが失敗した場合のみ実行される。
id: prepare_slack_message
run: |
# Cypressのテスト結果をJSON形式で取得。
JSON_RESULT=$(cat cypress/results/mochawesome.json)
# 失敗したテストの詳細を抽出。
FAILED_TESTS=$(echo "$JSON_RESULT" | jq '.results[].suites[].tests[]' | jq -c .)
# 抽出した失敗テストの情報を環境変数に設定。
echo "SLACK_MESSAGE=$FAILED_TESTS" >> $GITHUB_ENV
# ステップ5: Slackに失敗通知を送信。
- name: Notify failure on Slack
if: failure() # テストが失敗した場合のみ実行される。
uses: slackapi/slack-github-action@v1.23.0
with:
# 通知先のSlackチャンネルID。
channel-id: ${{ secrets.SLACK_CHANNEL }}
# 送信するSlackメッセージの内容。カスタマイズ可能。
slack-message: "${{ secrets.SLACK_MENTION }}\n\nCypress E2E Test Failure\n:x:\n\n```\n${{ env.SLACK_MESSAGE }}\n```\nhttps://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
env:
# Slackボットトークン。これもGitHub Secretsから取得される。
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
github actionのsecretを設定する
テスト対象のアプリケーション自体の設定
ログイン時のユーザー名とパスワードを設定している。
- USER_NAME
- PASSWORD
SLACKに通知を飛ばす設定
- SLACK_CHANNEL
- チャンネルを指定
- 例: #general
- SLACK_MENTION
- メンションを指定
- 個人またはチームのメンションを<>で囲む必要がある。
- 例 <@ijij>
- @hereや@generalは!here・!generalとする必要がある
- SLACK_BOT_TOKEN
- Tokenを設定
Slack Bot Tokenの作成方法
- https://api.slack.com/ へアクセス
- 「Your Apps」のクリック
- 「Create New App」のクリック
- 「From scratch」を選択
- 「App Name」と「workspaceの選択」
- App Nameはなんでも良い
- 作成したアプリの設定ページに移動。
- サイドバーから「OAuth & Permissions」をクリック
- 「Bot Token Scopes」セクションで、ボットに必要な権限を追加
- chat:writを追加する。
- ページ上部の「Install to Workspace」ボタンをクリック
- プロンプトに従ってインストールを完了します。
- インストール後、「OAuth & Permissions」ページに「Bot User OAuth Access Token」が表示される。これを SLACK_BOT_TOKEN で設定する。
cypress.config.jsの設定
詳しくは: https://docs.cypress.io/guides/references/configuration
specPattern: "cypress/e2e/**/*.cy.{js,jsx,ts,tsx}",
に、テストスイートを記述していく。
おわりに
E2Eテストは、しばしば後回しにされがちです。
体感ですが、E2Eテストを持たないプロダクトも多いと思います。
その理由は主に、コストが高いことや実装が面倒であることにあるでしょう。
しかし、ユーザーよりも先にプロダクトの異常を検知しなくてならないというのは、共通認識として存在しています。
GitHub Actionsを利用することで、比較的低コストで簡単にE2Eテストを実装できます。
これにより、開発者者やプロダクトオーナー・ユーザーはより幸せになると思います。
是非、最も重要なドメインぐらいは、E2Eテストを実装していただきたいです。(テストピラミットが屈強なアスリートのような逆三角形にならないように!)