PHPUnitでユニットテストを書くための準備をしてみた

なんだかんだ最近PHPを書く機会が出てきているのですが、先日PHPUnitでテストを書いてみました。
その際の導入から設定、実際に書く前まで。

はじめに

以下で実施しました。

  • PHP 7.3.x
  • PHPUnit 8.4

Composerが導入されているプロジェクト前提です。

├ src/
├ vendor/
├ tests/  // テストコード格納
├ composer.json
├ composer.lock
└ phpunit.xml // PHPUnit設定ファイル

PHPUnitを導入

とりあえず、PHPUnitをインストールします。

$ composer require phpunit/phpunit --dev

バージョン指定はしてないんですけど、実施時は v8.4 が入りました。
composerでパッケージをインストールする時にバージョンを指定する場合は、パッケージ名の後ろに :バージョン番号 を付けるといいみたいですね。

PHPUnitは開発用なので、 dev オプションをつけて、composer.jsonの reequire-dev に追加します。

PHPUnitの設定

phpunit.xml を作成

こんな感じにした。

<?xml version="1.0" encoding="UTF-8" ?>
<phpunit
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    bootstrap="tests/bootstrap.php"
    cacheResult="false"
    cacheTokens="false"
    colors="true"
    stopOnError="false"
    stopOnFailure="false"
    stopOnIncomplete="false"
    stopOnSkipped="false"
    stopOnRisky="false"
    verbose="false"
    >
    <testsuites>
        <testsuite name="Test suite">
            <directory>tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

vendor/autoload.php を読む必要があって、bootstrap.php ではそれをやってる。

<?php
declare(strict_types=1);
set_time_limit(0);
require __DIR__.'/../vendor/autoload.php';

phpunitコマンドを設定

毎度オプション付きでコマンドを叩くのは面倒なので、composer スクリプトに追加します。
npmでやってる感覚でできないのかなーと思ってたらできるようなので設定しました。

composer.json への書き込みは、composerコマンド経由で実施する記述がよく出てくるのですが、これについてはよくわからなかったので直接編集しました。

{
    :
    "scripts": {
        "test": [
            "phpunit tests/ --color"
        ]
    }
}

これで composer test を叩くだけで tests/ 内のテストを実行できるようになりました。
設定ファイルで書いてるので諸々要らない気がします。

とりあえず、これで書く準備はできたはずなので、あとは tests/ にテストスクリプトを作って流していくだけ。

やってみて

Python(Django)アプリケーションでちょくちょくテストを書いていたんですが、PHPとなるとまたちょっと変わってるなって印象。
仕事としてはLaravelをやる機会が増えてくると思うので、fakerとかMockeryとかあの辺使いつつ、Laravelアプリケーションのテストをさっと書けるようになりたい。

またオライリーのやつ読もかな