2013-07-24 42 views
12

Kể từ bốn tháng, chúng tôi xây dựng một ứng dụng web phức tạp với Laravel 4 với phạm vi kiểm tra đơn vị tốt. Bây giờ chúng tôi có 159 bài kiểm tra và 592 xác nhận để ngăn chặn sự hồi quy và cho phép chúng tôi dễ dàng tái cấu trúc ứng dụng của mình.Laravel & PHPUnit: cho phép quá trình cách ly để ngăn chặn Mysql Quá nhiều lỗi kết nối

đẹp bức tranh nhưng vì vài ngày chúng ta có lỗi sau đây trong các bài kiểm tra cuối cùng:

PDOException: SQLSTATE[HY000] [1040] Too many connections 

Lý do rất đơn giản: tất cả các test chạy trong quá trình tương tự và MySQL chỉ cho phép một số lượng nhất định truy cập trong cùng một lúc. Bây giờ, chúng tôi có quá nhiều bài kiểm tra. Nếu tôi xóa vài bài kiểm tra ở giữa bộ thử nghiệm của tôi, những bài kiểm tra cuối cùng sẽ vượt qua.

Giải pháp có thể là chạy PHPUnit trong quá trình cách ly như trong cấu hình bên dưới nhưng các thử nghiệm Laravel dường như không được khởi chạy như thế. Tôi nhận được một lỗi khác trong mỗi bài kiểm tra:

PHPUnit_Framework_Exception: Notice: Constant LARAVEL_START already defined in /.../.../autoload.php on line 3 
<?xml version="1.0" encoding="UTF-8"?> 
<phpunit backupGlobals="false" 
    backupStaticAttributes="false" 
    bootstrap="bootstrap/autoload.php" 
    colors="true" 
    convertErrorsToExceptions="true" 
    convertNoticesToExceptions="true" 
    convertWarningsToExceptions="true" 
    processIsolation="true" 
    stopOnFailure="false" 
    syntaxCheck="false" 
> 

</phpunit> 

Vì vậy, câu hỏi của tôi là: làm thế nào tôi có thể cấu hình Laravel thử nghiệm để làm việc với processIsolation="true" hay bạn thấy một giải pháp khác cho vấn đề của tôi?

+0

Bạn đã giải quyết được sự cố này chưa? –

+0

Bạn có thể kiểm tra cuộc thảo luận này: https://plus.google.com/107528973720672293459/posts/bBC5CdKPFQ4 để biết thêm thông tin. Về cơ bản, tôi không thể cấu hình Laravel và PHPUnit với nhau để làm việc với processIsolation vì vậy tôi chỉ thiết lập max_connections thành 1000 trong cấu hình MySQL. Không phải là rất đẹp nhưng điều đó hoạt động. –

Trả lời

3

Đối với Laravel 4, bạn có thể sử dụng \ DB :: ngắt kết nối ('kết nối') trong hàm tearDown() của bạn. Xem doc ở đây: http://laravel.com/docs/database#accessing-connections

"Nếu bạn cần ngắt kết nối từ cơ sở dữ liệu được do vượt quá giới hạn max_connections các underyling PDO sơ thẩm, sử dụng phương pháp ngắt kết nối"

2

tôi sẽ có một cái nhìn tại Mocks và loại bỏ sự phụ thuộc MySQL của bạn: https://github.com/padraic/mockery#mocking-public-static-methods

Trong tương lai, tôi thực sự xin đề nghị tập trung hơn vào thử nghiệm SQL của bạn. Gần đây, công ty của tôi đã dành một số tiền rất lớn để thuê DBAs thực sự làm chậm tốc độ di chuyển của chúng tôi.

+0

Cảm ơn vì ý tưởng này nhưng tôi thực sự muốn thử nghiệm cơ sở dữ liệu của mình vì nhiều lý do. Tôi muốn kiểm tra sự di chuyển và tôi có rất nhiều bài kiểm tra chức năng cần có quyền truy cập DB, chúng gần với các bài kiểm tra tích hợp. Điểm khác là 90% công việc của một ứng dụng web cổ điển là lưu, truy cập và trình bày dữ liệu. Nếu bạn không kiểm tra DB trong các bài kiểm tra, tôi nghĩ rằng bạn bỏ lỡ một cái gì đó –

+1

* "Nếu bạn không kiểm tra DB trong các bài kiểm tra, tôi nghĩ rằng bạn bỏ lỡ một cái gì đó ..." không có nghĩa là bạn phải chạy thử nghiệm đơn vị và thử nghiệm tích hợp cùng một lúc. –

4

Bây giờ bạn có thể làm DB :: connection() -> setPdo (null) để đóng kết nối trong tearDown của bài kiểm tra của bạn, tha nên giải quyết nó. Nếu điều đó không hiệu quả, bạn có thể thực hiện unset($this->app['db']) trong bất kỳ thử nghiệm nào đang mở rộng TestCase của Laravel.

+0

Nó có thể là tuyệt vời nhưng phương pháp 'setPdo' chỉ chấp nhận một thể hiện của PDO là đối số ... –

+0

Vâng Taylor đã chỉnh sửa PR của tôi, tôi đã thêm một giải pháp thay thế cho câu trả lời mà tôi đang sử dụng hiện tại. –

+1

Nó hoạt động! Tôi đặt 'unset ($ this-> app ['db'])' trong tearDown của tôi và đó là nó. –

Các vấn đề liên quan