バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

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

その他

新規スレッドを追加する

フラット表示 前のトピック | 次のトピック
投稿者 スレッド
snitta
投稿日時: 2014/1/31 12:25
対応状況: −−−
一人前
登録日: 2013/10/3
居住地: 島根県
投稿: 100
PHPUnitによるテストが失敗する
------------------------------------------------------------------------------------------
[EC-CUBE] 2.13.0-dev (http://svn.ec-cube.net/open_trac/browser/branches/version-2_13-dev?rev=23329)
[OS] CentOS 6.5
[PHP] PHP 5.3
[データベース] MySQL 5.6
[WEBサーバ] Apache 2.2.15
[ブラウザ] Firefox 26.0
[現象] PHPUnitによるテストが失敗する
------------------------------------------------------------------------------------------

いつもお世話になっております。
PHPUnitによるテストのうち Common_TestCase::$objQuery を使っているテストについて、
実行環境によっては失敗する場合があります。

発生条件の一例:
* DB_TYPE が mysql である事。
* コマンドラインにおいて mysql_connect() 後の character_set_client が utf8 以外である事。

再現手順:
$ ./eccube_install.sh mysql
(省略)
$ php -r 'error_reporting(E_ALL & ~E_DEPRECATED); $c = mysql_connect("localhost", "user", "password"); echo mysql_client_encoding($c);'
latin1
$ phpunit tests
PHPUnit 3.7.29 by Sebastian Bergmann.

...............................................................  63 / 502 ( 12%)
............................F......FFFF........................ 126 / 502 ( 25%)
............................................................... 189 / 502 ( 37%)
............................................................... 252 / 502 ( 50%)
............................................................... 315 / 502 ( 62%)
............................................................... 378 / 502 ( 75%)
.....................Hello, World!!                                                                                                                                                                                                                                                                
.Hello, World!!Hello.....FFFF................................ 441 / 502 ( 87%)
.............................................................

Time: 6.09 seconds, Memory: 37.75Mb

There were 9 failures:

1) SC_Product_getDetailAndProductsClassTest::testGetDetailAndProductsClass_商品規格IDの商品情報と規格情報を返す
商品詳細+規格
Failed asserting that two arrays are equal.
--- Expected
+++ Actual
@@ @@
     'rank1' => null
-    'class_name1' => '味'
+    'class_name1' => '?'
     'class_id1' => '1'
     'classcategory_id1' => '1001'
     'classcategory_id2' => '1002'
     'classcategory_name2' => 'cat1002'
     'rank2' => null
-    'class_name2' => '味'
+    'class_name2' => '?'
     'class_id2' => '1'
     'price01_inctax' => 1575.0
     'price02_inctax' => 1575.0
 )

/var/www/html/eccube-2.13-dev/tests/class/Common_TestCase.php:53
/var/www/html/eccube-2.13-dev/tests/class/SC_Product/SC_Product_getDetailAndProductsClassTest.php:123

(以下省略)



テストが失敗する原因:
PHPUnitのグローバル変数バックアップのせい?

失敗したテストケースではDBから取得したデータが文字化けしていました。
そこからMySQLのクエリーログを調べると MDB2::setCharset() が適用されていない接続が使用されていました。
次にこの辺りの処理を順に追っていくと以下のようになります。
https://github.com/sebastianbergmann/phpunit/blob/3.7.29/PHPUnit/Framework/TestCase.php#L802-L810

1. テスト前にグローバル変数を serialize() で保存。
2. テスト実行。
3. テスト後にグローバル変数を unserialize() で復元。

最初のテストの 3. でオリジナルのMDB2オブジェクトがGC対象になりデータベース接続が切れます。
次のテストでは復元されたMDB2オブジェクトによって自動的に再接続されますが、
MDB2::setCharset() が呼ばれないために文字化けに繋がっているのでは?と考えます。


対処方法:
ならグローバル変数の復元対象からMDB2を外そうという安直な思考で
PHPUnit_Framework_TestCase::$backupGlobalsBlacklist を指定すると解消しました。

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;


原因や対処はこれで本当によいのか、どなたかご検証頂けましたら幸いです。
よろしくお願いいたします。


----------------
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ペイメント

公式ストアEC-CUBE4系デザインテンプレート続々リリース中

統計情報

総メンバー数は71,539名です
総投稿数は101,314件です

投稿数ランキング

1
seasoft
7333
2
468
2998
3
AMUAMU
2712
4
nanasess
2147
5
umebius
2000
6
yuh
1612
7
red
1449
8
h_tanaka
1080
9
tsuji
936
10
fukap
907
11
shutta
835
12
tao_s
793
13 ramrun 789
14 karin 689
15 sumida 641
16
homan
633
17 DELIGHT 572
18
patapata
502
19
flealog
485
20 tonton 437


ネットショップの壺

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

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