2013-06-03 60 views
8

Chúng tôi có khoảng 180 bài kiểm tra đơn vị thực hiện webtestcase lớp và kiểm tra đang chạy trên bộ điều khiển.Kết nối PDO không được đóng khi phpunit đang chạy với symfony 2.X

Tuy nhiên, khi chạy thử nghiệm đơn vị, chúng sẽ mở quá nhiều kết nối tới db. Do quá nhiều kiểm tra kết nối tcp đang hoạt động không thành công sau thử nghiệm thứ 120. Tất cả các kết nối đang hoạt động trong khi thử nghiệm đang chạy.

Trong hàm tearDown, chúng tôi gọi hàm đóng của trình quản lý thực thể, nhưng không có gì, nó không ảnh hưởng gì. Có một số lớp giữ tham chiếu đối tượng kết nối, tôi nghĩ vậy.

Bởi vì trong hướng dẫn sử dụng php được đề cập về kết nối pdo đã đóng khi đối tượng được gán cho null. Chúng tôi cũng làm điều đó nhưng không có thay đổi. P.S: Bài kiểm tra đơn vị của chúng tôi là các bài kiểm tra chức năng. Hoạt động trên bộ điều khiển và được tích hợp với db, không có đối tượng giả nào

Lỗi của chúng tôi ở đâu? Làm thế nào chúng ta có thể khắc phục vấn đề?

này các thông số kết nối của tôi trong 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 
+0

Chúng tôi có thể xem cách bạn xác định kết nối của mình bên trong tệp config.yml và/hoặc parameters.yml không? – j0k

+0

@ j0k Tôi đã thêm vào câu hỏi – GirginSoft

+0

Tôi đã gặp sự cố tương tự một thời gian trước đây. Sự cố đã xảy ra do giao dịch chưa hoàn tất. Bạn có sử dụng giao dịch rõ ràng (tôi có nghĩa là bắt đầu-cam kết/rollback)? Nếu vậy, hãy chắc chắn rằng bạn luôn luôn hoàn thành nó. – Cyprian

Trả lời

6

Bạn đã kiểm tra tập tin phpunit.xml.dist của bạn?

Tôi nghĩ bạn nên xem xét điều này; http://www.slideshare.net/fabpot/unit-and-functional-testing-with-symfony2

Hãy chắc chắn các thông số của bạn đều giống nhau dưới đây

<phpunit 
    backupGlobals    = "false" 
    backupStaticAttributes  = "false" 
    colors      = "true" 
    convertErrorsToExceptions = "true" 
    convertNoticesToExceptions = "true" 
    convertWarningsToExceptions = "true" 
    processIsolation   = "true" 
    stopOnFailure    = "false" 
    syntaxCheck     = "false" 
    bootstrap     = "bootstrap.php.cache" > 
+0

Cảm ơn bạn rất nhiều. Tôi tìm ra giải pháp. Rõ ràng các tham số processIsolation gây ra vấn đề. Đó là một sai lầm, bởi vì toàn bộ bài kiểm tra này hoạt động trên một quá trình và tôi nghĩ nó giữ các tham số. Nhưng sau khi tôi thay đổi nó thành sự thật, các kết nối đóng lại sau mỗi lần kiểm tra kết thúc. @bulutcagatay – GirginSoft

+1

Thú vị rằng điều này mang lại một vấn đề khác: "Không nhận ra PDOException: Bạn không thể tuần tự hóa hoặc unserialize PDO trường hợp". –

3

Cho phép cô lập quá trình sẽ có tác dụng phụ làm cho các bộ kiểm tra ngớ ngẩn nhiều hơn nữa chậm chạp trong việc thực thi.

Một cách tiếp cận tốt hơn là chỉ cần nói với học thuyết một cách rõ ràng để đóng kết nối của nó, hoặc teardown kiểm tra, tearDownAfterClass hoặc bất kỳ phương pháp chú thích như vậy, ví dụ như:

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

Trong ví dụ này, nó tùy thuộc vào người tiêu dùng để tiết kiệm bất cứ ví dụ quản lý thực thể ông có như $this->em. Nhưng nếu/kể từ khi bạn sử dụng Doctrine, bạn có thể tổng quát mã tốt hơn bằng cách truy cập dịch vụ Doctrine thông qua static::$kernel->something.

+0

Tôi đã thêm mã để đóng kết nối sau mỗi lần kiểm tra - nhưng vẫn không có hiệu lực ... – naneri