¿Cómo ejecuto una sola prueba con Nose in Pylons?

152

Tengo una aplicación Pylons 1.0 con un montón de pruebas en el directorio test / funcional. Estoy obteniendo resultados de pruebas extraños y solo quiero ejecutar una sola prueba. La documentación de la nariz dice que debería poder pasar un nombre de prueba en la línea de comando pero obtengo ImportErrors sin importar lo que haga

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

Me sale el mismo error para

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

¿Cual es la sintaxis correcta?

Ben
fuente

Respuestas:

233

nosetests appname.tests.functional.test_controllerdebería funcionar, donde se nombra el archivo test_controller.py.

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

Antoine Leclair
fuente
1
Ahhh, la única combinación que no probé. suspiro . ¡Gracias!
Ben
2
Eso ejecutará cada prueba en un controlador / módulo de prueba. ¿Qué pasa con la ejecución de un único método de prueba? Algo así como appname.tests.functional.test_controller.name_of_test_method.
ryonlife
69
Para ejecutar una clase y un método de prueba específicos, use una ruta del formulario module.path:ClassNameInFile.method_name, es decir, con dos puntos que separen la ruta del módulo / archivo y los objetos dentro del archivo.
James Murty
9
Para cualquier otra persona confunde: module.pathes la ruta relativa al archivo (por ejemplo my_tests.py:ClassNameInFile.method_name), no es el camino que usaría en un importcomunicado
bcoughlan
1
@bcoughlan ¡Agregué esto a la respuesta! Esto fue realmente confuso.
schlamar
47

Para mí, usando Nosetests 1.3.0, estas variantes están funcionando (pero asegúrese de tener __init__.pyen su 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 los dos puntos entre el nombre del módulo y el nombre de la clase.

Kee
fuente
1
Gracias por la segunda opción, con la ayuda de bash autocompletar definitivamente la más conveniente.
Peter Kilczuk
Vale la pena tener en cuenta que para llamar a pruebas parametrizadas (las que usan @ parametrizado.expandir) debe usar esta sintaxis: test_file.py:ClassNameInFile.MethodName_TestNumber, donde TestNumber podría ser 1, 2, 3, ... uno por prueba parametrizada
luca
2

Tengo que agregar la extensión de archivo ".py", es decir,

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

Quizás esto se deba a que no tengo ninguna clase en el archivo. Sin la .pynariz se quejaba:

No puedo encontrar test_func_xy invocable en file / path_to / my_file: el archivo no es un módulo de Python

Y esto aunque tengo un __init__.pyen la carpeta /path_to/.

langlauf.io
fuente
0

Escribí 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"
tfga
fuente
0

Lo siguiente me funcionó bien:

nosetests test_file.py:method_name

Tenga en cuenta que mis pruebas no estaban en una clase. Los métodos de prueba estaban en un solo archivo.

Rapaz
fuente