バグ報告 > その他 > 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 以外である事。 再現手順:
テストが失敗する原因: 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 を指定すると解消しました。
原因や対処はこれで本当によいのか、どなたかご検証頂けましたら幸いです。 よろしくお願いいたします。
|
フラット表示 | 前のトピック | 次のトピック |
題名 | 投稿者 | 日時 |
---|---|---|
» ![]() |
snitta | 2014/1/31 12:25 |
![]() |
nanasess | 2014/1/31 13:22 |
![]() |
snitta | 2014/1/31 14:13 |
![]() |
nanasess | 2014/1/31 16:29 |
![]() |
snitta | 2014/1/31 19:27 |
![]() |
snitta | 2014/2/2 22:03 |
