【Laravel】Testのファイル構成について

どーも!

たかぽんです!

今回はLaravelのテストファイルの構成についてお話ししていこうと思います!

Laravelのテストについて

早速ですが、Laravelではテストを書くことができます。

実際のテストの内容をどうやって書くのか?などはまた別の機会にしますが...

Laravelではテストのファイルを以下のartisanコマンドで作成することができます。

以下、公式からのコピペです。

// Featureディレクトリにテストを生成する
php artisan make:test UserTest

// Unitディレクトリにテストを生成する
php artisan make:test UserTest --unit

オプションを特につけずにmake:testコマンドを叩くと、デフォルトのパスはMyProject/tests/Featureになります。

optionをつけると--unitMyProject/tests/Unitに作成できるわけですね。

ちなみに、Laravelでプロジェクトを作成して、特にテスト周りで何も生成していない状態だと、以下のようなFeature, Unitファイルが生成され、テストファイルの例が作られているはずです。

Laravelではtestのしたでも特にこの二つのフォルダをtestに使うように指定されています。

つまり、テストをしたいならこの下にファイルを作る形になっているわけですね。

これらの違いについては正直筆者も理解できていない部分があるんですが...

少し調べてみたところ...

Unitテストは関数やメソッド単位でテストを行なうことで、Featureテストはユーザーが行う動作に対するテストのようです。

例えばユーザーがあるボタンを押して保存して次の画面が表示されるまでの動作をテストしたい場合、その一連の動作はFeatureテストとして、その中で一つ一つ呼ばれるメソッドのテストはUnitテストとして書いていく...というニュアンスなのかな・・・?

また、そのうちテスト周りについても詳しく調べないとですね...

テストを実行してみる

さて、それでは実際にテストを実行してみます。

コマンドは以下です。

php artisan test

すると...?

Takapon:MyProject taka$ php artisan test

   PASS  Tests\Unit\ExampleTest
  ✓ basic test

   PASS  Tests\Feature\ExampleTest
  ✓ basic test

  Tests:  2 passed
  Time:   0.10s
Takapon:MyProject taka$

僕の場合デフォルトのテストしかないので、Unit, FeatureにあるExampleテストが実行されているのがわかりますね。

デフォルトでは以上のような一般的なテストのフォルダ構成なんですが、サービスが大きくなってきたり、単純にテストをfeatureとUnitで分けたくない場合などもあるかもしれません。

そこで、次に好きなファイル構成にする方法を調べてみます。

テストフォルダ構成を変更する

さて、では次はファイル構成を変えてみます。

とりあえずExampleTest.phpを複製して、OtherTestというフォルダを新規作成します。

以下のような形です。

ExampleTest.phpの中身はほとんど一緒ですが、namespaceだけ修正します。

<?php

namespace Tests\OtherTest; // ココだけ変える

use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;

class ExampleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $this->assertTrue(true);
    }
}

では、この状態で実行してみましょう!

Takapon:MyProject taka$ php artisan test

   PASS  Tests\Unit\ExampleTest
  ✓ basic test

   PASS  Tests\Feature\ExampleTest
  ✓ basic test

  Tests:  2 passed
  Time:   0.19s
Takapon:MyProject taka$

UnitとFeatureしかテストされませんね...

実はLaravelではちゃんとテストするフォルダを指定しないといけないんですよね...

ではそこを修正していきます。

phpunit.xmlというファイルにその指定が書かれているので、プロジェクトファイル配下にあるMyProject/phpunit.xmlを開きます。

その中に、以下のtestの指定部分があります。

  <testsuites>
        <testsuite name="Unit">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>

        <testsuite name="Feature">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>
    </testsuites>

これが意味しているのは、./tests/Unit配下にあるTest.phpで終わるファイルをテスト対象にする。という意味合いです。

同じくFeatureも定義されているのがわかりますね。

今回はさくっとコピペして、OtherTestフォルダ配下もテスト対象にしてみます。

  <testsuites>
        <testsuite name="Unit">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>

        <testsuite name="Feature">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>

				<testsuite name="OtherTest">
						<directory suffix="Test.php">./tests/OtherTest</directory>
				</testsuite>
    </testsuites>

そのままコピペしてOtherTestに合わせて書き直した形です。

ではこの状態で再度testを実行してみます。

Takapon:MyProject taka$ php artisan test

   PASS  Tests\Unit\ExampleTest
  ✓ basic test

   PASS  Tests\Feature\ExampleTest
  ✓ basic test

   PASS  Tests\OtherTest\ExampleTest
  ✓ basic test

  Tests:  3 passed
  Time:   0.18s
Takapon:MyProject taka$

増えてますね!

逆にtestsフォルダ以下を全て対象にしたいなら以下でできます。

    <testsuites>
				<testsuite name="Tests">
						<directory suffix="Test.php">./tests</directory>
				</testsuite>
    </testsuites>

これで、Laravelのテスト対象をいい感じにカスタマイズすることができそうですね!

一応、phpunitの以下のページにてこのテストスートについて書かれていますね。

まとめ

さて、今回はLaravelのテストでどのファイルをテスト対象にするのか?についてみてみました。

最近新しく新規のプロジェクトを作成する案件を触るようになり、FeatureとUnitで使う必要なさそうだなぁとなり、試してみました。

あんまり触ることはないと思いますが、是非ご参考にしてみてくださいね!

それでわ!

おすすめの記事