PHPUnitでユニットテスト② phpunit.xmlでテストの構成を作成する

phpunit.xmlによるテスト構成

PHPUnitで複数のテストケースをまとめて実行したい場合、PHPUnit実行コマンドの引数へ対象のテストケースクラス群が存在しているディレクトリパスを指定して行うことが出来ます。

(例) testディレクトリ配下の全テストケースクラスのユニットテストを実行する。

vendor/bin/phpunit test/

しかし、全てのテストケースではなく、目的に応じてテストの対象をいくつかに絞りたい場合やユニットテストが実行される順序を明確に決めておきたい場合があると思います。

そういった場合に、PHPUnitの設定ファイルであるphpunit.xmlを作成してテストの構成を決めておくことが出来ます。

環境: PHPUnit 9.5.4、 PHP 7.4.8

phpunit.xmlを作成

PHPUnit本体をComposerでインストールした場合、vendorディレクトリと同じ階層にphpunit.xmlを作成すればOKです。
下記、xmlファイルの形式で内容を記述します。

<phpunit bootstrap="vendor/autoload.php">
    <testsuites>
        <testsuite name="Sample">
        </testsuite>
    </testsuites>
</phpunit>

phpunit.xmlは、phpunitコマンド実行時のオプションなども設定しておくことが出来ます。

(例) colorオプションでテスト結果に色をつける

vendor/bin/phpunit --colors test/SampleTest.php

上記のオプションを省略することが出来ます。

<phpunit colors="true">

</phpunit>

テストスイートを作成する

PHPUnitでは複数のテストケースをテストスイートというグループ単位に分けることができ、定義したスイートごとにユニットテストを実行することが可能となります。

テストスイートはphpunit.xmlのtestsuiteタグで定義、構造化していきます。

phpunit.xml

<phpunit colors="true"
         verbose="true"
         bootstrap="vendor/autoload.php">
    <testsuites>
        <testsuite name="Calculator">
            <directory>test/calculator</directory>
        </testsuite>
        <testsuite name="Sample">
            <file>test/SampleTest.php</file>
            <file>test/Sample2Test.php</file>
        </testsuite>
    </testsuites>
</phpunit>

一番大きな括りのtestsuitesタグの子要素として、testsuiteタグを記述しテストスイートを定義する。

testsuiteタグのname属性に指定した名前をphpunit実行時のtestsuiteオプションへ指定することで対象のスイートのみテストを実行できるようになります。

vendor/bin/phpunit --testsuite (nameに指定した名前)

ひとつのスイートに所属させるテストケースクラスをディレクトリごと指定する場合は、directoryタグで対象のディレクトリパスを、
ディレクトリパスに関係なく、ファイル単位でテストケースをスイートに所属させる場合はfileタグでテストケースクラスを個別に指定します。

上記の場合、testsuiteオプションにCalculatorを指定した場合は、test/calculator配下にある全てのテストケースクラスのテストを実行、
Sampleを指定した場合、test配下のテストケースクラス、SampleTest.phpとSample2Test.phpのテストが実行されるようになります。

定義されているテストスイートの一覧を表示するコマンド

vendor/bin/phpunit --list-suite

また、phpunit.xmlを作成している状態で、

vendor/bin/phpunit

テストスイートや対象のテストケースを指定せずphpunitを実行した場合は、phpunit.xmlに記述した全てのテストケースが実行されます。(phpunit.xmlに記述外のテストケースは実行されないようです)

Follow me!