2013-07-24 13 views
12

Dört aydan beri Laravel 4 ile iyi bir birim test kapsamı içeren karmaşık bir web uygulaması oluşturuyoruz. Şimdi, regresyona karşı önlem almak ve uygulamanızı kolayca yeniden düzenlememize izin vermek için 159 test ve 592 onayımız var.Laravel & PHPUnit: Mysql'yi önlemek için işlem yalıtımına izin ver Çok fazla bağlantı hatası

Güzel resim ancak birkaç gün beri sahip olduğumuz son testlerde aşağıdaki hata:

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

Nedeni basit: tüm testler aynı süreçte çalıştırın ve MySQL içinde erişimin sadece belirli sayıda izin aynı zamanda. Şimdi çok fazla testimiz var. Test takımımın ortasındaki birkaç testi silersem, son olanlar geçer.

çözüm aşağıda config gibi işlem tek başına PHPUnit çalıştırmak olabilir ama laravel testleri böyle açılacak gibi görünmüyor. Her testte bir diğer hata alıyorum:

Yani benim sorudur
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> 

: nasıl laravel processIsolation="true" ile çalışmak için test yapılandırabilirsiniz veya Sorunum için başka bir çözüm görüyorsunuz? https://github.com/padraic/mockery#mocking-public-static-methods

Bundan böyle, ben aslında SQL test daha fazla odaklanarak öneririm:

+0

bu sorunu çözdü mü? –

+0

Daha fazla bilgi için şu tartışmayı kontrol edebilirsiniz: https://plus.google.com/107528973720672293459/posts/bBC5CdKPFQ4. Temel olarak, Laravel ve PHPUnit'i süreç ile birlikte çalışacak şekilde konfigüre edemiyorum, bu yüzden max_connections'ı MySQL yapılandırmasında 1000'e ayarladım. Çok hoş değil ama işe yarıyor. –

cevap

2

Ben Mocks bakmak ve MySQL bağımlılığını ortadan kaldıracaktır. Son zamanlarda firmam, eski yavaşlığımızı gerçekten döndüren DBA'ları işe almak için iyi bir miktar harcadı.

+0

Fikir için teşekkürler, ancak veritabanını birkaç nedenden dolayı test etmek istiyorum. Göçleri test etmek istiyorum ve bir DB erişimine ihtiyaç duyan birçok işlevsel test var, bunlar entegrasyon testlerine çok yakın. Başka bir nokta, klasik bir web uygulamasının% 90'ının verilerin kaydedilmesi, erişilmesi ve sunulmasıdır. Testlerde DB'yi kontrol etmezseniz, bir şeyleri kaçırdığınızı düşünüyorum. –

+1

* "Testlerde DB'yi kontrol etmezseniz, sanırım bir şeyi özlüyorsunuz ..." * Bu kesinlikle doğru olsa da, aynı zamanda birim testleri ve entegrasyon testleri yapmanız gerektiği anlamına gelmez. –

4

Artık DB :: bağlantısı() yapabilir -> setPdo (null) sizin testler en söküm bağlantıyı kapatmak için tha bunu çözmek gerekir. Bu işe yaramazsa, Laravel TestCase'i genişleten herhangi bir testte unset($this->app['db']) yapabilirsin.

+0

Bu harika olabilir ama 'setPdo' yöntemi sadece argüman olarak bir PDO örneğini kabul eder ... –

+0

Evet Taylor benim PR düzenlenmiş gibi görünüyor, şu anda kullanmakta olduğum yanıtın bir alternatif ekledim. –

+1

Çalışıyor! '' Unset ($ this-> app ['db']) 'yi gözyaşıma taktım ve işte bu kadar. –

1

"nedeniyle, altta yatan PDO örneğinin max_connections limitini aşan verilen veritabanından kesmek gerekirse, bağlantı kesme yöntemi kullanmak" Bu laravel içinde iyi çalıştı 5,1

public function tearDown() 
{ 
    $this->beforeApplicationDestroyed(function() { 
     DB::disconnect(); 
    }); 

    parent::tearDown(); 
}