Laravel UnitTest 調べてみた

LaravelにおけるUnitTest

Laravelには、クラスやメソッドなどのテストを行うUnitTestの機能が標準で装備されています。

正しくいうと、UnitTestはLaravelの機能ではなく、phpunitの機能を利用してテストを行います。

ざっくり以下の流れでテストを作成・実行していきます。

①テストクラスの作成

②テストメソッドの実装

③データプロバイダーの実装

④テストの実行

 

事前準備

今回は、以下メソッドをテストしていきたいと思います。

ラジオ番組の名前を調べるテストで、「オールナイトニッポン」の文言が入っていたらtrue、そうでなければfalseを返すメソッドです。

<?php
namespace App\Services;

class RadioProgram
{
 public static function checkIsAllNightNippon(string $programName)
 {
   $allnightNippon = 'オールナイトニッポン';
   if (strpos($programName, $allnightNippon) === false) {
     return false;
   } else {
     return true;
   }
 }
}

 

①テストクラスの作成

UnitTestのテストクラスは以下コマンドで作成することができます。

php artisan make:test ファイル名 --unit

tests/Units配下にファイルが作成されます。

以下作成されたファイル例になります。

<?php
namespace Tests\Unit;

use PHPUnit\Framework\TestCase; 

class SampleTest extends TestCase ・・・①
{
 public function test_example()
 {
   $this->assertTrue(true);
 }
}

①UnitTestのクラスはTestCaseを継承して実装されます。

 

②テストメソッドの実装

では実際にテストメソッドを実装していきたいと思います。

以下実装されたファイルになります。

<?php
namespace Tests\Unit;

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

class RadioProgramNameTest extends TestCase
{
 public function __construct(?string $name = null, array $data = [], $dataName = '')
 {
   parent::__construct($name, $data, $dataName);
 }

 public function radioProgramNamesForTest(): array ・・・①
 {
   return [
     'オールナイトニッポンのテスト' => ['オードリーのオールナイトニッポン', true],
     'オールナイトニッポン0のテスト' => ['佐久間宣行のオールナイトニッポン0', true],
     'レコメンのテスト' => ['レコメン', false]
   ];
 }
 /**
 * A basic unit test example.
 *
 * @test ・・・②
 * @dataProvider radioProgramNamesForTest ・・・①
 * @return void
 */
 public function radioProgramNameTest(string $radioProgramName, bool $result)
 {
   $isAllNightNippon = RadioProgram::checkIsAllNightNippon($radioProgramName); ・・・③
   $this->assertSame($isAllNightNippon, $result); ・・・④
 }
}

①データプロバイダーに関しては後ほどご紹介するのでひとまず置いておきます。

②テストメソッドの定義方法は以下の2種類があります。

1、testアノテーションを定義する

2、メソッド名に「test_」をつける

このどちらかの定義がされていればテストメソッドとして認識されます。

③今回テストするメソッドを実行します。

④assertSameメソッドで③で実行した値と予想した値が一致したら、テスト成功として値を返します。

ちなみに使用できるアサーションメソッドは他にもたくさんあるので、興味があれば調べてみてください。

 

③データプロバイダーの実装

データプロバイダーとは、1つのテストメソッドに複数の値を渡す仕組みになります。

データプロバイダーにより、1つのテストメソッドで複数のテストができるようになります。

上記のコードの①がデータプロバイダーになります。

①配列でテストメソッドに代入する値を指定します。

キーにテストの説明、値に実際に代入される値を指定します。

今回の場合は、値にテストメソッドの第一引数の値($programName)とテスト結果の予想($result)を指定します。

テストメソッドで指定した配列を使用するには、dataProviderアノテーションで配列を取得するメソッドを指定します。

以上で、配列で指定した値をテストメソッドでテストすることができます。

 

④テストの実行

テストの実行は以下コマンドを実行します。

 ./vendor/bin/phpunit tests/Unit/ファイル名.php

今回の実行結果は以下のものになります。

 ./vendor/bin/phpunit tests/Unit/RadioProgramNameTest.php


PHPUnit 9.5.6 by Sebastian Bergmann and contributors.
... 3 / 3 (100%)
Time: 00:00.005, Memory: 8.00 MB
OK (3 tests, 3 assertions)

3つのテストがOKになって、無事テストが完了しました。

 

以上!!!!!!!