3

私はユニットテストを行ってきましたが、この奇妙な悪い問題に遭遇しました。

一部のサービス/マッパーでユーザー認証テストを行っています。

私は今、全部で約307のテストを実行しています。これは、すべてを1つのバッチで実行した場合にのみ実際に発生します。

1つのZend_Applicationオブジェクトのみをインスタンス化し、それをすべてのテストに使用しようとしています。私はそれをインスタンス化して、db接続、セッション、およびクラスの自動ロードを処理するだけです。

ここに問題があります。

テストのどこかで、Zend_Session_SaveHandler_DbTableの__destructメソッドが呼び出されます。なぜアイデアがないのですか?しかし、そうです。

__destructメソッドは、セッションオブジェクトが読み取り専用としてマークされているため、セッションオブジェクトへの書き込みを役に立たなくします。

destructメソッドが呼び出されている理由がわかりません。

認証テストの前に多くのテストと呼ばれます。テストの各フォルダを個別に実行しても問題はありません。307個すべてのテストを実行しようとしたときだけです。データベースの動作を行うテストがいくつかありますが、コードがdb接続を閉じたり、保存ハンドラーを破棄したりしていません。

なぜこれが起こるのか、そしてなぜ私のZend_Session_SaveHandler_DbTableが破壊されているのかについて誰かが何か考えを持っていますか?これは、デフォルトの存続期間と関係がありますか?

4

2 に答える 2

1

起こっていたのは、PHPUnitがガベージコレクションを行っていたということだと思います。307テストを実行するたびに、ガベージコレクターを実行する必要があり、何らかの理由でZend_Session_SaveHandler_DbTableが破壊された可能性があります。

これは、実行されているテストが少ないときに破壊されなかった理由を説明します。

あるいは、PHPがガベージコレクションを行っていたのかもしれません。それはもっと理にかなっています。

いずれにせよ、私の現在の解決策は、テストクラスごとに新しいZend_Applicationオブジェクトを作成して、そのクラス内のすべてのテストが新しいzend_applicationオブジェクトを使用できるようにすることです。

ここにいくつかの興味深い情報があります。

savehandlerの__destructメソッドにechoステートメントを入れました。

メソッドは(X + 1)回呼び出されていました。ここで、Xは実行したテストの数です。50回のテストを実行した場合、51回のエコー、307回のテスト、次に308回のエコーなどが発生しました。

ここが興味深い部分です。いくつかのテストのみを実行した場合、エコーはすべてテスト実行の最後に発生します。307のテストすべてを実行しようとすると、90のテストであると想定した後に90のエコーが表示されます。残りのエコーは、残りのテストの最後に発生します。エコーの数は再びX+1、この場合は308でした。

したがって、これは、PHPUnitが呼び出すtearDownメソッドまたはPHPガベージコレクターのいずれかと関係があると私が想定しているところです。たぶん、PHPUnitはティアダウン時にガベージコレクターを呼び出します。誰が知っていますが、私のテストはすべて事前に合格していたので、私は今それが機能するようになったことをうれしく思います。

あなたの誰かがより良い解決策を持っているなら、私に知らせてください。たぶん、私は自分のコード、phpunit、またはzendに、これまで知られていなかった欠陥を発見しました。それを修正する方法がいくつかあります。

于 2011-06-08T02:53:05.737 に答える
1

これは古い質問ですが、同じ問題が発生し、ここで解決策を見つけました。それを解決する正しい方法だと思います。

Zend_Session::$_unitTestEnabled = true;
于 2013-04-26T07:31:30.920 に答える