GitHubActionsでE2Eテストの自動定期処理をする

2025.03.18 09:00
2025.03.28 16:42
GitHubActionsでE2Eテストの自動定期処理をする

GitHubActionsでE2Eブラウザテストを自動定期処理にする方法をメモします。前回前々回は環境構築とテスト環境構築を作成しましたので、今回はそれを前提として進めます。ここまでの環境構築は以下記事も参照して下さい。

Seleniumで自動操作環境を作成する
SeleniumでE2Eブラウザテストを行う

ではやっていきましょう。

1. 環境構築

まずは環境を整えていきます。以下のファイルを用意しましょう。

/
|-/.github/
  |-workflows/
    |-main.yml
|-/.gitignore/
|-/app/
  |-composer.json
  |-phpunit.xml
  |-tests/
    |-SeleniumTest.php
|-/docker-compose.yml
|-/php
  |-Dockerfile
  |-php.ini
/app/composer.lock
/app/vendor
.git
.DS_Store
Thumb.db
{
    "require": {
        "php-webdriver/webdriver": "^1.15"
    },
    "require-dev": {
        "phpunit/phpunit": "^12.0"
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="vendor/autoload.php">
    <testsuites>
        <testsuite name="Selenium Tests">
            <directory>./tests</directory>
        </testsuite>
    </testsuites>
</phpunit>
FROM php:8.3-fpm
COPY php.ini /usr/local/etc/php/

RUN apt-get update \
  && apt-get install -y openssh-server fontconfig libxext6 zlib1g-dev libpng-dev libssl-dev vim \
  && docker-php-ext-install zip pdo_mysql

# SSH関係
RUN mkdir /var/run/sshd

#Composer install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer


ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin

WORKDIR /var/www/html
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
internal_encoding = "UTF-8"
mbstring.language = "Japanese"
services:
  php:
    container_name: php
    build: ./php
    volumes:
      - ./app:/var/www/html
    networks:
      - local

  selenium:
    container_name: selenium
    image: seleniarm/standalone-chromium
    platform: 'linux/arm64'
    shm_size: '2gb'
    ports:
      - 11064:4444
      - 11065:5900
    networks:
      - local
    privileged: true

networks:
  local:

用意ができました。

2. テストを用意

次にメインのテストを用意します。
SeleniumとPHPUnitを使ってブラウザテストを実現させます。

<?php

use PHPUnit\Framework\TestCase;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\WebDriverBy;

class SeleniumTest extends TestCase
{
    private $driver;

    protected function setUp(): void
    {
        // SeleniumサーバーのURLを指定
        $host = 'http://selenium:4444/wd/hub';
        $this->driver = RemoteWebDriver::create($host, DesiredCapabilities::chrome());
    }

    protected function tearDown(): void
    {
        $this->driver->quit();
    }

    public function testPageContainsText()
    {
        // 対象のURLを指定
        $this->driver->get('https://example.com');

        // 検索する文字列
        $textToFind = "Example Domain";
        $pageSource = $this->driver->getPageSource();

        // 文字列が含まれているかチェック
        $this->assertStringContainsString($textToFind, $pageSource);
    }
}

https://example.comにアクセスして、
指定の文字列があるかどうかをチェックする簡単なテストです。

3. GitHubActionsの作成

次に上記のテストをCIフローの中で自動実行するために
GitHubActionsを作成します。

name: 本番環境のテスト

on:
  push:
    branches:
      - main

  #schedule:
    #定期実行する時間
    # 時はUTCで指定する。時間差は9時間。02:00はJSTだと11:00
    # 毎日17:00(日本時間02:00)に実行する
    # 実行タイミングは20〜30分のラグが発生する可能性があります
    #- cron: '0 5 * * *'

jobs:

  deploy:

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: docker compose準備・起動
        run: docker compose up -d

      - name: composer
        run: docker compose exec php composer install

      - name: テスト実行
        run: docker compose exec php php vendor/bin/phpunit

UnitTestを実行する環境を作るためにdocker composeを起動し、それ経由でcomposerにてPHPUnitとWebドライバーのインストールをし、PHPUnitでテストを実行するという流れです。
また、scheduleで自動実行のタイミングを指定することもできます。

今回は以上です!