人気のPHP WEBアプリケーションフレームワークLaravelのTips。 (Laravelアプリの初期化)composer create-project laravel/laravel my-app

LaravelでPest使う

1 . PHPユニットに感謝しつつ削除する

composer remove phpunit/phpunit

2 . Pest をインストール

composer require pestphp/pest --dev --with-all-dependencies

3 . Pest の初期化

./vendor/bin/pest --init

4 . テスト実行

./vendor/bin/pest

.bash_profile Aliasを設定しておきましょう。

alias pest='./vendor/bin/pest'

laravle pest で 指定したタイトルにマッチするテストだけを実行

pest --filter="ユーザー作成に成功する"

5 . テスト用DBを用意する

cp .env .env.testing

.env.testing

# テスト用インメモリ Sqlite
DB_CONNECTION=sqlite
DB_DATABASE=:memory:

phpunit.xml

<php>
    <env name="APP_ENV" value="testing"/>
</php>

6 . テスト実行

./vendor/bin/pest

7 . DBの テストを書いてみる

tests/Feature/ExampleModelTest.php

<?php

use App\Models\Post;
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

test('postsテーブルにデータを1件追加できる', function () {
    // 初期状態でpostsテーブルが空であることを確認
    expect(Post::count())->toBe(0);

    // データを追加
    $post = Post::create([
        "name" => "テストタイトル",
        "content_name" => "テストデータ",
    ]);

    // データベースに1件追加されたことを確認
    expect(Post::count())->toBe(1);

    // 追加されたデータが存在することを確認
    $this->assertDatabaseHas('posts', [
        'id' => $post->id,
    ]);
});

デバッグ情報を表示させるにはこちらを追加します

beforeEach(function () {
  // データベース接続情報を表示
  $connection = DB::connection();
  dump([
    '===== データベース接続情報 =====' => '',
    'ドライバー' => $connection->getDriverName(),
    'データベース名' => $connection->getDatabaseName(),
    'ホスト' => $connection->getConfig('host'),
    'ポート' => $connection->getConfig('port'),
    '接続名' => $connection->getName(),
    '環境変数 DB_CONNECTION' => env('DB_CONNECTION'),
    '環境変数 DB_DATABASE' => env('DB_DATABASE'),
    '環境変数 APP_ENV' => env('APP_ENV'),
    '================================' => '',
  ]);
});

8 . テスト実行

./vendor/bin/pest

9 . エンドポイントのテストを行う

.env.testing の APP_URLに ディレクトリを含む場合は、そのディレクトリを追加したURLとしてアクセスされるので注意してください。

APP_URL=http://localhost/hogehoge

の場合

EndpointTest.php

<?php

describe('GET /hello', function () {

  test('正常系: /hello エンドポイントが正常に動作する', function () {
    $response = $this->get('/hello');
    $response->assertStatus(200);
  });
});

なので、.env.testing では

# ===== テスト用URL(テスト用にサブディレクトリは含まないように記述すること。 ) =====
APP_URL=http://localhost
# ===== /テスト用URL =====

する必要があります 。

なお、テストを書くときは以下の原則に従って書くと良いテストが書きやすいです。

1. テストの独立性(Test Isolation)

  • 各テストは他のテストに依存せず、独立して実行できるべき
  • どの順序で実行しても同じ結果になるべき
  • 何度実行しても同じ結果になる(べき等性)
No.2679
11/08 09:43

edit