理系公務員のプログラミング日記

【Laravel6】ユニットテスト

タグ:
Laravel

テスト

全てのアプリケーションは、コードを書いて完成したらそれで終わりではありません。

テストを行って検証する必要があります。

いくらコードを書いた人が大丈夫だと言っても想定外のバグは必ず発生します。

テストを書いて実行して検証することで、想定外のバグを少しでも減らす必要があります。

Laravelでのテストは主に下記の2種類に分けることができます。

  • ユニットテスト・・・・クラスやメソッドなどモジュール単位の動作、データベースの動作を検証するためのテスト
  • フィーチャ-テスト・・・WebページやAPI機能を検証するためのテスト。(feature:特徴)

ユニットテスト

まずはユニットテストを実行してみます。ユニットテストには、PHP Unitというライブラリを利用します。

PHP Unit はコマンド1つでユニットテストを実行してくれる、自動テストツールです。Laravelでは最初からインストールされています。

テストを作成する

下記のコマンドで、SampleTest.phpという名前のテストを実行するphpファイルを作成します。

php artisan make:test SampleTest --unit

テストを実行するファイルでは、TestCaseクラスを継承して作成していきます。

また、クラス名とファイル名はTestで終わる必要があります。

作成されたコードでは、assertTrue()というメソッドがあります。

これは、引数がtrueであるかを判定します。

SapleTest.php

<?php namespace Tests\Unit; use PHPUnit\Framework\TestCase; class SampleTest extends TestCase { /** * A basic unit test example. * * @return void */ public function testExample() { $this->assertTrue(true); } }

PHP Unitを実行する

このSampleTest.phpを下記のコマンドで実行してみます。

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

実行結果

PHPUnit 9.5.10 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 00:00.020, Memory: 6.00 MB

OK (1 test, 1 assertion)

$this->assertTrue(true); のテストが成功した(引数がtureであることが確認できた)ので、このテストは成功しました!

テストメソッドの実装

そりゃそうだろとなってしまうので、このSampleTest.phpにテストを書いていきます。

テストの実行内容はメソッドの形で書いていくので、これをテストメソッドといいます。

assertTrueのように、調べたい内容によって利用できるメソッドが一通り用意されています。 参考:PHP Unit 1.アサーション

SampleTest.php

<?php namespace Tests\Unit; use PHPUnit\Framework\TestCase; class SampleTest extends TestCase { /** * A basic unit test example. * * @return void */ public function testExample() { // trueであるか $this->assertTrue(true); // falseであるか $this->assertFalse(false); // 空であるか $arr = []; $this->assertEmpty($arr); // 指定した文字と一致するか $msg = 'Hello'; $this->assertEquals('Hello',$msg); // 指定した値以下であるか $n = random_int(0,100); $this->assertLessThan(100,$n); } }

実行結果

1つのテストの5個のassertionが成功したと出ました。

PHPUnit 9.5.10 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 00:00.028, Memory: 6.00 MB

OK (1 test, 5 assertions)

テスト対象クラスに対してテストを実行する

Appフォルダの直下に下記のファイルを作ってください。

このSampleクラスに対してテストを実行してみます。

Sample.php

<?php namespace App; class Sample { public function add($num1, $num2) { return $num1 + $num2; } public function sub($num1, $num2) { return $num1 - $num2; } }

SampleTest.phpでは、このSample.phpを利用してテストメソッドを編集します。

SampleTest.php

<?php namespace Tests\Unit; use PHPUnit\Framework\TestCase; use App\Sample; class SampleTest extends TestCase { /** * A basic unit test example. * * @return void */ public function test_add() { $sample = new Sample; $sum = $sample->add(5, 3); $this->assertEquals(8, $sum); } /** * @test */ public function 引き算() { $sample = new Sample; $sum = $sample->sub(5, 3); // あえて失敗させてみる $this->assertEquals(1, $sum); } }

テストメソッドはなんと日本語でも大丈夫です。

その場合は、上記のように@testアサーションを追加する必要があります。

日本語で記述すると、テストが失敗時にテストメソッド名が表示されるので読みやすくなります。

実行結果(失敗した場合)

PHPUnit 9.5.10 by Sebastian Bergmann and contributors.

.F                                                                  2 / 2 (100%)

Time: 00:00.057, Memory: 6.00 MB

There was 1 failure:

1) Tests\Unit\SampleTest::引き算
Failed asserting that 2 matches expected 1.

/work/backend/tests/Unit/SampleTest.php:29

FAILURES!
Tests: 2, Assertions: 2, Failures: 1.

例題 

ECサイトで商品を購入した際に獲得できるポイントを計算するクラス(Calculate.php)を作成しました。

購入金額が1000円以上の場合に100円に付き、1ポイント

購入金額が10000円以上の場合に100円に付き、2ポイント

獲得できます。

このクラスを検証するテストメソッドを実装してください。

Calculate.php

<?php namespace App; class CalculatePoint { public function CalculatePoint(int $amount): int { if ($amount < 1000){ return 0; } if ($amount < 10000){ $basePoint = 1; } else { $basePoint = 2; } return intval($amount/100) * $basePoint; } }

参考:Laravel PHPUnitでテスト入門