Eclipse/PDT+PHPUnit導入

Eclipse/PDT+PHPUnit導入

導入環境

  • WindowsXP sp3
  • eclipse4.3(pleiades)
  • xampp1.8.2(php5.4ver)

今回インストールするもの

  • PHPUnit3.7
  • MakeGood(eclipseプラグイン)
  • Xdebug2.2.3

参考リンク

PEARアップデート

  1. http://pear.php.net/go-pear.pharをgo-pear.pharという名前でphpの実行ディレクトリ(例:C:\xampp\php)に保存
  2. コマンドプロンプトを開いてコマンドを入れていく
    C:\Documents and Settings\s-watanabe>cd C:\xampp\php
    C:\xampp\php>php go-pear.phar
    >Are you installing a system-wide PEAR or a local copy?
    >(system|local) [system] :
    #→空のままエンター
    >Below is a suggested file layout for your new PEAR installation.  To
    >change individual locations, type the number in front of the
    >directory.  Type 'all' to change all of them or simply press Enter to
    >accept these locations.
    >
    > 1. Installation base ($prefix)                   : C:\xampp\php
    > 2. Temporary directory for processing            : C:\xampp\php\tmp
    > 3. Temporary directory for downloads             : C:\xampp\php\tmp
    > 4. Binaries directory                            : C:\xampp\php
    > 5. PHP code directory ($php_dir)                 : C:\xampp\php\pear
    > 6. Documentation directory                       : C:\xampp\php\docs
    > 7. Data directory                                : C:\xampp\php\data
    > 8. User-modifiable configuration files directory : C:\xampp\php\cfg
    > 9. Public Web Files directory                    : C:\xampp\php\www
    >10. Tests directory                               : C:\xampp\php\tests
    >11. Name of configuration file                    : C:\WINDOWS\pear.ini
    >12. Path to CLI php.exe                           : C:\xampp\php\.
    >
    >1-12, 'all' or Enter to continue: 
    
    #→11がpearのPATHでなければ「11」を入力してエンター
    
    >(Use $prefix as a shortcut for 'C:\xampp\php', etc.)
    >Name of configuration file [C:\WINDOWS\pear.ini] :
    #→「C:\xampp\php\pear.ini」と入力してエンター
    #→エンターでインストール
    #コマンドプロンプト終了
  3. C:\xampp\php\PEAR_ENV.regが生成されるので、ダブルクリックして実行
  4. 再ログインするか、PCを再起動(.regファイルの反映)

PHPUnitのインストール

  • pearを経由してインストールする
  1. コマンドプロンプトを開く
  2. 以下コマンドを入れる
    pear config-set auto_discover 1
    pear install pear.phpunit.de/PHPUnit
    #→インストール開始
    
    phpunit --version
    #バージョンを表示してインストールされていることを確認
    #ついでに雛形ジェネレータをインストール
    pear install phpunit/PHPUnit_SkeletonGenerator
  • 終了

Xdebugインストール

  1. http://www.xdebug.org/download.phpを開いてPHP 5.4 VC9 (32 bit)をダウンロード(環境によって変更する) ※phpinfo()でThread Safetyの値を確認。enabledであれば無印、disabledの場合はnts版を使う xdebug追加をphp.iniに記述するとき、zend_extension=か zend_extension_ts=なのかを見極めるには http://www.php-seed.net/blog/archives/95
  2. 任意の場所に保存(C:\xampp\php\extとかに)
  3. php.iniに以下の行を追加
    zend_extension_ts = "C:\xampp\php\ext\php_xdebug-2.2.3-5.4-vc9.dll"
    
    ※環境によってはzend_extension_tsの「_ts」を削除する

MakeGood

  1. eclipse起動
  2. ヘルプ→新規ソフトウェアのインストール
  3. 作業対象にhttp://eclipse.piece-framework.com/を入れて「追加」ボタン
  4. 名前は適当に入れる(今回はMakeGoodと入力しました)
  5. MakeGoodにチェックを入れてインストール

Eclipse設定

  1. Eclipse起動
  2. ウィンドウ→設定を開く

    PHP実行ファイルの構成

    1. PHP→PHPインタープリターを「PHP5.4」に設定
    2. PHP実行可能ファイルを選択→「追加」を押下して以下を入力
      名前:php(なんでもよい)
      実行可能ファイルパス:C:\xampp\php\php.exe(phpの実行ファイルを指定)
      PHPiniファイル:C:\xampp\php\php.ini(php.iniの場所を指定)
      SAPIタイプ:CLI
      PHPデバッガー:Xdebug

    デバッガーの設定

    1. PHP→デバッグを選択して以下を設定
      PHPデバッガー:Xdebug
      サーバー:(なんでもよい。適当に)
      PHP実行可能ファイル:php(上の実行可能ファイルで設定した名前)
      Enable CLI Debugにチェックを入れる

    インクルードパスの追加

    1. プロジェクトを右クリック→MakeGoodのテスティングフレームワークをPHPUnitに
    2. PHPインクルードパスのライブラリータブを開き、
    3. PHPUnit.phpがあるディレクトリを指定(例:C:\xampp\php\pear)

テストクラス雛形作成

  • PHPUnit Skeleton Generator を利用したテストクラスの雛形生成
  1. コマンドライン起動
  2. テストしたいクラスが書いてあるソースファイルがある場所まで移動
  3. 「phpunit-skelgen --bootstrap ${bootstrapファイルのパス} --test -- ${namespace}\${クラス名} ${ファイル名}」と打って実行
    例:phpunit-skelgen --bootstrap "C:\xampp\htdocs\icum\app\bootstrap.php.cache" --test -- "Bone\IcumBundle\Repository\PremiumCategoryRepository" "C:\xampp\htdocs\icum\src\Bone\IcumBundle\Repository\PremiumCategoryRepository.php"
    →成功するとソースと同じディレクトリにテストクラスファイルが生成される
    パスがきちんと通っていれば別ディレクトリに移動しても問題なく動作する

PHPUnit起動設定

    XML設定ファイルの作成

    • テストグループの設定などに利用するXMLファイルを作成する
    1. ${projectroot}/app直下にphpunit.xmlを作成する
    2. MakeGoodのPHPUnitタブを開き、XML設定ファイルに先ほど作成したphpunit.xmlを指定する

    Symfonyを利用している場合

    1. Symfonyを使っている場合は、bootstrap_test.phpを${projectroot}/app直下に作成し、以下を記述
      <?php
      $_SERVER['KERNEL_DIR'] = __DIR__;
      require_once $_SERVER['KERNEL_DIR'] . '/bootstrap.php.cache';
    2. プロジェクト右クリック→プロパティーからMakeGoodを選択し、プリロードスクリプトに作成したbootstrap_test.phpを指定する
    3. phpunit.xmlに以下の記述を追加
      <phpunit bootstrap="bootstrap_test.php"> </phpunit>
  • 参考:PHPUnit公式 XML設定ファイル
  • http://phpunit.de/manual/3.7/ja/appendixes.configuration.html

PHPUnit実行

  • Eclipseのエクスプローラー上でテストしたいソースやディレクトリを右クリックして「テストの実行」を選択。
  • 「テストの実行を待っています」から動かないときはEclipseをクリーン起動する。

PHPUnitの実行が遅いとき

  • php.iniに以下の値を追加
    realpath_cache_size = 1M

コードカバレッジ、ログ出力

  1. phpunit.xmlの<phpunit>タグ内に以下の記述を追加する
    <logging>
        <log charset="UTF-8" highlight="true" highlowerbound="70" lowupperbound="35" target="D:\Program Files\pleiades\workspace\icum\testlog" type="coverage-html" yui="true"> </log>
    </logging>
  2. テストを実行するとtargetで指定したディレクトリにレポートHTMLが出力される

テストグループ

  • アノテーション@groupまたは@authorをクラスなどに指定し、phpunit.xmlの<phpunit>タグ内に以下の記述を行う <include>が実行するグループ、<exclude>は実行させないグループ
    <groups>
      <include>
        <group><p>name</p></group>
      </include>
      <exclude>
        <group>name<group>
      </exclude>
    </groups>

PHPUnitのモックオブジェクト

  • 公式ドキュメント:テストタブル
  • http://phpunit.de/manual/3.7/ja/test-doubles.html
  • できること

    • getMock()で生成したオブジェクトに対して
      • メソッドの置き換え
      • 返り値の指定
      • メソッドの呼び出し回数のテスト
      • ※全体的に疎結合であることが前提

    モックオブジェクト生成例

    • $mock = $this->getMock('TestObject', array('getMaxId', 'getMinId')); // 置き換えたいメソッドを指定したモックオブジェクトを生成
    • 第二引数がnullの場合は全てのメソッドがnullを返すだけのモックオブジェクトを、
    • 第二引数を指定した場合はそのメソッドだけ置き換えるモックオブジェクトを生成する。
    • コンストラクタを呼び出したくない場合はgetMockBuilderを使う
    • $this->getMockBuilder('TestObject')
           ->setMethods(array('getMaxId', 'getMinId')) // 省略可
           ->disableOriginalConstructor() // コンストラクタを呼び出さない指定
           ->getMock();

    メソッドのふるまい設定例

    • $mock->expects($this->once()) //一回だけ呼び出される
           ->method('getMaxId') // このメソッドを
           ->with('foo') // この引数で呼び出して
           ->will($this->returnValue(1)); // この値を返す

    ふるまいの各設定について

    • expects($this->once())
      引数で呼び出し回数の制約を指定する。$this->any()など指定できる
    • expects()引数参考::http://phpunit.de/manual/3.3/ja/test-doubles.html#test-doubles.mock-objects.tables.matchers
    • with('foo')
      呼び出す際の引数を指定する。引数が複数存在する場合は追加していく→with('foo', 'bar)
    • will($this->returnValue(1))
      メソッドの返り値を指定する。上記の例では「1」が返る。$this->returnValue()は返り値を単純に指定するが、他にExceptionなども指定できる。利用できるメソッドの一覧は以下
    • will()の引数に利用できるメソッド一覧 参考::http://nianote.com/programing/615
    メソッド説明
    returnValue(mixed $value) 戻り値を単純に指定する。いつも同じ値を返すことになる
    returnArgument(integer $argumentIndex) 戻り値をスタブメソッドに渡された引数にする。$argumentIndex 番目の引数が戻り値になる
    returnCallback(mixed $callback) $callback で指定されたメソッドをコールバックし、その戻り値をスタブメソッドの戻り値にする
    throwException(Exception $exception) 戻り値を返すのではなく、例外をスロウする。$exception がそのままスロウされる
    onConsecutiveCalls(mixed $value, …) 引数はいくつでも指定できる。スタブメソッドがコールされる度に、引数で渡された値を順番に返すようになる。引数に値ではなく、スタブ API を指定することもできる

モックオブジェクト関連参考リンク

Mockery

    • staticメソッドやテスト対象メソッド内部で生成されるインスタンスをモック化できる
    • 参考:「Mockery」を使ってサクッとPHPのテストを書いてみる http://tech.aainc.co.jp/archives/3918

    インストール

    • PEARでインストール
      sudo pear channel-discover pear.survivethedeepend.com
      sudo pear channel-discover hamcrest.googlecode.com/svn/pear
      sudo pear install --alldeps deepend/Mockery

    セットアップ

    • bootstrap_test.phpに以下を追記
      require_once 'Mockery/Loader.php';
      require_once 'Hamcrest/Hamcrest.php';
      $loader = new \Mockery\Loader;
      $loader->register();
    • 使いたいテストクラスに
      use \Mockery;
    • を追加で使用可能

その他

    tearDownの実装について

    • tearDown()よりもsetUp()::http://phpunit.de/manual/3.7/ja/fixtures.html#fixtures.more-setup-than-teardown
      setUp() と tearDown() は理屈上では対称的になるはずですが、実際にはそうではありません。
      実際には、 tearDown() を実装する必要があるのは setUp() で外部リソース (ファイルやソケットなど) を割り当てた場合のみです。
      もし setUp() で単に PHP オブジェクトを作成しただけの場合は、 一般には tearDown() は必要ありません。
      しかし、もし setUp() で大量のオブジェクトを作成した場合には、 それらの後始末をするために tearDown() で変数を unset() したくなることもあるでしょう。 
      テストケースオブジェクト自体のガベージコレクションにはあまり意味がありません。 

    XMLの設定

Selenium参考

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/224308/60248386

この記事へのトラックバック一覧です: Eclipse/PDT+PHPUnit導入:

コメント

コメントを書く



(ウェブ上には掲載しません)