はじめに
こんばんは。
今回は 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人アドカレそろそろ仕込み始める時期ですが、今年は子供のことで少しプライベートが忙しく、ちょっと無理かもしれません...
現場からは以上です。