PHPの単体テストを自動化したかったので、phpunitを試してみた。

   2015/06/17

PHPで、CLIアプリケーションを作成したので、単体テストを自動化してみようと思う。
色々調べてみると、phpunitが良く使われているようなので動作確認してみました。

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);
}
  • このエントリーをはてなブックマークに追加
  • Pocket

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。