[CircleCI 2.0] Laravel8.15.0で使用する

# 前準備
1. テスト用の.envファイル作成
$ cp .env.example .env.testing

2. .env.testingのAPP_KEY作成
$ php artisan key:generate –env=testing

.env.testing

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=circle_test
DB_USERNAME=hogehoge
DB_PASSWORD=fugafuga

DB_DATABASEは、circle_testする。

3. テストコード作成
$ php artisan make:test UserRegisterTest

4. デフォルトのテストコードは削除
$ rm ./tests/Feature/ExampleTest.php
$ rm ./tests/Unit/ExampleTest.php

tests/Feature/UserRegisterTest.php
L RefreshDatabaseを使用すると、各テスト前後にマイグレーションとロールバックを実行

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;

class UserRegisterTest extends TestCase
{
    use RefreshDatabase;
    public function testExample()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}

5. UnitTestのテスト
$ vendor/bin/phpunit –testdox
PHPUnit 9.4.3 by Sebastian Bergmann and contributors.

User Register (Tests\Feature\UserRegister)
✔ Example

Time: 00:00.646, Memory: 26.00 MB

OK (1 test, 1 assertion)

6. ユーザ登録のテスト
$ php artisan route:list | grep register
| | GET|HEAD | register | register | Laravel\Fortify\Http\Controllers\RegisteredUserController@create | App\Http\Middleware\EncryptCookies |
| | POST | register | | Laravel\Fortify\Http\Controllers\RegisteredUserController@store | App\Http\Middleware\EncryptCookies |

tests/Feature/UserRegisterTest.php

class UserRegisterTest extends TestCase
{
    use RefreshDatabase;

    public function testUserRegister()
    {
        $email = 'hogehoge@gmail.com';
        $this->post(route('register'), [
            'name' => 'user1',
            'email' => $email,
            'password' => 'password',
            'password_confirmation' => 'password'
        ])
            ->assertStatus(302);

        $this->assertDatabaseHas('users', ['email' => $email]);
    }
}

$ vendor/bin/phpunit –testdox
PHPUnit 9.4.3 by Sebastian Bergmann and contributors.

User Register (Tests\Feature\UserRegister)
✔ User register

Time: 00:00.463, Memory: 28.00 MB

OK (1 test, 2 assertions)

※functionはtestで始まる必要があり、userRegisterだと、No tests found in class “Tests\Feature\UserRegisterTest”となる。

これをCircleCIで行う

# CircleCIでのテスト
1. config/database.php
L circle_testingを追記する

        'circle_test' => [
            'driver' => 'mysql',
            'host' => '127.0.0.1',
            'port' => '3306',
            'database' => 'circle_test',
            'username' => 'root',
            'password' => '',
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],

2. GithubでPrivateのrepositoryを作成し、projectをgit pushします。
$ git init
$ git add .
$ git commit -m “first commit”
$ git remote add origin https://github.com/hoge/fuga.git

3. CircleCIにログインしてSetupProject

Add Configボタン押下

This package requires php ^7.3|^8.0 but your PHP version (7.1.33) does not satisfy that requirement.

config.ymlのdocker imageがphp:7.1になってるからエラー。ここを7.3以上に修正する必要がある。
– dockerはphp:7.4.7を、MySQLは8系を使う
https://circleci.com/docs/ja/2.0/circleci-images/
mysql8系から認証方法が変わったので、command: [–default-authentication-plugin=mysql_native_password]を追記

version: 2
jobs:
  build:
    docker:
      - image: circleci/php:7.4.7-apache-node-browsers
      - image: circleci/mysql:8.0
        command: [--default-authentication-plugin=mysql_native_password]
 
    environment:
      - APP_DEBUG: true
      - APP_ENV: testing
      - APP_KEY: base64:hogehogefugafuga
      - DB_CONNECTION: circle_test
      - MYSQL_ALLOW_EMPTY_PASSWORD: true
 
    working_directory: ~/repo
 
    steps:
      - checkout
 
      - 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:
          paths:
            - ./vendor
          key: v1-dependencies-{{ checksum "composer.json" }}
 
      - run: php artisan migrate
      - run: php artisan db:seed
 
      - run: php ./vendor/bin/phpunit

$ git add .
$ git config –global core.autoCRLF false
$ git commit -m “circleci”
$ git remote add origin https://github.com/hoge/hoge.git
$ git push -u origin master

復習にちょっと時間がかかり過ぎてしまったが、まぁOKでしょう。というか、Djangoで開発するときも、ちゃんとCircleCI使えばよかった。
これを実装していきます。