PHPの単体テストを自動化したかったので、phpunitを試してみた。
PHPで、CLIアプリケーションを作成したので、単体テストを自動化してみようと思う。
色々調べてみると、phpunitが良く使われているようなので動作確認してみました。
Contents
phpunitのインストール
まずは、phpunitをインストールします。
動作確認はCentOS6.6を利用しています。
pharファイルを取得して、権限を付与して、パスがとおている場所へ移動させるだけで利用することができます。
# wget https://phar.phpunit.de/phpunit.phar # chmod +x phpunit.phar # mv phpunit.phar /usr/local/bin/phpunit # phpunit --version PHPUnit 4.7.3 by Sebastian Bergmann and contributors.
phpunitの動作確認
phpunitのインストールが終了したら、動作確認をしてみましょう。
テストクラスの作成
- PHPUnit_Framework_TestCaseを継承させたテスト用クラスを作成します。
- assertメソッドを利用し、実行結果の確認を行います。
testSample1では、1+1=1を確認しています。
testSample2では、1-1=2でエラーとなります。
<?php class TestSample extends PHPUnit_Framework_TestCase { function testSample1() { $this->assertEquals(2, 1 + 1); } function testSample2() { $this->assertEquals(2, 1 - 1); } } ?>
テストの実行
phpunit ファイル名でテストを実行します。
–colorオプションを付けることで、実行結果に色が付きます。
# phpunit --color TestSample.php PHPUnit 4.7.3 by Sebastian Bergmann and contributors. .F Time: 81 ms, Memory: 18.00Mb There was 1 failure: 1) TestSample::testSample2 Failed asserting that 0 matches expected 2. /tmp/TestSample.php:10 FAILURES! Tests: 2, Assertions: 2, Failures: 1.
テスト結果の見方
4行目に「.F」とありますが、テスト結果となります。
記号 | テスト結果 |
---|---|
. | テスト成功 |
F | テスト失敗 |
E | テストが危険としてマーク |
S | テストがスキップされた |
I | テストが不完全または未実装としてマーク |
利用頻度が高いAssertファンクション
利用しそうなAssertファンクションをまとめてみました。
Assertファンクション | チェック内容 |
---|---|
assertNull($var) | $var = NULL |
assertEquals($val1, $val2) | $val1 = $val2 |
assertGreaterThan($expect, $var) | $expect < $var |
assertGreaterThanOrEqual($expect, $var) | $expect <= $var |
assertLessThan($expect, $var) | $expect > $var |
assertLessThanOrEqual($expect, $var) | $expect >= $var |
assertRegExp($ptn, $str) | $strが正規表現$ptnにマッチ |
assertTrue($var) | $var = TRUE |
assertFalse($var) | $var = FALSE |
assertArrayHasKey($key, $array) | 配列$arrayにキー$keyが存在 |
assertContains($val, $array) | 配列$arrayに値$valが存在 |
assertContainsOnly($type, $array) | 配列$arrayの値の型がすべて$type |
assertCount($count, $array) | 配列$arrayの値の数が$count |
assertEmpty($array) | 配列$arrayが空 |
assertFileExists($file) | $fileが存在 |
assertFileEquals($file1, $file2) | $file1と$file2の内容が等しい |
便利な小技
共通の初期セットアップ setUp()
データベースへのコネクション取得など、テスト全体で利用したいオブジェクトを保持したい場合などは、setUpファンクションを利用します。
setUpファンクションはテスト実施前に実行されます。
<?php class TestSample extends PHPUnit_Framework_TestCase { private $value; function setUp() { $this->value = "hoge"; } function testSample1() { $this -> assertEquals("", $this -> value); } function testSample2() { $this -> assertEquals("hoge", $this -> value); } } ?>
実行すると、setUpで$valueに”hoge”を代入しているので、testSample1がエラーとなります。
# phpunit --color TestMonitorAlert.php PHPUnit 4.7.3 by Sebastian Bergmann and contributors. F. Time: 91 ms, Memory: 18.00Mb There was 1 failure: 1) TestSample::testSample1 Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ -'' +'hoge' /home/autouser/AutomaticOperator/phpunit/TestMonitorAlert.php:11 FAILURES! Tests: 2, Assertions: 2, Failures: 1.
エラー時のメッセージ表示
エラー時にメッセージを表示させたい場合は、assertファンクションの最終引数にメッセージを渡してあげる。
$this -> assertTrue(false, "trueではなく、falseが指定されています");
例外(Exception)ケースのテスト
例外が発生することを確認する場合は次のように実装する。
try { // 動作確認したい処理 $this -> fail("例外発生なし"); } catch(Exception $e) { $this -> assertTrue(true); }
この記事へのコメントはこちら