【PHP】MacでPHPUnitを利用する方法(Composer)




Mac環境でPHPUnitを利用する方法を学習したので、備忘録に記事に残しておきます。

こちらの内容は「PHPUnit で PHP コードのユニットテストを行う」(エレパスタッフブログ)を参考にさせていただきました。

1. 開発用ディレクトリを作成

Composerは既にインストールされている前提で進めます。今回の開発ディレクトリは以下の構成です。

develop/
    - src/ 
    - test/

srcディレクトリはテスト対象のプログラム、testディレクトリにはテストコードが入ります。

2. 開発用ディレクトリdevelopにPHPUnitを導入

以下のcomposer.jsonを作成して、developディレクトリに置きます。

{
  "require-dev": {
    "phpunit/phpunit": "*"
  }
}

次のコマンドをターミナルで実行します。するとvendorディレクトリと、composer.lockというファイルが生成されます。

composer update

パスを通す場合は、ホームディレクトリの.bash_profileに以下を記載して反映します。

export PATH="$HOME/develop/vendor/bin:$PATH"

パスを通すことで、developディレクトリにインストールしたphpunitを、ターミナル上で「phpunit」と打つだけで実行できます。パスを通さない場合は、「~/develop/vendor/bin/phpunit」と毎回打つ必要があります。

3. autoloadの設定

テストを行うときは、test/からsrc/を読みに行くため、autoloadを設定して自動読み込み出来るようにしておきます。composer.jsonを次のように変更します。

{
  "require-dev": {
    "phpunit/phpunit": "*"
  },
  "autoload": {
    "psr-4": {
      "User\\": "src/"
    }
  }
}

ここで、psr-4はautoloadの仕様名、User\\は名前空間をUserに設定し、src/はautoload対象のディレクトリ名を示しています。

composer.jsonの変更を反映させるには、ターミナルでcomposer updateが必要ですが、autoloadに関する変更のみであればcomposer dumpautoloadでOKです。

composer dumpautoload

4. テスト対象のコードを書く

src/User.phpを作成して保存します。

<?php
namespace User;

class User
{
  public function getFullName($first_name, $last_name)
  {
    return $first_name . ' ' . $last_name;
  }
}

このクラスは、ファーストネームとラストネームを引数として受け取り、半角スペースを挟んで文字列結合したものを返すというgetFullNameメソッドを実装したシンプルなものです。

5. テストコードを書く

test/UserTest.phpを作成します。

<?php

use PHPUnit\Framework\TestCase;
use User\User;

class UserTest extends TestCase
{
  public function testGetFullName()
  {
    $user = new User();
    $this->assertSame('Michael Jackson', $user->getFullName('Michael', 'Jackson'));
  }
}

3行目ですが、基本的にPHPUnitではTestCaseクラスを継承して利用するためuseでインポートしています。テスト対象は名前空間UserのクラスUserですので、4行目でインポートしています。

assertSame()は第1引数に正解の値、第2引数にテストしたい対象を入れます。第1引数と第2引数に対して厳密な比較を行う、TrueかFalseを返します。ゆるい比較はassertEquals()メソッドを使います。

6. 実行

最後にターミナルで実行します。

cd develop

phpunit test/
#パスを通していない場合はvendor/bin/phpunit test/

=============
PHPUnit 9.5.1 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 00:00.014, Memory: 4.00 MB

OK (1 test, 1 assertion)

結果が表示されました。テストを1回行い、1回成功しているので無事終了です。

公式ドキュメント

https://phpunit.readthedocs.io/ja/latest/index.html

日本語対応していてありがたいですね。