2013-07-24 19 views
12

自4個月以來,我們用Laravel 4構建了一個複雜的Web應用程序,並具有良好的單元測試覆蓋率。現在我們有159個測試和592個斷言來防止迴歸,並允許我們輕鬆重構我們的應用程序。Laravel&PHPUnit:允許進程隔離以防止Mysql太多連接錯誤

漂亮的圖片,但由於幾天我們在過去的測試中出現以下錯誤:

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

原因很簡單:所有的測試運行在相同的進程和MySQL只允許在一定數量的訪問同時。現在,我們有太多的測試。如果我在我的測試套件中刪除了一些測試,最後一個測試會通過。

解決方案可能是在進程隔離中運行PHPUnit,如下面的配置,但Laravel測試看起來並不像這樣啓動。我在每次測試得到其他錯誤:

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> 

所以我的問題是:我怎麼可以配置Laravel測試與processIsolation="true"工作或者你看到其他解決我的問題?

+0

你解決了這個問題嗎? –

+0

有關更多信息,請參閱https://plus.google.com/107528973720672293459/posts/bBC5CdKPFQ4。基本上,我不能配置Laravel和PHPUnit一起使用processIsolation,所以我只是在MySQL配置中將max_connections設置爲1000。不是很漂亮,但有效。 –

回答

3

對於Laravel 4,可以在tearDown()函數中使用\ DB :: disconnect('connection')。在這裏看到的文檔:http://laravel.com/docs/database#accessing-connections

「如果你需要從給定的數據庫斷開連接,由於超過underyling PDO實例的max_connections的限制,使用disconnect方法」

2

我會看看嘲弄,並刪除你的MySQL依賴:https://github.com/padraic/mockery#mocking-public-static-methods

展望未來,我真的建議更側重於測試你的SQL。我的公司最近花了大量的數據庫管理員職位,這確實使我們的傳統緩慢。

+0

感謝您的想法,但我真的想測試我的數據庫有幾個原因。我想測試遷移,並且我有許多需要訪問數據庫的功能測試,他們接近集成測試。 另一點是,經典網絡應用的90%的工作是保存,訪問和呈現數據。如果你沒有在測試中檢查數據庫,我認爲你錯過了一些東西 –

+1

*「如果你在測試中沒有檢查數據庫,我認爲你錯過了某些東西......」雖然這當然是真的,並不意味着您必須同時運行單元測試和集成測試。 –

4

現在你可以做DB :: connection() - > setPdo(null)來關閉你的測試的tearDown中的連接,應該解決它。如果這不起作用,你可以在任何擴展Laravel TestCase的測試中做unset($this->app['db'])

+0

它可能很好,但'setPdo'方法只接受一個PDO實例作爲參數... –

+0

是的,泰勒編輯我的公關似乎,我添加了一個替代答案,這是我目前使用的。 –

+1

它的工作原理!我把'unset($ this-> app ['db'])'放在我的tearDown中,就是這樣。 –