CircleCIを利用してLaravelのPHPUnitによるデータベースと絡んだ簡単なテスト自動化をおこなってみます。リモートリポジトリはGitHubを利用します。
Laravelプロジェクトの準備
Laravelの適当なプロジェクトを作成し、PHPUnitの準備をします。ここでの項目の説明はCircleCIとは直接関係ないので不必要な方は飛ばして下さい。今回はデータベース(MySQL)を利用した簡単なテストを想定しています。Laravelのテストに関する説明は関連ページをご覧下さい。
モデルとマイグレーションファイルを作成します。
1 |
$ php artisan make:model Book --migration |
マイグレーションファイルを下記のように編集します。titleとauthorカラムを持つbooksテーブルを生成します。
database/migrations/2020_04_27_070910_create_books_table.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateBooksTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('books', function (Blueprint $table) { $table->id(); $table->string('title'); $table->string('author'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('books'); } } |
テスト用のデータベースを作成しておきます。本記事ではあらかじめ「test_sample01」という名前のデータベースを作成しておきます。.env をコピーして .env.testing を作成し、下記のように編集します。
1 2 3 4 5 6 |
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=test_sample01 DB_USERNAME=hoge DB_PASSWORD=pass |
次にphpunit.xmlを編集します。
1 2 3 4 5 6 7 8 9 10 11 12 |
〜 <php> <server name="APP_ENV" value="testing"/> <server name="BCRYPT_ROUNDS" value="4"/> <server name="CACHE_DRIVER" value="array"/> <server name="DB_CONNECTION" value="mysql"/> <server name="DB_DATABASE" value="test_sample01"/> <server name="MAIL_DRIVER" value="array"/> <server name="QUEUE_CONNECTION" value="sync"/> <server name="SESSION_DRIVER" value="array"/> </php> 〜 |
「–env=testing」オプションを付与し、マイグレーションを実行します。
1 |
$ php artisan migrate --env=testing |
テストコードを記述するファイルを作成し、下記のように編集します。
1 |
$ php artisan make:test Database/DatabaseTest |
tests/Feature/Database/DatabaseTest.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php namespace Tests\Feature\Database; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\WithFaker; use Tests\TestCase; use App\Book; class DatabaseTest extends TestCase { use RefreshDatabase; public function testDatabase() { $book = new Book(); $book->title = 'hoge'; $book->author = 'tarou'; $saveBook = $book->save(); $book = [ 'title' => 'hoge', ]; $this->assertDatabaseHas('books', $book); } } |
テスト用データベースに値を保存できるかを確認しています。
CircleCI
今回はGitHubに「laravel-project」という名前のリポジトリを用意し、上記で説明したLaravelのプロジェクトをあらかじめpushしておきます。
CircleCIへはGitHubアカウントで登録します。ログインするとProjects画面において、GitHubで作成したリポジトリが表示されているのが確認できます。
CircleCIでの「Set Up Project」操作の前に、Laravelプロジェクトのルートディレクトリに.circleciディレクトリを作成し、そのディレクトリ内にconfig.ymlファイルを作成します。
1 |
$ mkdir .circleci && touch .circleci/config.yml |
config.ymlを下記のように編集します。
Laravelのプロジェクト/.circleci/config.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
version: 2 jobs: build: docker: - image: circleci/php:7.3-node-browsers environment: - APP_DEBUG: true - APP_ENV: testing - DB_CONNECTION: mysql - DB_DATABASE: test_sample01 - DB_USERNAME: root - image: circleci/mysql:5.7-ram environment: - MYSQL_ALLOW_EMPTY_PASSWORD: true - MYSQL_DATABASE: test_sample01 steps: - checkout - run: sudo apt update - run: sudo docker-php-ext-install pdo_mysql - restore_cache: keys: - v1-dependencies-{{ checksum "composer.json" }} - v1-dependencies- - run: composer install -n --prefer-dist - save_cache: key: v1-dependencies-{{ checksum "composer.json" }} paths: - ./vendor - run: echo "APP_KEY=" > .env.testing - run: php artisan key:generate - run: php artisan migrate - run: ./vendor/bin/phpunit |
4〜16行目
– imageにはプロジェクトをビルドする際のDockerイメージを指定します。circleci/〜はCircleCIが用意したイメージです。environmentには環境変数を指定します。
24〜34行目
CircleCIにはキャッシュ機能があります。上記コードでは29行目のcomposerによるパッケージのインストール処理を挟むことにより実現しています。restore_cacheは、composer.lockが変更されていない場合に発動します。save_cacheではcomposer.lockに基づきキャッシュを保存します。
config.ymlの準備が完了したら、GitHubリポジトリにpushしておきます。
CircleCIのProjects画面(上述で記載した画面)で「Set Up Project」をクリックすると、下記画面に変わるのでそのまま「Start Building」をクリックします。
「Add Manually」を選択します。
「Start Building」をクリックします。
下記のような画面に切り替わり、「SUCCEEDED」と表示されたら成功です。
「SUCCEEDED」をクリックし遷移した画面内で「build」を更にクリックすると、実行の様子を確認できます。
関連ページ
Laravel(EC2)CircleCIによるデプロイ(deploy)の自動化
参照ページ