2013-05-07 24 views
24

C'è un modo per velocizzare l'esecuzione ripetuta di py.test? Sembra passare molto tempo a raccogliere i test, anche se specifichi quali file eseguire sulla riga di comando. So che non è un problema di velocità del disco, dal momento che l'esecuzione di pyflakes su tutti i file .py è molto veloce.Come velocizzare py.test

+1

Sei sicuro che la fase di "raccolta" sia lenta? Per favore, prova a eseguire py.test con '--collectonly'. – alecxe

+1

Sì, è una raccolta che è lenta. Posso vedere il conteggio delle raccolte iniziare da 0, andare a 2, quindi 7. Ho verificato di nuovo con '--collectonly'. Post raccolta l'esecuzione è quasi immediata. –

+1

Ho un progetto con più di 400 test e la fase di raccolta è molto veloce. Inoltre ho conftest.py che aggiunge un sacco di magia, un sacco di 'parametrize's, fixtures e' pytest_generate_tests' che rendono la raccolta più lenta, nonostante questa raccolta sia veloce nel mio caso. Verifica di non avere il proprio codice che interagisce con la fase di raccolta di pytest e rallenta. In caso contrario, è possibile eseguire profiler come profiler di linea per vedere quale codice è lento. – spinus

risposta

9

L'utilizzo dell'opzione norecursedirs in pytest.ini o tox.ini consente di risparmiare molto tempo di raccolta, a seconda di quali altri file sono presenti nella directory di lavoro. Il mio tempo di raccolta è approssimativamente dimezzato per una serie di 300 test quando l'ho installato (0,34 vs 0,64).

Se stai già utilizzando tox come me, è solo bisogno di aggiungere quanto segue nel tox.ini:

[pytest] 
norecursedirs = docs *.egg-info .git appdir .tox 

è anche possibile aggiungere in un file pytest.ini free-standing.

La documentazione di pytest ha more details on py.test configuration files.

+0

In aggiunta (o invece) è necessario configurare 'percorsi di test', ad esempio' testpaths = src/tests'. Quindi non è necessario saltare '.git',' .tox' ecc. – blueyed

4

Avevo lo stesso problema in cui stavo chiamando py.test alla radice del mio progetto e i miei test erano tre sottodirectory in giù. La raccolta richiedeva 6-7 secondi prima di 0.4 secondi di esecuzione effettiva del test.

La mia soluzione inizialmente era quello di chiamare py.test con il percorso relativo alle prove:

py.test src/www/tests/ 

Se facendo che accelera la vostra collezione anche, è possibile aggiungere il percorso relativo alle prove alla fine del addopts impostazione nel pytest.ini - ad esempio:

[pytest] 
addopts = --doctest-glob='test_*.md' -x src/www/tests/ 

Questa è sceso il tempo di raccolta + di esecuzione fino a circa un secondo e ho potuto ancora chiamare py.test come ero prima.

+1

Un modo migliore è quello di configurare questo usando 'testpaths', cioè' testpaths = src/www/tests'. – blueyed

1

Con xdist è possibile parallelizzare le esecuzioni py.test. Permette persino di spedire test a macchine remote. Dipende dal tuo setup può accelerare un bel po ':)

0

Se si dispone di un software antivirus in esecuzione, provare a spegnerlo. Ho avuto lo stesso identico problema. I test di raccolta sono stati incredibilmente lenti. Si è rivelato essere il mio software antivirus (Avast) che stava causando il problema. Quando ho disattivato il software antivirus, la raccolta dei test è stata eseguita circa cinque volte più velocemente. L'ho provato diverse volte, accendendo e spegnendo l'antivirus, quindi non ho dubbi che fosse la causa nel mio caso.