2010-09-13 11 views
133

? Tengo una aplicación Pylons 1.0 con un montón de pruebas en el directorio de prueba/funcional. Estoy obteniendo resultados de pruebas raras y solo quiero hacer una prueba. La documentación nariz dice que debería ser capaz de pasar en un nombre de la prueba en la línea de comandos pero me da ImportErrors no importa lo que hago¿Cómo puedo ejecutar una sola prueba con Nose in Pylons

Por ejemplo:

nosetests -x -s sometestname 

Da:

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 

consigo el mismo error para

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

¿Cuál es la correcta synt ¿hacha?

Respuesta

206

nosetests appname.tests.functional.test_controller debería funcionar, donde el archivo se llama test_controller.py.

Para ejecutar una clase de prueba y un método específicos, utilice una ruta del formulario module.path:ClassNameInFile.method_name, es decir, con dos puntos que separan la ruta del módulo/archivo y los objetos dentro del archivo. module.path es la ruta relativa al archivo (por ejemplo, tests/my_tests.py:ClassNameInFile.method_name).

+1

Ahhh, la combinación no lo probé. *suspiro*. ¡Gracias! – Ben

+2

Eso ejecutará todas las pruebas en un controlador/módulo de prueba. ¿Qué hay de ejecutar un único método de prueba? Algo así como 'appname.tests.functional.test_controller.name_of_test_method'. –

+66

Para ejecutar una clase y un método de prueba específicos, utilice una ruta del formulario 'module.path: ClassNameInFile.method_name', es decir, con dos puntos que separan la ruta del módulo/archivo y los objetos dentro del archivo. –

42

Para mí utilizando nosetests 1.3.0 estas variantes están trabajando (pero asegúrese de que tiene __init__.py en la carpeta de pruebas):

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

Tenga en cuenta que solo dos puntos entre el nombre del módulo y el nombre de la clase.

+1

Gracias por la segunda opción, con la ayuda de bash autocompletar definitivamente el más conveniente. –

+0

Justo lo que estaba buscando, ¡gracias! – radtek

+0

Vale la pena tener en cuenta que para llamar a pruebas parametrizadas (las que usan @ parameterized.expand) tiene que usar esta sintaxis: test_file.py:ClassNameInFile.MethodName_TestNumber, donde TestNumber podría ser 1, 2, 3, ... one por prueba parametrizada – luca

2

Tengo que añadir la extensión ".py", es decir,

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

Tal vez esto se debe a que no tengo ninguna clase en el archivo. Sin la .py, la nariz se quejaba:

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

Y esto a pesar de que tengo una __init__.py en la carpeta /path_to/.

0

de escribir este pequeño script, basado en las respuestas anteriores:

#!/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" 
Cuestiones relacionadas