見出し画像

Laravel学習記録 #023 自動テスト(単体テスト作成)について学ぶ

Laravelの自動テストについて学習したものをメモ程度にまとめてます。
今回はテスト単体テスト作成編です。

テストファイル作成

以下のコマンドでテストファイルを作成します。

tests/Featureディレクトリに作成

php artisan make:test HogeTest

tests/Unitディレクトリに作成

php artisan make:test HogeTest --unit

FeatureとUnitディレクトリの使い分けですが
Featureには機能テスト(要求に正しく応えるか)
Unitには単体テスト
を用意します。

テストコード

単体テストを例にテストコードを書いてみます。

以下のサービスクラスのメソッドに対する単体テストを考えます。
isEvenメソッドは引数の値が偶数である場合true、それ以外はfalseを返す関数です。

<?php

namespace App\Services;


class HogeService
{
    public function isEven($number)
    {
        // nullまたは空文字、または整数でない場合はfalseを返す
        if (!is_numeric($number) || !is_int($number)) {
            return false;
        }
        
        // 偶数の場合true
        return $number % 2 === 0;
    }
}


まず、ファイルをUnitディレクトリに作成します。

 php artisan make:test HogeServiceTest --unit

実際にコードを書いていきます。

<?php

namespace Tests\Unit;

use PHPUnit\Framework\TestCase;
use App\Services\HogeService;

class HogeServiceTest extends TestCase
{
    /**
     * @return void
     */
    public function test_isEven()
    {
        $service = new HogeService();

        $this->assertEquals(true, $service->isEven(2));
    }

}

・テストメソッドはtest_を頭につけて命名します。

・サービスクラスを利用するため、クラスのインスタンスを生成します。

use App\Services\HogeService;
$service = new HogeService();

・LaravelのテストではPHPUnitをサポートしているので、assertメソッドを利用して検証ができます。メソッドは色々用意されているので、「laravel assert 一覧」などで検索すると色々出てきます。

今回は期待値と実際の値を比較するassertEqualsを使用しています。

あとは、奇数の場合はfalseが返ること、nullや整数ではない場合falseが返ることを確認するためのケースを同じように追加すればOKです。

$this->assertEqualsに各パターンを用意せずに
データプロバイダを使用して作成する方法もあります。

<?php

namespace Tests\Unit;

use PHPUnit\Framework\TestCase;
use App\Services\HogeService;

class HogeServiceTest extends TestCase
{
    /**
     * アノテーションを使ってジェネレータ関数を利用
     * @dataProvider evenNumbersProvider
     * @return void
     */
    public function test_isEven($number, $expected)
    {
        $service = new HogeService();

        $this->assertEquals($expected, $service->isEven($number));
    }

    // データプロバイダ
    public function evenNumbersProvider()
    {
        return [
            [2, true],
            [10, true],
            [100, true],
            [1, false],  // 奇数
            [5, false],  // 奇数
            [101, false],  // 奇数
            [null, false],  // null
            ['', false],  // 空文字列
            ['abc', false],  // 文字列
            [3.14, false],  // 浮動小数点数
        ];
    }
}

データプロバイダとして
evenNumbersProvider()メソッドを定義します。
配列で、[数値, 期待値]を定義します。

これをテストコードに
@dataProvider evenNumbersProvider
としてアノテーションで指定することで利用できます。
$number, $expectedがそれぞれ数値、期待値になります。


テスト実行

テストを実行するには以下のコマンドで行います。

php artisan test

指定のテストクラスのみを実行する場合は

php artisan test --filter クラス名


実行すると以下のように結果が表示されます。

失敗した場合は以下のようにどこでエラーがあるかを教えてくれます。

こんな感じで簡単にテストを作成できます。

DBのデータを使ったテストはまた別の機会にでも書こうと思います。

この記事が気に入ったらサポートをしてみませんか?