Laravel

LaravelをCircleCIで自動テストする方法

いつもご利用ありがとうございます。このブログは、広告費によって運営されています。

Web技術を勉強するなら、かなりオススメの雑誌です。毎月新しい発見があります。

⇨ Laravel 記事の目次はこちら

Laravel を CircleCI で自動テストする方法について記事にしました。

この記事では、「自動デプロイ」はやりません。

あくまで、「テスト」の実行で詰まっている人向けの記事となります。

Laravel プロジェクトを CircleCI でテストする方法

今回の実装する方法としては、CircleCI 上でテスト用の sqlite(データベース)を作成し、そこでテストを実行するというやり方です。

CircleCI の管理画面で GitHub のリポジトリと紐付ける

これはログインしてリポジトリを選択してください。

GitHub と連携するので GitHub でログインするのがオススメです。

⇨CircleCI のログインページ

.env.testing を作成する

ローカルで使っている.env ファイルをコピーして、.env.example を作成します。

ローカルで見せてはいけない APIkey を設定しているとは思いませんが、

  • 重要な情報は消しておいてください
  • データベースの設定を以下のようにコメントアウトしてください(以降記述する項目で設定するため)
# DB_CONNECTION=mysql
# DB_HOST=127.0.0.1
# DB_PORT=8889
# DB_DATABASE=
# DB_USERNAME=root
# DB_PASSWORD=root

config/database.php に追加

テスト用の項目を増やします。

'sqlite_testing' => [
    'driver' => 'sqlite',
    'url' => env('DATABASE_URL'),
    'database' => env('DB_DATABASE', storage_path('testing.sqlite')),
    'prefix' => '',
    'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
],

混乱しやすいのは、

'database' => env('DB_DATABASE', storage_path('testing.sqlite')),

の部分で、これは

storage/testing.sqlite ファイルを SQLite の DB として使う設定です。

つまり、ファイルを storage/testing.sqlite に生成する必要があるというわけです。

phpunit.xml を編集する

<server name="APP_ENV" value="testing"/>
<server name="BCRYPT_ROUNDS" value="4"/>
<server name="CACHE_DRIVER" value="array"/>
<server name="DB_CONNECTION" value="sqlite_testing"/>
<server name="DB_DATABASE" value="storage/testing.sqlite"/>
<server name="MAIL_MAILER" value="array"/>
<server name="QUEUE_CONNECTION" value="sync"/>
<server name="SESSION_DRIVER" value="array"/>
<server name="TELESCOPE_ENABLED" value="false"/>

重要なのは、

<server name="DB_CONNECTION" value="sqlite_testing"/>

ここで、先ほど作成した設定を phpunit で使うようしています。

.circleci/config.yml ファイルを編集する

# PHP CircleCI 2.0 configuration file
# See: https://circleci.com/docs/2.0/language-php/
version: 2

# Define a job to be invoked later in a workflow.
# See: https://circleci.com/docs/2.0/configuration-reference/#jobs
jobs:
  build:
    # Specify the execution environment. You can specify an image from Dockerhub or use one of our Convenience Images from CircleCI's Developer Hub.
    # See: https://circleci.com/docs/2.0/configuration-reference/#docker-machine-macos-windows-executor
    docker:
      # Specify the version you desire here
      - image: circleci/php:7.4-node-browsers

      # Specify service dependencies here if necessary
      # CircleCI maintains a library of pre-built images
      # documented at https://circleci.com/docs/2.0/circleci-images/
      # Using the RAM variation mitigates I/O contention
      # for database intensive operations.
      # - image: circleci/mysql:5.7-ram
      #
      # - image: redis:2.8.19

    # Add steps to the job
    # See: https://circleci.com/docs/2.0/configuration-reference/#steps
    steps:
      - checkout

      # - run: sudo apt update # PHP CircleCI 2.0 Configuration File# PHP CircleCI 2.0 Configuration File sudo apt install zlib1g-dev libsqlite3-dev
      # - run: sudo docker-php-ext-install zip

      # Download and cache dependencies
      - restore_cache:
          keys:
            # "composer.lock" can be used if it is committed to the repo
            - v1-dependencies-{{ checksum "composer.json" }}
            # fallback to using the latest cache if no exact match is found
            - v1-dependencies-

      - run: composer install -n --prefer-dist

      - save_cache:
          key: v1-dependencies-{{ checksum "composer.json" }}
          paths:
            - ./vendor
      - restore_cache:
          keys:
            - node-v1-{{ checksum "package.json" }}
            - node-v1-
      - run: yarn install
      - save_cache:
          key: node-v1-{{ checksum "package.json" }}
          paths:
            - node_modules
      - run:
          name: "Create database and run migration"
          command: |
            touch storage/testing.sqlite
            php artisan migrate --env=testing --database=sqlite_testing --force
      # run tests with phpunit or codecept
      - run:
          name: "テスト"
          command: |
            ./vendor/bin/phpunit
  1. php7.4
  2. vendor をキャッシュ化
  3. テスト用の DB を作成し、PHPUnit でテスト

これだけのミニマム設定です。

まとめ

以上です。

テストまでの記述ですので、自動デプロイの記述はこの後に付け足してみてください。

誰かの参考になればと思います。

感想・苦情は TwitterDM にご連絡ください。

それでは!

人気記事

PHP7.4 + Laravel6 のプロジェクトを AWS EC2 にデプロイする

【laravel-breadcrumbs】Laravel でパンくずリストを実装する