ユニットテストとは
プログラム全体(画面遷移など)の動きを確認するテストのことを結合テストといいます。
一方で、ユニットテスト(単体テスト)とは関数やメソッドごとに行うテストのことをいいます。
システムがある程度出来上がってから行う結合テストと比べ、ユニットテストは関数などを作成するごとに行うのが一般的です。
※テストについては以下記事で解説しています。
ITエンジニアの第一歩!テストとは?
PHPUnitとは
PHPUnitとはLaravelに標準で用意されている単体テストツールのことです。
PHPUnitを利用するとコマンドを打つことで、テストコード(テストの内容をコードで書いたもの)で書かれた全てのユニットテストを自動で行ってくれます。
ユニットテストのメリット
ユニットテストを行うメリットは主に3つあります。
1つ目は、関数などを作成するごとに行うので問題を早期に発見することができるという点です。
他の関数との結合度が高い場合などはユニットテストですべての問題を発見できるわけではありませんが、関数単体の問題に関しては有効だと言えます。
2つ目は、ツールを使うことでテストを自動化できる点です。
Laravelの場合PHPUnitを使えばコマンドを打つことで複数のテストを数秒で行うことができるため、少ない作業量でテストを行うことができます。
3つ目は、テスト自体をコードとして残すことができるという点です。
ユニットテストはテストコードを作成して行うので、コード自体を残しておけば同じテストを何度でも実行することができます。
例えば
それでは実際にユニットテストをしてみましょう。
今回はDBからデータを取得する関数をテストしてみたいと思います。
データと関数は以下のようになっています。
<usersテーブル>
id | name | age |
1 | 太郎 | 20 |
<User.php>
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function selectUser()
{
$response = $this->select('name')->first();
return $response;
}
}
DBに接続するには.envファイルを修正する必要があります。
詳しくはこちらの記事を参考にしてください。
LaravelでDB(MySQL)へ接続し、データを取得する
まずは、テストを行いたいプロジェクトの下で以下のコマンドを実行しましょう。
php artisan make:test UserTest
「php artisan make:test テスト名」でtests/Featureの下にテスト用ファイルが作成されます。
テスト名は「~Test」とするのが一般的です。
UserTest.phpの中身はこのようになっていると思います。
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
class UserTest extends TestCase
{
/**
* A basic feature test example.
*
* @return void
*/
public function testExample()
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
では、データを取得する関数をテストするように書き換えてみましょう。
以下のように書き換えてみてください。
use App\Models\User; //追記
~中略~
public function testExample()
{
$user = new User();
$response = $user->selectUser();
$this->assertSame('太郎', $response['name']);
}
Userクラスをインスタンス化し、selectUser関数を呼び出してresponse変数に代入しています。
そして、assertSameメソッドで文字列の「太郎」とresponse変数のnameキーの値を比較しています。
では、以下のコマンドでテストを実行してみましょう。(Macの場合は「./vendor/bin/phpunit」になります)
vendor\bin\phpunit
テストが成功すればこのように表示されます。
C:\xampp\htdocs\<プロジェクトフォルダ>>vendor\bin\phpunit
PHPUnit 7.5.20 by Sebastian Bergmann and contributors.
... 3 / 3 (100%)
Time: 356 ms, Memory: 16.00 MB
OK (3 tests, 3 assertions)
もしこのようなエラーが出たらExampleTest.phpのassertStatusの引数を200から302に修正してみてください。
C:\xampp\htdocs\<プロジェクトフォルダ>>vendor\bin\phpunit
PHPUnit 7.5.20 by Sebastian Bergmann and contributors.
.F. 3 / 3 (100%)
Time: 384 ms, Memory: 16.00 MB
There was 1 failure:
1) Tests\Feature\ExampleTest::testBasicTest
Expected status code 200 but received 302.
Failed asserting that false is true.
C:\xampp\htdocs\<プロジェクトフォルダ>\vendor\laravel\framework\src\Illuminate\Foundation\Testing\TestResponse.php:133
C:\xampp\htdocs\<プロジェクトフォルダ>\tests\Feature\ExampleTest.php:19
FAILURES!
Tests: 3, Assertions: 3, Failures: 1.
まとめ
assertメソッドは他にも用意されているので、ぜひ調べてみてください。
最初は難しいかもしれませんが少しずつ慣れていきましょう。