2010-09-13 9 views
133

Ho un'app Pylons 1.0 con un gruppo di test nella directory test/funzionale. Ottengo risultati di test strani e voglio solo eseguire un singolo test. La documentazione naso dice che dovrei essere in grado di passare in un nome di test nella riga di comando ma ottengo ImportErrors non importa quello che faccioCome eseguire un singolo test con il naso su piloni

Ad esempio:

nosetests -x -s sometestname 

Dà:

Traceback (most recent call last): 
    File "/home/ben/.virtualenvs/tsq/lib/python2.6/site-packages/nose-0.11.4-py2.6.egg/nose/loader.py", line 371, in loadTestsFromName 
    module = resolve_name(addr.module) 
    File "/home/ben/.virtualenvs/tsq/lib/python2.6/site-packages/nose-0.11.4-py2.6.egg/nose/util.py", line 334, in resolve_name 
    module = __import__('.'.join(parts_copy)) 
ImportError: No module named sometestname 

ottengo lo stesso errore per

nosetests -x -s appname.tests.functional.testcontroller 

Qual è la corretta synt ascia?

risposta

206

nosetests appname.tests.functional.test_controller dovrebbe funzionare, dove il file è denominato test_controller.py.

Per eseguire una classe di test e un metodo specifici, utilizzare un percorso del modulo module.path:ClassNameInFile.method_name, ovvero con i due punti che separano il percorso del modulo/file e gli oggetti all'interno del file. module.path è il percorso relativo al file (ad esempio tests/my_tests.py:ClassNameInFile.method_name).

+1

Ahhh, quella combinazione non ho provato. *sospiro*. Grazie! – Ben

+2

Questo eseguirà tutti i test in un controller/modulo di test. Che ne pensi di eseguire un singolo metodo di prova? Qualcosa come "appname.tests.functional.test_controller.name_of_test_method'. –

+66

Per eseguire una classe di test e un metodo specifici, utilizzare un percorso del modulo 'module.path: ClassNameInFile.method_name', ovvero con i due punti che separano il percorso del modulo/file e gli oggetti all'interno del file. –

42

Per me che utilizzano Nosetests 1.3.0 queste varianti stanno lavorando (ma assicuratevi di avere __init__.py nella cartella test):

nosetests [options] tests.ui_tests 
nosetests [options] tests/ui_tests.py 
nosetests [options] tests.ui_tests:TestUI.test_admin_page 

Si noti che solo i due punti tra il nome del modulo e il nome della classe.

+1

Grazie per la seconda opzione, con l'aiuto del completamento automatico di bash sicuramente la più comoda. –

+0

Proprio quello che stavo cercando, grazie! – radtek

+0

Vale la pena notare che per chiamare i test parametrici (quelli che usano @ parameterized.expand) devi usare questa sintassi: test_file.py:ClassNameInFile.MethodName_TestNumber, dove TestNumber potrebbe essere 1, 2, 3, ... uno per prova parametrizzata – luca

2

devo aggiungere l'estensione del file ".py", vale a dire,

r'/path_to/my_file.py:' + r'test_func_xy' 

Forse questo è perché non ho tutte le classi nel file. Senza il .py, il naso si lamentava:

Can't find callable test_func_xy in file /path_to/my_file: file is not a python module

E questo anche se ho un __init__.py nella cartella /path_to/.

0

ho scritto questo piccolo script, sulla base delle risposte precedenti:

#!/usr/bin/env bash 

# 
# Usage: 
# 
#  ./noseTest <filename> <method_name> 
# 
# e.g.: 
# 
#  ./noseTest test/MainTest.py mergeAll 
#  
# It is assumed that the file and the test class have the _same name_ 
# (e.g. the test class `MainTest` is defined in the file `MainTest.py`). 
# If you don't follow this convention, this script won't work for you. 
# 

testFile="$1" 
testMethod="$2" 

testClass="$(basename "$testFile" .py)" 

nosetests "$testFile:$testClass.test_$testMethod"