PHP

PHPUnitで日付・時刻のフォーマットをテストする方法

PHPUnitで日付・時刻のフォーマットをテストする方法【Laravel】

今回は、Laravelでテストを書く際に日付・時刻のフォーマットをテストする方法をまとめます。

少しでも日付(時刻)のフォーマットってどうテストするんだ。。と思っている方の参考になれば幸いです。

PHPUnitで日付・時刻のフォーマットをテストする方法

結論から言うとstrptimeメソッドを使います。

テストの実例は後ほど紹介するとして、まずはstrptimeメソッドについて説明しましょう。

 

strptimeメソッドについて

strptimeメソッドは、以下のフォーマットで使用します。

strptime ( string $date , string $format ) : array

 

第一引数には特定のフォーマットの日付を、第二引数には第一引数の日付のフォーマットを指定します。

 

この関数が行うことは、日付のパース(解析)です。日付を解析、変換して配列形式で返却します。

例えば、次のようなフォーマットを第一引数に指定した場合、

2020-09-19 02:59:01

 

以下のようにstrptime関数を通せば

strptime("2020-09-19 02:59:01", '%Y-%m-%d %H:%M:%S')

 

次のような結果が返ってきます。

array(9) {
  ["tm_sec"]=>
  int(1)
  ["tm_min"]=>
  int(59)
  ["tm_hour"]=>
  int(2)
  ["tm_mday"]=>
  int(19)
  ["tm_mon"]=>
  int(8)
  ["tm_year"]=>
  int(120)
  ["tm_wday"]=>
  int(6)
  ["tm_yday"]=>
  int(262)
  ["unparsed"]=>
  string(0) ""
}

 

便利な関数ではあるのですが、日付のフォーマットをテストする上で、上記のreturn値は重要ではありません。

 

重要なのは、strptime関数の第一引数と第二引数のフォーマットを合わせれば上記のような配列が得られるが、フォーマットが異なる場合はfalseが返ってくる点です。

 

日付フォーマットのテストではこの特性を利用します。

falseが返っていないことをアサートすれば、それが「正しいフォーマットを利用している」ことの証明(テスト)となるからです。

 

 

さて、ここまで長々と書いてきましたが、実際に日付のフォーマットをテストする上では、以下のポイントだけ押さえておけば十分だと思います。

strptime関数:第一引数に指定した日付と同じフォーマットを第二引数に指定しなければfalseを返す関数。逆に言えば、第一引数と第二引数のフォーマットが同じならfalse以外(配列)が返る

 

strptime関数については理解できたと思うので、次に、実際にstrptime関数を使って日付のフォーマットをテストしてみたいと思います。

strptimeを用いたテスト例

まずはテストの準備として、日付(時間)を返すクラスを作成します。

<?php

namespace App\Services;

class DateService
{
    public function getDate()
    {
        return date('Y-m-d H:i:s', time());
    }
}

 

単にdate関数で現在時刻をフォーマットしてreturnしているだけです。ここでは、以下のようなフォーマットの時刻が返されます。

2020-09-19 12:38:49

 

次にこの関数で生成する時刻のフォーマットが正しいか(意図したフォーマットとなっているか)を判定するテストを作成します。

<?php

namespace Tests\Services;

use Tests\TestCase;
use App\Services\DateService;

class DateServiceTest extends TestCase
{
    /** @test */
    public function 日付のフォーマットが正しいかテスト()
    {
        $service = new DateService;
        $result = $service->getDate();

        $this->assertNotFalse(strptime($result, '%Y-%m-%d %H:%M:%S'));
    }
}

 

先ほど説明した通り、strptimeメソッドでは、第一引数と第二引数のフォーマットが同じ場合は配列を返し、異なる場合はfalseを返します。

つまり、フォーマットが正しい場合はfalse以外が返るということです。

そのため、アサーションとしてはassertNotFalseを指定します。このアサーションにより、「false以外が返っていること」を担保できるからです。

 

また、strptimeメソッドの第二引数に指定するフォーマットはこちらを参考にしています。

 

それでは実際にテストを動かしてみましょう。

phpunitで日付・時刻フォーマットのテストが通る

 

通っていますね。

以上で、false以外が返ってきている=正しい(意図した)フォーマットの日付が返ってきていることがテストできました。

 

おわりに

今回は、strptime関数を使ってphpunitで日付(時刻)のフォーマットをテストする方法について解説しました。

少しでも参考になっていれば幸いです。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA