2

Zend Framework ベースのプロジェクトを PHPUnit で単体テストしていますが、テストが多すぎるようです。

症状: 別のテストを作成していて、この特定の関数でこのテストを起動すると、テストがエラーで失敗しました

スタックトレース:

Zend_Db_Adapter_Exception: SQLSTATE[08004] [1040] Too many connections in /Users/MyUser/workspaces/gitrepo/myprojectcom/webapp/library/Zend/Db/Adapter/Pdo/Abstract.php on line 144

Call Stack:
    0.0002     639184   1. {main}() /Users/MyUser/pear/bin/phpunit:0
    0.0036    1243552   2. PHPUnit_TextUI_Command::main() /Users/MyUser/pear/bin/phpunit:46
    0.0036    1244568   3. PHPUnit_TextUI_Command->run() /Users/MyUser/pear/share/pear/PHPUnit/TextUI/Command.php:130
    0.0036    1244568   4. PHPUnit_TextUI_Command->handleArguments() /Users/MyUser/pear/share/pear/PHPUnit/TextUI/Command.php:139
    0.0202    5745936   5. PHPUnit_Util_Configuration->getTestSuiteConfiguration() /Users/MyUser/pear/share/pear/PHPUnit/TextUI/Command.php:671
    0.0202    5747448   6. PHPUnit_Util_Configuration->getTestSuite() /Users/MyUser/pear/share/pear/PHPUnit/Util/Configuration.php:768
    0.0539    6143840   7. PHPUnit_Framework_TestSuite->addTestFiles() /Users/MyUser/pear/share/pear/PHPUnit/Util/Configuration.php:848
    0.8321   26889016   8. PHPUnit_Framework_TestSuite->addTestFile() /Users/MyUser/pear/share/pear/PHPUnit/Framework/TestSuite.php:419
    0.8329   27067008   9. PHPUnit_Framework_TestSuite->addTestSuite() /Users/MyUser/pear/share/pear/PHPUnit/Framework/TestSuite.php:392
    0.8329   27068424  10. PHPUnit_Framework_TestSuite->__construct() /Users/MyUser/pear/share/pear/PHPUnit/Framework/TestSuite.php:318
    0.8554   27706232  11. PHPUnit_Framework_TestSuite->addTestMethod() /Users/MyUser/pear/share/pear/PHPUnit/Framework/TestSuite.php:214
    0.8555   27706384  12. PHPUnit_Framework_TestSuite::createTest() /Users/MyUser/pear/share/pear/PHPUnit/Framework/TestSuite.php:831
    0.8556   27719664  13. ControllerTestCaseAbstract->__construct() /Users/MyUser/pear/share/pear/PHPUnit/Framework/TestSuite.php:554
    0.8586   27775696  14. Zend_Application_Bootstrap_BootstrapAbstract->bootstrap() /Users/MyUser/workspaces/gitrepo/myprojectcom/webapp/tests/ControllerTestCaseAbstract.php:24
    0.8586   27775696  15. Zend_Application_Bootstrap_BootstrapAbstract->_bootstrap() /Users/MyUser/workspaces/gitrepo/myprojectcom/webapp/library/Zend/Application/Bootstrap/BootstrapAbstract.php:586
    0.8586   27775696  16. Zend_Application_Bootstrap_BootstrapAbstract->_executeResource() /Users/MyUser/workspaces/gitrepo/myprojectcom/webapp/library/Zend/Application/Bootstrap/BootstrapAbstract.php:629
    0.8586   27776040  17. Bootstrap->_initDb() /Users/MyUser/workspaces/gitrepo/myprojectcom/webapp/library/Zend/Application/Bootstrap/BootstrapAbstract.php:669
    0.8590   27782440  18. Zend_Db_Adapter_Abstract->getConnection() /Users/MyUser/workspaces/gitrepo/myprojectcom/webapp/application/Bootstrap.php:97
    0.8590   27782440  19. Zend_Db_Adapter_Pdo_Mysql->_connect() /Users/MyUser/workspaces/gitrepo/myprojectcom/webapp/library/Zend/Db/Adapter/Abstract.php:315
    0.8591   27782440  20. Zend_Db_Adapter_Pdo_Abstract->_connect() /Users/MyUser/workspaces/gitrepo/myprojectcom/webapp/library/Zend/Db/Adapter/Pdo/Mysql.php:109

疑いを避けるために、ここに私のデータベースのブートストラップ関数があります:

protected function _initDb() {
    $databaseConfig = $this->_getDbConfig(); //loaded from an .ini file
    $resource = Zend_Db::factory($databaseConfig);
    $resource->getConnection();
    Zend_Db_Table::setDefaultAdapter($resource);
    return $resource;
}

その他のさまざまな要素:

  • 1 つのクラスのテスト メソッドにコメントを付けると、この新しいテスト ケースを問題なく追加できるので、問題は特定の新しいケースからではなく、実行されたテストの量から発生します。
  • ご覧のとおり、非常に基本的な _initDb ブートストラップ関数があります
  • これは、「--filter」を使用せずにテスト スイート全体を起動した場合にも失敗します。
  • 私の環境は次のとおりです:Mac OS X 10.7.3 Lion、XAMPPのMySQLサーバー5.1.44、PEAR経由でインストールされたPHPunit 3.6.11、PHP 5.3.8
  • ティアダウンで接続を閉じます[編集]

私が探しているもの:説明と何よりも回避策

回避策は既に見つかりました: /Applications/XAMPP/etc/my.cnf の [mysqld] にダーティ フィックスを追加します。

set-variable=max_connections=200
4

1 に答える 1

1

Zend_Db_Adapterの closeConnection() を使用する必要があります。

Web アプリを作成する場合、(通常) 接続を明示的に閉じる必要はありません。スクリプトが開始され、いくつかのクエリが実行され、開いているすべての接続がクリアされて終了するためです。テストの場合、多くの接続を開く長時間実行されるスクリプトがある可能性がありますが、スクリプトが終了していないため、これらの接続はクリアされないため、不要な場合は明示的に閉じる必要があります。

于 2012-07-25T16:11:22.793 に答える