# 前準備
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使えばよかった。
これを実装していきます。