Laravel PHPUnitとは?

– ドメインロジックに対してテストを行う
– vendor/bin/phpunit –filter ${methodName}でテスト実行
– test用のDBをテスト毎にリフレッシュしてテストしている
 – > use Illuminate\Foundation\Testing\RefreshDatabase;

$ php artisan –version
Laravel Framework 6.9.0

$ vendor/bin/phpunit
PHPUnit 8.5.0 by Sebastian Bergmann and contributors.

..                                                                  2 / 2 (100%)

Time: 310 ms, Memory: 16.00 MB

OK (2 tests, 2 assertions)

tests/Feature/ExampleTest.php

namespace Tests\Feature;

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

class ExampleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}
public function a_new_user_gets_an_email_when_it_register(){
        
    }

### 未ログインユーザーのリダイレクトテスト
tests/Feature/CustomersTest.php

class CustomersTest extends TestCase
{
    public function only_logged_in_users_can_see_the_customers_list(){
        $response = $this->get('/customers')->assertDedirect('/login');
    }
}

$ vendor/bin/phpunit –filter only_logged_in_users_can_see_the_customers_list

### ログインユーザーのリダイレクトテスト

class CustomersTest extends TestCase
{
    use RefreshDatabase;
    
    public function only_logged_in_users_can_see_the_customers_list(){
        $response = $this->get('/customers')->assertDedirect('/login');
    }

    public function authenticated_users_can_see_the_customers_list(){
        $this->actingAs(factory(User::class)->create());

        $response = $this->get('/customers')->assertOk('200');
    }
}

$ vendor/bin/phpunit –filter authenticated_users_can_see_the_customers_list

### store methodのテスト

public function a_customer_can_be_added_through_the_form(){

        $this->withoutExceptionHandling();
        $this->actingAs(factory(User::class)->create([
                'email' => 'admin@admin.com'
        ]));

        $response = $this->post('customers', [
                'name' => 'Test User',
                'email' => 'test@test.com',
                'active' => 1,
                'company_id' = 1

        ]);

        $this->assertCount(1, Customer::all());
    }

### validation test

private function data(){
        return [
                'name' => 'Test User',
                'email' => 'test@test.com',
                'active' => 1,
                'company_id' = 1
        ]
    }
public function a_name_is_required(){

        Event::fake();

        $this->actingAs(factory(User::class)->create([
                'email' => 'admin@admin.com'
        ]));

        $response = $this->post('customers', array_merge($this->data(), ['name' => '']));

        $response->assertSessionHasErrors('name');

        $this->assertCount(0, Customer::all());

    }

手動で行っているテストをRefreshDatabaseを使ってコードでテストしている。PHPUnitの概念は解った。実務でどこまで細かくやるかだな。全部PHPUnitで確認するのはしんどいが、
間違いが絶対に許されない、かつ、複雑な処理の箇所は、アジャイル開発でもPHPUnitできちんとテストした方がセキュアで良いかもしれません。