8

約 180webtestcaseの単体テストがクラスを実装しており、テストはコントローラー上で実行されています。

ただし、単体テストを実行すると、データベースへの接続が多すぎます。アクティブな TCP 接続テストが多すぎるため、120 回目のテスト後に失敗します。テストの実行中は、すべての接続がアクティブです。

tearDown 関数では、エンティティ マネージャの close 関数を呼び出しますが、何もありません。影響はありません。接続オブジェクト参照を保持するクラスがいくつかあると思います。

オブジェクトがnullに割り当てられたときにpdo接続が閉じられたことについて言及されたPHPマニュアルで。私たちもそうしていますが、変更はありません。PS: 単体テストは機能テストです。コントローラー上で動作し、db と統合されています。モック オブジェクトはありません。

私たちの間違いはどこですか?どうすれば問題を解決できますか?

これはconfig_test.ymlの私の接続パラメータです

imports:
    - { resource: config_dev.yml }

framework:
    test: ~
    session:
        storage_id: session.storage.mock_file

web_profiler:
    toolbar: false
    intercept_redirects: false

doctrine:
    dbal:
        driver: pdo_mysql
        port: 3306
        host: localhost
        dbname: mydb
        user: myuser
        password: mypass
        charset: UTF8
4

2 に答える 2

7

phpunit.xml.dist ファイルを確認しましたか?

これを見るべきだと思います。 http://www.slideshare.net/fabpot/unit-and-functional-testing-with-symfony2

パラメータが以下と同じであることを確認してください

<phpunit
    backupGlobals               = "false"
    backupStaticAttributes      = "false"
    colors                      = "true"
    convertErrorsToExceptions   = "true"
    convertNoticesToExceptions  = "true"
    convertWarningsToExceptions = "true"
    processIsolation            = "true"
    stopOnFailure               = "false"
    syntaxCheck                 = "false" 
    bootstrap                   = "bootstrap.php.cache" >
于 2013-06-05T11:02:28.540 に答える
4

プロセスの分離を有効にすると、テスト スイートの実行がとてつもなく遅くなるという副作用があります。

より良いアプローチは、Doctrine に明示的に接続を閉じるように指示することです。たとえば、次のように、テストの teaDown、tearDownAfterClass、またはそのように注釈が付けられたメソッドのいずれかです。

trait CloseConnectionAfterTestTrait {
    /** @after */
    public function avoidExhaustingDbConnections()
    {
        if(!empty($this->em)){
            $this->em->getConnection()->close();
        }
    }
}

この例では、所有しているエンティティ マネージャー インスタンスを として保存するのは消費者次第$this->emです。しかし、Doctrine を使用している場合は、Doctrine サービスにアクセスすることでコードをより一般化できますstatic::$kernel->something

于 2015-03-20T03:11:56.863 に答える