PHPUnitを使った単体テスト
PHPUnitというテストツールを使って単体テストをする方法です。
はじめに
単体テストとは、システムの構成要素であるクラスやメソッド単位での動作を確認する作業のことを言います。
PHPにはテストツールとしてPHPUnitという単体テストのツールがあり、PHPUnitを利用するとクラス内のメソッドに対してテスト用のクラスを自動で生成し、効率よくテストすることができます。
PHPUnitを利用するメリットは、手動では面倒なテスト手順を自動化して繰り返し実行できるようになることです。
PHPUnitを利用して単体テストする場合のプロセスは
・テスト対象となるクラス、PHPプログラムの作成
・作成したクラスからPHPUnit内のクラスを用いてテスト用のクラスを作成
・作成したテスト用のクラスに目的に応じてテストメソッドの実体を記述
・テスト実行、結果の確認
となります。
PHPUnitのインストール
PHPUnitは、PHPの標準ライブラリ仕様であるPEAR(PHP Extension and Application Repository)ライブラリとして配布されており、pearコマンドを使って簡単にインストールして使用することができます。
・PHPUnitインストール
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # pear channel-discover pear.phpunit.de Adding Channel "pear.phpunit.de" succeeded Discovery of channel "pear.phpunit.de" succeeded # pear install phpunit/PHPUnit Unknown remote channel: pear.symfony-project.com Did not download optional dependencies: pear/Image_GraphViz, pear/Log, channel://pear.symfony-project.com/YAML, use --alldeps to download automatically phpunit/PHPUnit can optionally use package "pear/Image_GraphViz" (version >= 1.2.1) phpunit/PHPUnit can optionally use package "pear/Log" phpunit/PHPUnit can optionally use package "channel://pear.symfony-project.com/YAML" (version >= 1.0.2) phpunit/PHPUnit can optionally use PHP extension "soap" phpunit/PHPUnit can optionally use PHP extension "xdebug" (version >= 2.0.5) downloading PHPUnit-3.4.11.tgz ... Starting to download PHPUnit-3.4.11.tgz (254,439 bytes) .....................................................done: 254,439 bytes install ok: channel://pear.phpunit.de/PHPUnit-3.4.11 |
・PHPUnitインストール成否確認
1 2 | # phpunit --version PHPUnit 3.4.11 by Sebastian Bergmann. |
テストプログラムの作成
1 2 3 4 5 6 7 8 9 | <?php class Hello { public function getMessage() { return "hello world"; } } ?> |
実行すると、hello world という文字列を返します。
次にテストを自動化してみます。
テスト対象のプログラム作成
PHPUnitでは、テストプログラムを作成するコマンドが用意されています。
・テスト用クラスを作成
1 2 3 4 | $ phpunit --skeleton-test Hello PHPUnit 3.4.11 by Sebastian Bergmann. Wrote skeleton for "HelloTest" to "/tmp/HelloTest.php". |
これでHelloTest.phpが作成されました。
その中身が下記になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <?php require_once 'PHPUnit/Framework.php'; require_once '/tmp/Hello.php'; /** * Test class for Hello. * Generated by PHPUnit on 2010-03-29 at 03:14:15. */ class HelloTest extends PHPUnit_Framework_TestCase { /** * @var Hello */ protected $object; /** * Sets up the fixture, for example, opens a network connection. * This method is called before a test is executed. */ protected function setUp() { $this->object = new Hello; } /** * Tears down the fixture, for example, closes a network connection. * This method is called after a test is executed. */ protected function tearDown() { } /** * @todo Implement testGetMessage(). */ public function testGetMessage() { // Remove the following lines when you implement this test. $this->markTestIncomplete( 'This test has not been implemented yet.' ); } } ?> |
テスト実行
getMessage()メソッドが正しく”hello world”という文字列を返しているか確認するテストを書いてみます。
先ほど作成されたHelloTest.phpのtestGetMessage()を以下のように編集します。
1 2 3 4 | public function testGetMessage() { $this->assertEquals("hello world", $this->object->getMessage()); } |
その後、テストを実行するためのコマンドを実行します。
1 2 3 4 5 6 7 8 9 10 | $ phpunit HelloTest ---実行結果:ここから--- PHPUnit 3.4.11 by Sebastian Bergmann. . Time: 0 seconds, Memory: 3.50Mb OK (1 test, 1 assertion) |
最後の行にOKと表示されたので、テストは成功したことになります。
他にもテストを実行するためのメソッドが用意されているので
色々試してみたいと思います。
Author Profile
スターフィールド編集部
SHARE