GitHub Actionsで自動テスト

はじめに
プルリクエストを出すたびに手動でテストを実行するのは面倒ですよね。GitHub Actionsを使えば、コードをプッシュするだけで自動的にテストが実行されます。
今回は、Laravelプロジェクトでのテスト自動化設定を解説します。
前提条件
この記事は以下の環境・知識を前提としています。
必要な環境
| 項目 | バージョン | 備考 |
|---|---|---|
| PHP | 8.1以上 | 記事では8.3を使用 |
| Laravel | 9.x / 10.x / 11.x | PHPUnit同梱 |
| Git | 最新版推奨 | GitHub連携に必要 |
| GitHub | – | リポジトリ作成済み |
前提知識
- Git/GitHub:基本的なコミット、プッシュ、プルリクエストの操作
- Laravel:プロジェクトの基本構成を理解している
- Docker:コンテナの概念を理解している(詳しくなくてもOK)
PHPUnitについて
LaravelにはPHPUnitが標準で組み込まれています。以下のコマンドでテストを実行できます。
# Laravel Sailの場合
./vendor/bin/sail artisan test
# 通常のLaravelの場合
php artisan test
# または
./vendor/bin/phpunit
テストファイルは tests/ ディレクトリに配置します。
tests/
├── Feature/ # 機能テスト(HTTPリクエスト、DB連携など)
├── Unit/ # ユニットテスト(単体の関数・クラス)
└── TestCase.php # 基底クラス
テストがまだない場合は、まず簡単なテストを作成しましょう。
php artisan make:test ExampleTest
Dockerについて
GitHub Actionsでは、MySQLなどのサービスをDockerコンテナとして起動します。ローカル環境でDockerを使っていなくても、GitHub Actions上では自動的にコンテナが立ち上がるため、特別な設定は不要です。
ただし、概念として以下を理解しておくとスムーズです。
- コンテナ:独立した実行環境(仮想マシンより軽量)
- イメージ:コンテナの元となるテンプレート(例:
mysql:8.0) - サービス:バックグラウンドで動作するコンテナ
GitHub Actionsとは
GitHubが提供するCI/CDサービスです。リポジトリに .github/workflows/ ディレクトリを作成し、YAMLファイルを配置するだけで利用できます。
主なメリット:
- 無料枠が充実(パブリックリポジトリは無制限)
- GitHubとのシームレスな連携
- 豊富なアクションが公開されている
料金について:
- パブリックリポジトリ:無料
- プライベートリポジトリ:月2,000分まで無料(Freeプラン)
ワークフローファイルの全体像
name: Tests
on:
push:
branches:
- main
- develop
pull_request:
types:
- opened
- synchronize
- reopened
jobs:
tests:
runs-on: ubuntu-latest
services:
mysql:
image: mysql:8.0
env:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: testing
ports:
- 3306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
steps:
- uses: actions/checkout@v3
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
extensions: mbstring, dom, fileinfo, mysql, pdo_mysql
coverage: none
- name: Copy .env
run: cp .env.example .env
- name: Install Composer Dependencies
run: composer install --no-interaction --prefer-dist --optimize-autoloader
- name: Generate Application Key
run: php artisan key:generate
- name: Set Testing Environment
run: |
echo "DB_CONNECTION=mysql" >> .env
echo "DB_HOST=127.0.0.1" >> .env
echo "DB_PORT=3306" >> .env
echo "DB_DATABASE=testing" >> .env
echo "DB_USERNAME=root" >> .env
echo "DB_PASSWORD=password" >> .env
- name: Run Database Migrations
run: php artisan migrate --force
- name: Execute Tests
run: php artisan test
各セクションの解説
1. トリガー設定(on)
on:
push:
branches:
- main
- develop
pull_request:
types:
- opened
- synchronize
- reopened
実行タイミング:
mainまたはdevelopブランチへのプッシュ時- PRの作成・更新・再オープン時
2. MySQLサービス
services:
mysql:
image: mysql:8.0
env:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: testing
ports:
- 3306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
GitHub Actionsでは、ジョブと並行してDockerコンテナを起動できます。optionsのヘルスチェックで、MySQLが完全に起動してからテストが始まります。
ポイント:
image: mysql:8.0:MySQL 8.0のDockerイメージを使用MYSQL_DATABASE: testing:テスト用DBを自動作成--health-cmd:MySQLの起動完了を確認してから次のステップへ
3. PHP環境のセットアップ
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
extensions: mbstring, dom, fileinfo, mysql, pdo_mysql
coverage: none
shivammathur/setup-phpは定番のアクションです。必要なPHP拡張を簡単にインストールできます。
拡張機能の説明:
mbstring:マルチバイト文字列処理dom:XML/HTML操作pdo_mysql:MySQLへのPDO接続
4. 依存関係のインストール
- name: Install Composer Dependencies
run: composer install --no-interaction --prefer-dist --optimize-autoloader
オプションの説明:
--no-interaction:対話的な質問をスキップ--prefer-dist:配布用パッケージを優先(高速)--optimize-autoloader:オートローダーを最適化
5. 環境変数の設定
- name: Set Testing Environment
run: |
echo "DB_CONNECTION=mysql" >> .env
echo "DB_HOST=127.0.0.1" >> .env
...
.env.exampleをコピー後、テスト用のDB接続情報を追記しています。
導入手順
Step 1: ディレクトリ作成
mkdir -p .github/workflows
Step 2: ワークフローファイル作成
touch .github/workflows/tests.yml
Step 3: 内容をコピー
上記のYAMLファイルの内容をコピーして保存します。
Step 4: コミット&プッシュ
git add .github/workflows/tests.yml
git commit -m "Add GitHub Actions test workflow"
git push
これだけで、次回のプッシュから自動テストが動きます。
PRでの表示
テストが完了すると、プルリクエスト画面にチェックマークが表示されます。
- ✅ 緑:テスト成功
- ❌ 赤:テスト失敗
失敗時は「Details」からログを確認できます。
トラブルシューティング
テストが失敗する場合
- ローカルでテストが通るか確認
php artisan test - 環境変数の確認
.env.exampleに必要な変数が定義されているか確認 - マイグレーションエラー
ローカルと本番でDBスキーマに差分がないか確認
MySQLに接続できない場合
DB_HOSTが127.0.0.1になっているか確認- ヘルスチェックのオプションが正しいか確認
まとめ
GitHub Actionsを使えば、約70行のYAMLファイルでテスト自動化が実現できます。
得られる効果:
- テスト忘れの防止
- PRレビュー前の品質担保
- チーム全体のコード品質向上
まだ導入していないプロジェクトがあれば、ぜひ試してみてください。
