PHPUnitとは?使い方や特徴、注意点などをご紹介
PHPの開発者なら、単体テストフレームワーク「PHPUnit」の重要性を無視できません。PHPUnitを使用すると、コードの信頼性が向上し、バグの早期発見が可能になります。
しかし、PHPUnitの導入には注意点もあります。本記事では、PHPUnitの特徴や利点、そして導入時の注意点から基本的な使い方まで、包括的に解説します。
PHPプロジェクトの品質向上を目指す方必見の内容となっています。
Contents
PHPUnitとは?
PHPUnitは、PHP向けの人気のある単体テストフレームワークです。
単体テスト(ユニットテスト)とは、ソフトウェアの構成単位として関数やメソッドが期待通りに動作するかを確認する手法です。
PHPUnitを使うと、開発者はコードの動作を自動的にチェックでき、バグの早期発見や修正が容易になります。
PHPUnitはオープンソースで提供されLaravelやSymfonyなどの主要フレームワークでも標準的に使用されています。
PHPUnitの魅力
大きな魅力は、バグを早期に発見できる点です。テストコードを書くと、開発の初期段階で不具合を発見でき、手戻りを防げます。
また、コードの改善がしやすくなります。既存のコードを改善する際、PHPUnitを使えば変更後のコードにバグがないか確認できるため、安心して改善できます。
PHPUnitの注意点
まず、PHPUnitの導入初期には、テストコード作成に時間と労力がかかります。特に既存プロジェクトへの導入は大変です。しかし、長期的には開発効率向上やバグ減少につながるため、投資する価値はあります。
テストコードの管理にも注意が必要です。適切に管理しないと複雑化し、保守が難しくなります。
また、データベースやAPIなど、外部リソースに依存するコードのテストは難しい場合があり、代替えとなるテスト用のオブジェクト(モックやスタブ)を適切に使用する必要があります。
PHPUnitの使い方
本項では、PHPUnitバージョン10系を基準に単独での簡単な使用法をご説明します。
以下ではmacOSの端末やWindows Terminalなどを総称し「端末」と記載します。
また、入力例の行頭の「$」はシェルのプロンプトを表します。
Windows 環境の準備
WindowsではWSLおよびDebian系ディストリビューションが導入済みとして記載しています。
WSLを未導入の場合、こちらを参考に導入後、端末で下記を実行してphpをご準備ください。
$ sudo apt update && sudo apt upgrade
$ sudo apt install php-cli php-json php-mbstring php-xml php-pcov php-xdebug
PHPUnitのインストール方法
2024年現在、PHPUnitのインストール方法の推奨はPHAR形式です。
※PHPUnitバージョン10では、PHP 8.1以上がインストールされている必要があります。phpが端末で利用できることを確認しておいてください。
まず、PHPUnit公式から、phpunit-10.X.X.pharをダウンロードしてください。
$ wget https://phar.phpunit.de/phpunit-10.5.30.phar
phpに上記pharのパスと–versionを指定します(現在のディレクトリにpharがある場合):
$ php phpunit-10.5.30.phar –version
PHPUnit 10.5.30 by Sebastian Bergmann and contributors.
バージョン情報が表示されれば正常です。
次に、.pharファイルに実行属性を付与し、実行パスの通ったディレクトリに配置してください。
# phpunit-xxx.pharをphpunitにリネームして配置する例
$ chmod +x phpunit-10.5.30.phar
$ sudo mv phpunit-10.5.30.phar /usr/local/bin/phpunit
$ phpunit –version
テストの実行方法
PHPUnitでテストを実行するには、テストケースを作成する必要があります。
テストケースは、特定の機能やメソッドの動作を検証するためのコードです。
テスト対象のコード
検証対象のコードとして、以下をsrc/CalcDiscount.phpに保存します。
<?php // src/CalcDiscount.php
class CalcDiscount {
/**
* 年齢から割引率を計算する関数
*
* @param int $age 年齢
* @return float 割引率
*/
function getRate($age) {
return $age < 0 ? 0.0 : ($age < 12 ? 0.5 : ($age < 65 ? 0.1 : 0.2));
}
}
テストケースの作成
テストケースとしてtests/CalcDiscountTest.phpを作成します。
- ・テスト項目毎にメソッドを定義します。
- ・ファイル名、親クラス、メソッド名などのルールを守ってください。
<?php // tests/CalcDiscountTest.php // ファイル名には「Test」を付けます。
use PHPUnit\Framework\TestCase;
require dirname(__FILE__) . ‘/../src/CalcDiscount.php’;
// クラス名は通常、テスト対象のクラス名に「Test」を付けます。
class CalcDiscountTest extends TestCase // PHPUnit\Framework\TestCaseクラスを継承
{ // メソッド名は”test”から始める
public function testNegativeAge() { // 年齢が負の場合
$this->assertEquals(0.0, (new CalcDiscount)->getRate(–1));
}
public function testChildDiscount() { // 12歳未満の場合
$this->assertEquals(0.5, (new CalcDiscount)->getRate(10));
}
public function testSeniorDiscount() { // 65歳以上の場合
$this->assertTrue((new CalcDiscount)->getRate(70) >= 0.3);
}
public function testAdultDiscount() { // 成人の場合
$this->assertEquals(0.0, (new CalcDiscount)->getRate(18));
}
}
assertメソッドの働き
- ・assertEquals()は2つの引数が等しい値になるか、確認します。
- ・assertTrue()は、引数が真となるか、確認します。
期待した値にならない場合、当該テストは失敗とカウントされます。
テストの実行
テストを行うには、端末で以下を実行します。
$ phpunit tests/CalcDiscountTest.php
テスト結果は、以下を含みます。
- ・失敗したテストの一覧
- ・末尾に、総テスト数・失敗したテスト数
出力例(抜粋)
1) CalcDiscountTest::testSeniorDiscount # 失敗したテスト①
Failed asserting that false is true. # 期待した値はtrue
2) CalcDiscountTest::testAdultDiscount # 失敗したテスト②
Failed asserting that 0.1 matches expected 0.0. # 期待した値は0.0
(略)
FAILURES! テストは失敗
Tests: 4, Assertions: 4, Failures: 2. # 全4テスト assert4つ 失敗2つ
まとめ
PHPUnitは、PHPプロジェクトの品質向上に貢献する強力なツールです。
バグ発見や改善の容易さなど多くの利点がありますが、導入時の負荷やテストコードの管理には注意が必要です。
本記事の使い方を参考に、自分のプロジェクトでPHPUnitを試してみてはいかがでしょうか。