̃Gg[͂ĂȃubN}[Nɒlj

PHPUnit のインストールとはじめの一歩




今回は、pear コマンドで PHPUnit をインストールします。

pear チャンネルの指定

% sudo pear channel-discover pear.phpunit.de
Adding Channel "pear.phpunit.de" succeeded
Discovery of channel "pear.phpunit.de" succeeded

PHPUnit のインストール

% sudo pear install phpunit/PHPUnit
Unknown remote channel: pear.symfony-project.com
Did not download optional dependencies: phpunit/PHP_Invoker, use --alldeps to download automatically
phpunit/PHPUnit requires package "channel://pear.symfony-project.com/YAML" (version >= 1.0.2)
phpunit/PHPUnit requires PHP extension "dom"
phpunit/PHPUnit can optionally use package "phpunit/PHP_Invoker" (version >= 1.1.0)
phpunit/PHP_CodeCoverage can optionally use PHP extension "dom"
phpunit/PHP_CodeCoverage can optionally use PHP extension "xdebug" (version >= 2.0.5)
phpunit/PHPUnit_MockObject can optionally use PHP extension "soap"
downloading File_Iterator-1.3.1.tgz ...
Starting to download File_Iterator-1.3.1.tgz (5,157 bytes)
.....done: 5,157 bytes
downloading Text_Template-1.1.1.tgz ...
Starting to download Text_Template-1.1.1.tgz (3,622 bytes)
...done: 3,622 bytes
downloading PHP_CodeCoverage-1.1.2.tgz ...
Starting to download PHP_CodeCoverage-1.1.2.tgz (132,552 bytes)
...done: 132,552 bytes
downloading PHP_Timer-1.0.2.tgz ...
Starting to download PHP_Timer-1.0.2.tgz (3,686 bytes)
...done: 3,686 bytes
downloading PHPUnit_MockObject-1.1.1.tgz ...
Starting to download PHPUnit_MockObject-1.1.1.tgz (19,897 bytes)
...done: 19,897 bytes
downloading PHP_TokenStream-1.1.3.tgz ...
Starting to download PHP_TokenStream-1.1.3.tgz (9,860 bytes)
...done: 9,860 bytes
install ok: channel://pear.phpunit.de/File_Iterator-1.3.1
install ok: channel://pear.phpunit.de/Text_Template-1.1.1
install ok: channel://pear.phpunit.de/PHP_Timer-1.0.2
install ok: channel://pear.phpunit.de/PHP_TokenStream-1.1.3
install ok: channel://pear.phpunit.de/PHP_CodeCoverage-1.1.2
install ok: channel://pear.phpunit.de/PHPUnit_MockObject-1.1.1

インストール完了。早速バージョン確認のため、下記コマンドを実行。

% phpunit --version
zsh: command not found: phpunit

コマンドが見つからない。。


再度、インストールコマンドをたたくと

% sudo pear install phpunit/PHPUnit
Unknown remote channel: pear.symfony-project.com
Did not download optional dependencies: phpunit/PHP_Invoker, use --alldeps to download automatically
phpunit/PHPUnit requires package "channel://pear.symfony-project.com/YAML" (version >= 1.0.2)
phpunit/PHPUnit requires PHP extension "dom"
phpunit/PHPUnit can optionally use package "phpunit/PHP_Invoker" (version >= 1.1.0)
No valid packages found
install failed

下記が足りてないようなので、インストールする。

  • symfony/YAM
  • PHP extension “dom”
  • phpunit/PHP_Invoker

symfony/YAM のインストール

% sudo pear channel-discover pear.symfony-project.com
% sudo pear install symfony/YAML

PHP extension "dom" のインストール

% yum install --enablerepo=remi php-dom

※remi レポジトリが追加されてない場合は、下記の「remi, epelレポジトリ の追加」セクションを参考にして追加してください。
http://tm.root-n.com/server:serversman_at_vps:setup_mysql5.1_phpmyadmin?s[]=remi

phpunit/PHP_Invoker のインストール

% sudo pear install --alldeps phpunit/PHPUnit


再度、インストールコマンドをたたく

% sudo pear install phpunit/PHPUnit
downloading PHPUnit-3.6.10.tgz ...
Starting to download PHPUnit-3.6.10.tgz (118,595 bytes)
..........................done: 118,595 bytes
install ok: channel://pear.phpunit.de/PHPUnit-3.6.10

今度は成功したようだ。再度、確認コマンドを発行。

% phpunit --version
PHPUnit 3.6.10 by Sebastian Bergmann.

インストールOK。



テストケースのスケルトンの自動生成

テストケースのスケルトン(ひな型ファイル)の自動生成を試してみます。

% phpunit --skeleton-test Hello
PHPUnit 3.6.10 by Sebastian Bergmann.

The functionality of

  phpunit --skeleton-class

and

  phpunit --skeleton-test

will be removed in PHPUnit 3.7.

Please

  pear install phpunit/PHPUnit_SkeletonGenerator

and use

  phpunit-skelgen --class

and

  phpunit-skelgen --test

instead.

Sorry for any inconvenience caused by this change.

Neither "Hello.php" nor "Hello.php" could be opened.

PHPUnit 3.7 から現行コマンドが廃止されるから、phpunit/PHPUnit_SkeletonGenerator をインストールしろとの事。

PHPUnit_SkeletonGenerator のインストール

% sudo pear install phpunit/PHPUnit_SkeletonGenerator
Unknown remote channel: components.ez.no
phpunit/PHPUnit_SkeletonGenerator requires package "channel://components.ez.no/ConsoleTools" (version >= 1.6)
No valid packages found
install failed 

ConsoleTools が無いと怒られる。

ConsoleTools のインストール

% sudo pear channel-discover components.ez.no
% sudo pear install components.ez.no/ConsoleTools

再度、PHPUnit_SkeletonGenerator のインストール

% sudo pear install phpunit/PHPUnit_SkeletonGenerator
downloading PHPUnit_SkeletonGenerator-1.1.0.tgz ...
Starting to download PHPUnit_SkeletonGenerator-1.1.0.tgz (10,810 bytes)
.....done: 10,810 bytes
install ok: channel://pear.phpunit.de/PHPUnit_SkeletonGenerator-1.1.0

今度は入った。


気を取り直して、スケルトン(ひな型ファイル)の自動生成

まずは、テスト用に下記の class を用意。ファイル名は「Hello.php」とする。

  • Hello.php
<?php
class Hello
{
    public function getMessage()
    {
        return "hello world";
    }
} 

Hello.php がある階層に移動して、下記コマンドを発行

% phpunit-skelgen --test Hello

すると、同階層に HelloTest.php が自動生成されます。

  • HelloTest.php
<?php
/**
 * Generated by PHPUnit_SkeletonGenerator on 2012-03-15 at 10:49:28.
 */
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()
    {
    }

    /**
     * @covers Hello::getMessage
     * @todo   Implement testGetMessage().
     */
    public function testGetMessage()
    {
        // Remove the following lines when you implement this test.
        $this->markTestIncomplete(
          'This test has not been implemented yet.'
        );
    }
}

PHPUnit の TestCase.php と、テスト対象の Hello.php を require するように下記2行を HelloTest.php に追加します。

require '/usr/share/pear/PHPUnit/Framework/TestCase.php';
require './Hello.php';
  • HelloTest.php
<?php

require '/usr/share/pear/PHPUnit/Framework/TestCase.php';
require './Hello.php';

/**
 * Generated by PHPUnit_SkeletonGenerator on 2012-03-15 at 10:49:28.
 */
class HelloTest extends PHPUnit_Framework_TestCase
{

  :
 snip
  :

実際にテストしてみます

% phpunit HelloTest.php
PHPUnit 3.6.10 by Sebastian Bergmann.

I

Time: 0 seconds, Memory: 2.25Mb

OK, but incomplete or skipped tests!
Tests: 1, Assertions: 0, Incomplete: 1.

まだテストが未完成あるいは未実装であるため、上記の結果が返ってきます。


余談ですが、.bashrc や .zshrc に –colors オプションを付けてエイリアスを張っておくとテストの実行結果に色が付くので便利です。

alias phpunit="phpunit --colors"


testGetMessageメソッドにテストを実装してみます。

まずは成功するテスト

public function testGetMessage()
{
    // Remove the following lines when you implement this test.
    //$this->markTestIncomplete(
    //  'This test has not been implemented yet.'
    //);
    $this->assertEquals('hello world', $this->object->getMessage());
}

上記のように assertEquals メソッドを使って、第一引数と第二引数の値が等価かテストします。
保存したら、テストを実行します。

% phpunit HelloTest.php
PHPUnit 3.6.10 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 2.50Mb

OK (1 test, 1 assertion)

テストが通りました。


次に失敗するテスト

public function testGetMessage()
{
    // Remove the following lines when you implement this test.
    //$this->markTestIncomplete(
    //  'This test has not been implemented yet.'
    //);
    $this->assertEquals('hoge world', $this->object->getMessage());
}

上記のように、第一引数の期待する値にわざと「hoge world」を設定します。
保存したら、テストを実行します。

% phpunit HelloTest.php
PHPUnit 3.6.10 by Sebastian Bergmann.

F

Time: 0 seconds, Memory: 2.50Mb

There was 1 failure:

1) HelloTest::testGetMessage
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'hoge world'
+'hello world'

/path/to/HelloTest.php:43

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.

テストが失敗したことを確認できます。


その他のテストメソッドやマニュアル

その他のテストメソッドやマニュアルは下記URLを参照してください。

PHPUnit Manual
http://www.phpunit.de/manual/3.7/ja/index.html





programming/php/phpunit/install.txt