先週はテストコードを作成してみてほしいと言われた。
作成しながら学んだことを基本のキとしてまとめておく。
Laravelのテスト
Laravelは動作を保証するためにPHPUnitを使用したテストを標準でサポートしている。
テストを適切に行うことで、バグの発生を防げる。
Laravelのテストは大きく以下の2種類に分類される。
Unitテスト(単体テスト): 小さな単位のコード(メソッドやクラス)をテスト。
Featureテスト(機能テスト): HTTPリクエストやデータベース操作を含む、アプリ全体の動作をテスト。
ざっくりアプリのCRUD系、Httpリクエスト系基本動作の確認なので現在はFeatureにコードを書いている。
UnitテストとFeatureテストの違い
Unitテスト
tests/Unit
フォルダに格納されるテスト。
主に個々のクラスやメソッドの動作を確認。
特徴:
- データベースへのアクセスなし
- 依存関係が少ない
- 処理速度が速い
Featureテスト
tests/Feature
フォルダに格納されるテスト。
主にアプリケーションの機能全体をテストする。
特徴:
- HTTPリクエストのテストが可能
- データベースの操作を含む
- Laravelの
TestCase
を継承するため、各種ヘルパーメソッドを使用可能
基本的なメソッドの使い方
テストで初めて見たアサーションの数々。
アサーションメソッド
$this->assertEquals($expected, $actual)
期待値と実際の値が一致するか確認
$this->assertTrue($boolean)
値がtrueか確認
$this->assertFalse($boolean)
値がfalseか確認
$this->assertNull($value)
値がnullか確認
$this->assertDatabaseHas('users', ['email' => 'test@example.com'])
指定したデータがDBに存在するか確認
HTTPレスポンステスト
$this->get('/dashboard')
GETリクエストを送信
$this->post('/register', $data)
POSTリクエストを送信
$this->put('/profile', $data)
PUTリクエストを送信
$this->delete('/user')
DELETEリクエストを送信
$response->assertStatus(200)
ステータスコードが200か確認
その他にアクセスが許されなければ403。存在しなければ404。
$response->assertRedirect('/home')
指定のURLにリダイレクトするか確認
$response->assertJson(['message' => 'Success'])
JSONレスポンスの中身を確認
その他によく使っていたメソッド
use RefreshDatabase;
テストごとにデータベースをリフレッシュする
$this->actingAs($user)
指定したユーザーとして認証済みの状態でテストを実行
$this->withoutMiddleware()
ミドルウェアを無効化してテストを実行
これを行うと弊害が結構でる。
バリデーションも無視。
使わない方向で作成した。
PostgreSQLを使ったテスト環境の構築
.env.testing の設定
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=calorie_busters_test
DB_USERNAME=root
DB_PASSWORD=your_password
下記のコマンドを実行
php artisan key:generate --show
発行されたキーを.env.testingのAPP_KEYに記載。
docker-compose exec db psql -U laravel
//laravelのユーザーネームでDBにアクセス
CREATE DATABASE my_test_database;
//my_test_databaseという名前のDB作成
\q
//DBから抜ける。
docker compose exec app php artisan migrate --env=testing
//データベースのマイグレーションを実行する。
テストの実行方法
全体のテストを実行
docker compose exec app php artisan test
ファイル単体のテスト実行
docker-compose exec app php artisan test tests/feature/Admin/BranchControllerTest.php