もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

github actionでlaravelのunit test

はじめに

こんばんは。

今回は github actionで laravelのunit testを対応した備忘録です。

参考サイト

techracho.bpsinc.jp

本題

まずは例のごとくいきなりコードどかっと載せます。

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

現場からは以上です。