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
日本語対応していてありがたいですね。