Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

PHPUnit3.3.x系のTestCaseをPHPUnit1.3.2で動作させるための変更点

タイトルからして泣けてきます><
要は、PHP5.2.x+PHPUnit3.3.xで作っていたテストを、PHP4.4.xでも実行させたいという要望があり、実際にやってみたときのメモです。

前提

  • 開発はPHP5.2.10+PHPUnit3.3.17
    • この環境でも実行させたい
  • テストはすでに全てパスしている
  • クラスのコードは、PHP4でも動作するよう記述している
    • アクセス修飾子、abstract宣言などを書かない
      • static宣言も書かないし、staticコールもしない(E_STRICT対応)
    • メソッドチェーン無し(辛い><)
  • PHP4の環境はPHP4.4.9+PHPUnit1.3.2

変更すべき箇所

<?php
//require_once 'PHPUnit.php';
require_once 'PHPUnit/Framework.php';
  • TestCaseのアクセス修飾子を削除する
    • abstract、static宣言も併せて削除
  • サポートされていないassertXXXXXメソッドを書き換える
    • PHPUnit1.3.2でサポートされているのは以下の通り
      • assertContains
      • assertEquals
      • assertFalse
      • assertNotContains
      • assertNotNull
      • assertNotRegExp
      • assertNotSame
      • assertNull
      • assertRegExp
      • assertSame
      • assertTrue
      • assertType
  • Mockを使ったテストはできないので、どうにかする
    • テスト対象のクラス内部で使用するオブジェクトを委譲するようクラス設計を変更する
    • PHP4のメンバー変数がpublic扱いなのを良いことに、強引に指定する
  • 実行するSuiteファイルを用意する(なければ)
<?php
require_once 'PHPUnit.php';
require_once 'ClassA.php';
require_once 'ClassB.php';
          :

$suite  = new PHPUnit_TestSuite();
$suite->addTestSuite('ClassA');
$suite->addTestSuite('ClassB');
          :

$result = PHPUnit::run($suite);

echo $result->toString();

まとめ

意外と変更する箇所は少ないです。あと、これの逆をすれば、PHPUnit1.3.2のテストをPHPUnit3.3.x系に変換できます。

雑感

もうPHP4勘弁。。。orz