¿Cómo especifico una única prueba en un archivo con nosetests?

102

Tengo un archivo llamado test_web.py que contiene una clase TestWeb y muchos métodos llamados test_something ().

Puedo ejecutar todas las pruebas en la clase así:

$ nosetests test_web.py 
...
======================================================================
FAIL: checkout test
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/me/path/here/test_web.py", line 187, in test_checkout
...

Pero parece que no puedo ejecutar pruebas individuales. Estos me dan errores de "No existe tal prueba" cuando se ejecutan en la misma PWD:

$ nosetests test_web.py:test_checkout
$ nosetests TestWeb:test_checkout

¿Qué podría estar mal aquí?

opstástico
fuente
No puedo ayudarlo a menos que pueda publicar sus casos de prueba o un SSCCE , acabo de probar la sintaxis que usó con nose en mi máquina y funcionó bien.
Jeff Tratner

Respuestas:

148

Debe especificarlo así:, nosetests <file>:<Test_Case>.<test_method>o

nosetests test_web.py:TestWeb.test_checkout

Ver los documentos

Será
fuente
6
¿Por qué diablos la biblioteca usa ':' en lugar de '.'? ;)
omikron
2
¿Quizás para facilitar la delimitación entre un módulo y una clase?
Chris
@omikron cuando especifiqué el archivo no tuve ningún error de importación
gabeio
2
Vaya, eso es terrible, bibliotecas clásicas de Python, no se preocupan por las interfaces existentes
Dagrooms
16

También puede especificar un módulo:

nosetests tests.test_integration:IntegrationTests.test_user_search_returns_users
michaeljoseph
fuente
1
No sé si es una versión diferente de Python nosetestso qué, pero esa sintaxis falla. Lo que hace el trabajo, sin embargo, es: nosetests tests/test_integration:IntegrationTests.test_user_search_returns_users, que significa - como archivos de referencia de archivos, no módulos de Python, utilizando /en lugar de.
dwanderson
1
@dwanderson ambos usos deberían funcionar, según nose.readthedocs.io/en/latest/usage.html#selecting-tests . ¿Su falla podría deberse a que testsno es un módulo en su configuración?
michaeljoseph
1
Ahh, es cierto, olvidé un __init__.pyen el testsdirectorio. ¡Bien hecho! Gracias
dwanderson
11

Especificar nombres en la línea de comando como sugieren las otras respuestas funciona y es útil. Sin embargo, cuando estoy escribiendo pruebas, a menudo encuentro que quiero ejecutar solo la prueba en la que estoy trabajando, y los nombres que tendría que escribir en la línea de comandos se vuelven bastante largos y engorrosos de escribir. . En tal caso, prefiero usar un decorador y una bandera personalizados.

Defino wipd("decorador de trabajo en progreso") así:

from nose.plugins.attrib import attr
def wipd(f):
    return attr('wip')(f)

Esto define un decorador @wipdque establecerá el wipatributo en los objetos que decora. Por ejemplo:

import unittest
class Test(unittest.TestCase):

    @wipd
    def test_something(self):
        pass

Luego -a wipse puede usar en la línea de comando para limitar la ejecución de la prueba a las marcadas con @wipd.

Nota sobre los nombres ...

Estoy usando el nombre @wipddel decorador en lugar de @wipevitar este tipo de problema:

import unittest
class Test(unittest.TestCase):

    from mymodule import wip    
    @wip
    def test_something(self):
        pass

    def test_something_else(self):
        pass

El decorador importconvertirá al wipdecorador en miembro de la clase y se seleccionarán todas las pruebas de la clase. El attribcomplemento verifica la clase principal de un método de prueba para ver si el atributo seleccionado también existe allí, y los atributos que se crean y prueban attribno existen en un espacio segregado. Entonces, si prueba con -a fooy su clase contiene foo = "platypus", el complemento seleccionará todas las pruebas de la clase.

Luis
fuente
3

Para ejecutar varias pruebas específicas, puede agregarlas a la línea de comando, separadas por un espacio.

nosetests test_web.py:TestWeb.test_checkout test_web.py:TestWeb.test_another_checkout
Skurpi
fuente
0

En mis pruebas, especificar pruebas con nombres de módulo no funciona

Debe especificar la ruta real a .py:

nosetests /path/to/test/file.py:test_function

Esto con nose==1.3.7

Stephen
fuente
0

Mi requisito era ejecutar una sola prueba en un archivo de prueba que estaba en otro directorio de Windows ; esto se hizo desde el símbolo del sistema de anaconda de la siguiente manera:

realizó pruebas de nariz de:

(base) C:\Users\ABC\Documents\work\

pero test_MyTestFile.py y methodsFile.py estaban en:

 (base) C:\Users\ABC\Documents\work\daily\

Ejecute una prueba única incluyendo la ruta con comillas de la siguiente manera:

(base) C:\Users\ABC\Documents\work>nosetests "daily\\test_MyTestFile.py:MyTestClass.test_add_integers"

test_MyTestFile.py tenía este aspecto:

import methodsFile
import unittest

class MyTestClass(unittest.TestCase):

    def test_add_integers(self):
        assert methodsFile.add(5, 3) == 8

    def test_add_integers_zero(self):
        assert methodsFile.add(3, 0) == 3

MethodFile.py se veía así:

def add(num1, num2):
        return num1 + num2
Grant Shannon
fuente