Come posso eseguire un singolo test con Nose in Pylons


152

Ho un'app Pylons 1.0 con un sacco di test nella directory test / funzionale. Sto ottenendo strani risultati di test e voglio solo eseguire un singolo test. La documentazione di naso dice che dovrei essere in grado di passare un nome di test dalla riga di comando ma ottengo ImportErrors qualunque cosa io faccia

Per 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 sintassi corretta?

Risposte:


233

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

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


1
Ahhh, l'unica combinazione che non ho provato. sospiro . Grazie!
Ben

2
Ciò eseguirà tutti i test in un controller / modulo di test. Che dire dell'esecuzione di un singolo metodo di prova? Qualcosa del genere appname.tests.functional.test_controller.name_of_test_method.
ryonlife,

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

9
Per chiunque sia confuso: module.pathè il percorso relativo al file (ad es. my_tests.py:ClassNameInFile.method_name), Non il percorso che import
useresti

1
@bcoughlan Ho aggiunto questo alla risposta! Questo è stato davvero confuso.
schlamar,

47

Per me usando Nosetests 1.3.0 queste varianti funzionano (ma assicurati di averlo __init__.pynella cartella dei test):

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

Si noti che i due punti singoli 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ù conveniente.
Peter Kilczuk,

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

2

Devo aggiungere l'estensione ".py", ovvero

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

Forse è perché non ho alcuna classe nel file. Senza il .py, il naso si lamentava:

Impossibile trovare callable test_func_xy nel file / path_to / my_file: il file non è un modulo Python

E questo anche se ne ho uno __init__.pynella cartella /path_to/.


0

Ho scritto questo piccolo script, basato sulle 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"

0

Quanto segue ha funzionato bene per me:

nosetests test_file.py:method_name

Nota che i miei test non erano in una classe. I metodi di prova erano in un singolo file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.