ども、カロージです。
前回のLaravel のテストの種類とその方法についての続きの記事になります。
今回は、Laravel Unit テストの具体的な内容について説明したいと思います。
はじめに
Laravelでのテスト実行には以下の3種類が存在しますが、
この3つのテストの内の1番目になります。
- UnitTest
- FeatureTest
- BrowserTest
環境面や前提としてインストールが必要なパッケージなどは、
前回の記事をご参照下さい。
おさらい
Unit Test
単体(Unit)テストは一つのメソッドが焦点で、最も細かい粒度でのテストになります。
実態としては、PHPUnitの拡張版で、最初からLaravelに含まれており、
プロジェクトファイル直下にphpunit.xml
ファイルも最初から装備されています。
個人的には、開発したクラスとテスト用クラスが、1対1になる様にファイルを生成すると管理しやすいです。
Unit Test 実装について
実装方法は、色々ありますが、私が良くやる方法です。
例えば、プロジェクトフォルダのapp 直下に「libs」というフォルダがあり、
libsフォルダの下に各ライブラリとなるPHPファイルや、ユーティリティとなるPHPファイルを格納したとします。
こんな感じのディレクトリ構成ですね。
ルート(プロジェクトフォルダ)-> app -> libs -> Utility.php
Utility.php の中身は、以下の様な感じだとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php namespace App\Libs; use Illuminate\Support\Str; use Exception; class Utility { /* * */ public function __construct(){ } /* * */ public static function getToken( $num = 32 ) { return substr(str_shuffle('1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'), 0, $num ); } } |
シンプルに、コンストラクタと「getToken」というメソッドしかありませんね。
手順的には以下な感じです。
- テスト用ファイルの生成
- 生成したファイルにテストコード追記
- テストの実行
1.テスト用ファイルの生成
まず、以下のコマンドにより「Utility.php」のUnitテスト用ファイルを生成します。
1 2 3 |
> php artisan make:test UtilityTest --unit Test created successfully. |
「UtilityTest.php」ファイルの中を覗いて見ると以下の様な記述になっているので、これに追記していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php namespace Tests\Unit; use PHPUnit\Framework\TestCase; class UtilityTest extends TestCase { /** * A basic unit test example. * * @return void */ public function testExample() { $this->assertTrue(true); } } |
2.テストコード追記
「getToken」というメソッドを見ると、数値を引数にランダムな文字列を生成しています。
- 引数に「11」を設定したら、ランダムな11文字が返ってくるよね?
- 引数に「0」以下の値を設定したら?
- 62文字から指定引数の分、文字列を取得しているけど、引数に「63」以上を設定したら?
- そもそも引数が数値以外だったら?
と言うことで、これを検証するコードを記述していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php namespace Tests\Unit; use PHPUnit\Framework\TestCase; use App\Libs\Utility; class UtilityTest extends TestCase { /** * A basic unit test example. * * @return void */ public function testExample() { $this->assertTrue(true); } /** * 引数に「11」を設定したら、ランダムな11文字が返ってくるよね?を検証 * このテスト用メソッドの名称は、任意に設定 * @return void */ public function testGetToken11() { $utility = new Utility(); $token = $utility->getToken( 11 ); $this->assertSame( 11 , strlen( $token ) ); } } |
「assertSame」というメソッドで、値が同じか?という判定をしています。
んで、他にも沢山、判定するメソッドがあるのですが、これらの事を「Assert」(アサーション)と言います。
※他のアサーションメソッドについては、以下URLをご参照下さい。(沢山あり過ぎてビビります。)
https://phpunit.readthedocs.io/ja/latest/assertions.html
3.テストの実行
取り合えず、テストの実行をします。
コマンドラインから以下を実行します。
1 |
PS C:\sample> ./vendor/bin/phpunit tests/Unit |
すると以下の様に実施結果が表示されます。
1 2 3 4 5 6 7 8 9 |
PS C:\sample> ./vendor/bin/phpunit tests/Unit PHPUnit 8.5.8 by Sebastian Bergmann and contributors. ................................................................. 65 / 65 (100%) Time: 254 ms, Memory: 10.00 MB OK (65 tests, 66 assertions) |
後はこれを各クラスのメソッド分、繰り返してコーディングして実施いく感じです。
でわ