Laravel ユニットテスト(実行前後ログを残したい)


◆ディレクトリ

Laravelプロジェクトを作成したときにできるディレクトリ(Feature・Unit)
・Feature apiやwebページの検証
・Unit クラスやメソッド

この辺はプロジェクトごとにわかりやすい名前や構造に変えることもありそう。

◆テストメソッドの指定の仕方

ExampleTest
class ExampleTest extends TestCase
{
    public function testBasicTest()
    {
        $this->assertTrue(true);
    }

    /**
     * @test
     */
    public function sample()
    {
        $this->assertTrue(true);
    }
}

2つある(どちらでも好みで)
・メソッド名の先頭にtestをつける
・testアノテーションをつける

testアノテーションを使うと、メソッド名を日本語名にしてもOK

/**
 * @test
 */
public function テストします()
{
    $this->assertTrue(true);
}

◆実行方法

コマンド
//ファイル内のtestメソッドがすべて実行される
vendor/bin/phpunit tests/Unit/ExampleTest.php

//ファイル内のtestメソッドを指定して、それだけ実行
vendor/bin/phpunit tests/Unit/ExampleTest.php --filter=sample

//ディレクトリのすべてのファイルのすべてのメソッドを実行
vendor/bin/phpunit tests/Unit

//すべてのテスト
vendor/bin/phpunit

◆テスト実行前後ログを残す

基本的にTestCaseクラスを継承しているので、そのクラス内に記述してみる。
もともと用意されている便利メソッドをオーバーライドして使おうと思う。
setUp() メソッド実行前に呼ばれる
teardown() メソッド実行後に呼ばれる

TestCase
abstract class TestCase extends BaseTestCase
{
    use CreatesApplication;

    public function setUp(): void
    {
        parent::setUp();

        //実行開始ログ
        Log::info('start/class:['. get_called_class(). '] method:['. get_class_methods(get_called_class())[0].']');
    }

    public function tearDown(): void
    {
        //実行終了ログ
        Log::info('end/class:['. get_called_class(). '] method:['. get_class_methods(get_called_class())[0].']');

        parent::tearDown();
    }
}

今回はdebug_traceを使わないようにしたかった(情報量が多いため)
この方法は、テストを一ファイルに一つしか書かないという条件で、ファイルごとにテストを定義するという決まりなら、使えるが他に万能な方法を考えたい。

[参考記事もともと用意されてるメソッド]https://qiita.com/aozora0000/items/c10676beabb5570accce