2010-10-08 13 views
15

Attualmente sto utilizzando Zend Framework in combinazione con PHPUnit per condurre test di unità su un'applicazione. Quando Hudson esegue il comando shell PHPUnit, il limite massimo di memoria PHP viene raggiunto a volte durante la generazione della copertura del codice. Al momento ho un totale di 41 test con 334 asserzioni.PHPUna generazione della copertura di codice che causa esaurimento della memoria

Ho eliminato con successo questo errore elevando l'impostazione memory_limit a 768M utilizzando lo switch -d memory_limit=768M; tuttavia, sono preoccupato che man mano che la complessità aumenta con il numero totale di test/asserzioni, non avrò abbastanza memoria per generare l'HTML per le statistiche sulla copertura del codice.

OS: CentOS 5.5
Pannello di controllo: WHM/cPanel
CI Server: Hudson

/usr/local/bin/phpunit 
    --verbose 
    -d memory_limit=512M 
    --log-junit ../../build/logs/phpunit.xml 
    --coverage-clover ../../build/logs/coverage/clover.xml 
    --coverage-html ../../build/logs/coverage-html/ 

Fatal error: Allowed memory size of 536870912 bytes exhausted

Prima di commettere i miei cambiamenti e lasciando Hudson gestire il resto, ho usa Windows 7 per lo sviluppo. L'utilizzo della memoria non ha mai superato 340 MB mentre si eseguiva lo stesso comando in W7.

+0

Tutti i test in una classe? – allnightgrocery

+0

No, i test sono divisi tra quattro file diversi. Questi test sono relativamente semplici, specialmente rispetto a quello che abbiamo programmato. –

+0

:) grazie per aver postato la tua soluzione. Ho avuto il problema che hai elencato e ti ho davvero hackerato. Ogni volta che qualcosa sarebbe venuto fuori (memoria esaurita in /pear/phpunit/framework/whatever.php on line 1999) dovrei digitare 'sudo vi /.../ whatever.php' e aggiungere una riga' set_ini ("memory_limit ", "1000M")'. Probabilmente non la migliore pratica;) –

risposta

15

Riducendo il numero di file inclusi nella copertura del codice, nonché aumentando il limite di memoria complessivo in PHP, sono stato in grado di uccidere praticamente questo errore. L'intero Zend Framework era incluso nella copertura del codice, che è molto grande.

+0

Per semplificare, ho inserito questa roba in una configurazione XML, ad es. " MY_LIBRARY". Se chiami questo phpunit.xml e si trova nella tua attuale directory di lavoro, l'unità php la applicherà automaticamente. –

+0

Ecco due link rilevanti: [code-coverage-analysis.including-excluded-files] (http://www.phpunit.de/manual/current/en/code-coverage-analysis.html#code-coverage-analysis .inclusione-escluso-file), e [Sintassi del filtro whitelist per la copertura del codice file XML config] (http://www.phpunit.de/manual/current/en/appendixes.configuration.html#appendixes.configuration.blacklist-whitelist) – KajMagnus

+1

È importante notare che inizialmente si potrebbe vedere phpunit interrompere l'esecuzione di test senza errori e mostrare "Restituito: 255" –

1

Hai abilitato la profilazione di xdebug, in tal caso prova a disattivarlo. Ho riscontrato questo problema in precedenza e sono arrivato alle estensioni in php (in particolare xdebug profiling e/o Inclued heirarchy viewer)

+0

Ho appena controllato, e speravo che fosse il problema, ma la profilazione è disattivata. Grazie per la risposta. Altre idee? –

+0

È difficile dirlo senza conoscere il codice base. Vorrei solo tenere d'occhio le bandiere rosse (ad es. __autoloading esauriente, memorizzare nella memoria cache, ecc.) Che normalmente non sono un problema, ma potrebbero causare problemi durante il test a causa dell'elevato numero di istanziazioni, ecc. Inoltre, approfitta di tearDown () se possibile. –