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のデータを使ったテストはまた別の機会にでも書こうと思います。
この記事が気に入ったらサポートをしてみませんか?