はじめに
こんばんは。
今回は github actionで laravelのunit testを対応した備忘録です。
参考サイト
本題
まずは例のごとくいきなりコードどかっと載せます。
name: Unit Test
on:
push:
branches: [ develop ]
pull_request:
branches: [ develop ]
jobs:
unit-test:
runs-on: ubuntu-latest
services:
mysql:
image: mysql:8.0.19
ports:
- 3306:3306
options: --health-cmd "mysqladmin ping -h 127.0.0.1" --health-interval 20s --health-timeout 10s --health-retries 10
env:
MYSQL_ROOT_PASSWORD: rootパスワード
MYSQL_DATABASE: データベース名
MYSQL_USER: ユーザー名
MYSQL_PASSWORD: パスワード
steps:
- uses: actions/checkout@v2
- name: Copy .env
run: php -r "file_exists('.env.testing') || copy('.env.testing.example', '.env.testing');"
- name: Change Directory Permissions
run: chmod -R 777 storage bootstrap/cache
- name: Install Libraries
run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
- name: Generate Key
run: php artisan key:generate --env=testing
- name: Execute Test
run: composer test
github actionのworkflowテンプレートでは sqliteを使用しているバージョンが紹介されていたのですが、今回は、mysql8のwindow関数とかを使ってたので、mysqlを使用したバージョンになります。
testの実行は composer のscriptsに適当にセットしております。
また、今回、共通で実行したいSeederがあったので ベースの TestCaseクラスを少し修正しています。
<?php declare(strict_types=1); namespace Tests; use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Foundation\Testing\TestCase as BaseTestCase; abstract class TestCase extends BaseTestCase { use CreatesApplication; use DatabaseTransactions; private static $init = false; protected function setUp(): void { parent::setUp(); if (!self::$init) { $this->artisan('migrate:fresh --seed'); self::$init = true; } } }
最初は static変数せずに直で artisanコマンドを実行していたのですが、そうすると DatabaseTransactionTraitが毎回きれいに消してくれて、実行時に毎回 seed実行が走ってしまったため、このような対応になりました。
終わりに
もうすぐ10月になります。
例年ならば1人アドカレそろそろ仕込み始める時期ですが、今年は子供のことで少しプライベートが忙しく、ちょっと無理かもしれません...
現場からは以上です。