バージョン選択

フォーラム

メニュー

オンライン状況

43 人のユーザが現在オンラインです。 (31 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 43
もっと...

サイト内検索

バグ報告 > その他 > PHPUnitによるテストが失敗する

その他

新規スレッドを追加する

フラット表示 前のトピック | 次のトピック
投稿者 スレッド
snitta
投稿日時: 2014/2/2 22:03
対応状況: −−−
一人前
登録日: 2013/10/3
居住地: 島根県
投稿: 100
Re: PHPUnitによるテストが失敗する
PHPUnitによるMDB2の意図しない切断について、
やはり環境で問題をカバーするのではなくテスト自体を修正できないかと思います。
そこで改善方法を二つ程考えましたので、よろしければお目通し頂きたいです。

1. MDB2のインスタンスをバックアップの対象にしない。
2. 各テスト毎にMDB2のインスタンスを新規作成&破棄する。


1. の解決方法は前回同様、PHPUnit_Framework_TestCase::$backupGlobalsBlacklist を指定するものです。
DB接続をテスト間で共有するという前提が必要ですが、
元々の Common_TestCase::setUp() がコネクションプールから取っており、
またテスト毎にプールをクリアしていないからいいかな?と思ってます。

Index: tests/class/Common_TestCase.php
===================================================================
--- tests/class/Common_TestCase.php	(revision 23329)
+++ tests/class/Common_TestCase.php	(working copy)
@@ -16,6 +16,15 @@
  */
 class Common_TestCase extends PHPUnit_Framework_TestCase
 {
+  /**
+   * @var array
+   * @see PHPUnit_Framework_TestCase::$backupGlobals
+   * @see PHPUnit_Framework_TestCase::$backupGlobalsBlacklist
+   */
+  protected $backupGlobalsBlacklist = array(
+      '_MDB2_databases',
+      '_MDB2_dsninfo_default',
+  );
 
   /** SC_Query インスタンス */
   protected $objQuery;


参考: http://phpunit.de/manual/3.7/ja/fixtures.html
引用:
クラスの静的属性のバックアップ・リストアの実装には、PHP 5.3 (あるいはそれ以降のバージョン) が必要です。
グローバル変数やクラスの静的属性のバックアップ・リストアの実装には serialize() および unserialize() を使用しています。
PHP 組み込みの一部のクラス、たとえば PDO のオブジェクトはシリアライズできないため、
そのようなオブジェクトが $GLOBALS 配列に格納されている場合はバックアップ操作が失敗します。



2. の解決方法は不具合で切断されていた挙動を仕様にしてしまおう、というものです。
まずテスト準備段階で html/require.php を読み込んだ時にMDB2オブジェクトが作成されますが、
これをPHPUnitがバックアップしないように開放しておきます。
次に Common_TestCase::setUp() で SC_Query_Ex::getSingletonInstance('', true, true) で新規接続を行います。
これにより各テストで正しい手続きが行われたDB接続を使用できるようになります。

テスト毎に新規接続するパッチ:
Index: data/class/SC_Query.php
===================================================================
--- data/class/SC_Query.php     (リビジョン 23329)
+++ data/class/SC_Query.php     (作業コピー)
@@ -101,7 +101,7 @@
     public static function getSingletonInstance($dsn = '', $force_run = false, $new = false)
     {
         $objThis = SC_Query_Ex::getPoolInstance($dsn);
-        if (is_null($objThis)) {
+        if ($new || is_null($objThis)) {
             $objThis = SC_Query_Ex::setPoolInstance(new SC_Query_Ex($dsn, $force_run, $new), $dsn);
         }
         /*
Index: tests/class/Common_TestCase.php
===================================================================
--- tests/class/Common_TestCase.php     (リビジョン 23329)
+++ tests/class/Common_TestCase.php     (作業コピー)
@@ -27,14 +27,13 @@
 
   protected function setUp()
   {
-    $this->objQuery = SC_Query_Ex::getSingletonInstance('', true);
+    $this->objQuery = SC_Query_Ex::getSingletonInstance('', true, true);
     $this->objQuery->begin();
   }
 
   protected function tearDown()
   {
     $this->objQuery->rollback();
-    $this->objQuery = null;
   }
 
   /**
Index: tests/require.php.base
===================================================================
--- tests/require.php.base      (リビジョン 23329)
+++ tests/require.php.base      (作業コピー)
@@ -1,6 +1,19 @@
 <?php
 $HOME = realpath(dirname(__FILE__)) . '/../';
 require_once "$HOME/html/require.php";
+
+// PHPUnitのグローバル変数バックアップによるMDB2オブジェクトの破壊防止の為、
+// html/require.php を読み込んだ際に作成されたMDB2オブジェクトを開放する。
+// 
+// @see  PHPUnit_Framework_TestCase::$backupGlobals
+// @todo MDB2を使用しなくなった際に削除する。
+foreach (SC_Query_Ex::$arrPoolInstance as $objQuery) {
+    $objQuery->conn->disconnect();
+    $objQuery->conn->free();
+}
+SC_Query_Ex::$arrPoolInstance = array();
+unset($objQuery);
+
 // ローカルの環境に応じて追加・編集し、phpunitが使えるように設定してください。
 set_include_path(get_include_path() . PATH_SEPARATOR . '/usr/share/pear');
 set_include_path(get_include_path() . PATH_SEPARATOR . '/usr/local/lib/php');



長くなりましたがこの解決方法の是非と、
より良い解決方法がありましたらご教示頂けましたら幸いです。


ついでになって失礼ですが SC_Query_Ex::getSingletonInstance($dsn, $force_run, $new) の $new について、
既にコネクションプールに $dsn が存在する場合は問答無用で新規接続しないという挙動になっています。
これは仕様でしょうか?


----------------
Seiji Nitta
zenith6@gmail.com
https://github.com/zenith6/

フラット表示 前のトピック | 次のトピック


題名 投稿者 日時
   PHPUnitによるテストが失敗する snitta 2014/1/31 12:25
     Re: PHPUnitによるテストが失敗する nanasess 2014/1/31 13:22
       Re: PHPUnitによるテストが失敗する snitta 2014/1/31 14:13
         Re: PHPUnitによるテストが失敗する nanasess 2014/1/31 16:29
           Re: PHPUnitによるテストが失敗する snitta 2014/1/31 19:27
           » Re: PHPUnitによるテストが失敗する snitta 2014/2/2 22:03

 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,288名です
総投稿数は109,688件です

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1567
9
mcontact
1240
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
796
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.