Come si specifica un singolo test in un file con nosetest?


102

Ho un file chiamato test_web.py contenente una classe TestWeb e molti metodi chiamati test_something ().

Posso eseguire tutti i test della classe in questo modo:

$ 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
...

Ma non riesco a eseguire test individuali. Questi mi danno errori "No such test" quando vengono eseguiti nella stessa PWD:

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

Cosa potrebbe essere sbagliato qui?


non posso aiutarti a meno che tu non possa pubblicare i tuoi casi di test o un SSCCE , ho appena provato la sintassi che hai usato con il naso sulla mia macchina e ha funzionato bene.
Jeff Tratner

Risposte:


148

Devi specificarlo in questo modo:, nosetests <file>:<Test_Case>.<test_method>o

nosetests test_web.py:TestWeb.test_checkout

Vedi i documenti


6
Perché mai la libreria usa ":" invece di "."? ;)
omikron

2
Forse per facilitare la delimitazione tra un modulo e una classe?
Chris,

@omikron quando ho specificato il file non ho
riscontrato

2
Wow, è terribile, le classiche librerie Python, non una cura per le interfacce esistenti
Dagrooms

16

Puoi anche specificare un modulo:

nosetests tests.test_integration:IntegrationTests.test_user_search_returns_users

1
Non so se è una versione diversa di Python nosetestso cosa, ma quella sintassi fallisce. Ciò che funziona, tuttavia, è nosetests tests/test_integration:IntegrationTests.test_user_search_returns_users/.
:, che

1
@dwanderson entrambi gli usi dovrebbero funzionare, come da nose.readthedocs.io/en/latest/usage.html#selecting-tests . Il tuo errore potrebbe essere causato dal testsnon essere un modulo nella tua configurazione?
michaeljoseph

1
Ahh, è vero, ho dimenticato un __init__.pynella testsdirectory. Molto bene! Grazie
dwanderson

11

Specificare i nomi sulla riga di comando come suggeriscono le altre risposte funziona ed è utile. Tuttavia, quando sono nel bel mezzo della scrittura di test, spesso trovo che voglio eseguire solo il test su cui sto lavorando, ei nomi che dovrei scrivere sulla riga di comando diventano piuttosto lunghi e ingombranti da scrivere . In tal caso, preferisco utilizzare un decoratore e una bandiera personalizzati.

Definisco wipd("decoratore work in progress") così:

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

Questo definisce un decoratore @wipdche imposterà l' wipattributo sugli oggetti che decora. Per esempio:

import unittest
class Test(unittest.TestCase):

    @wipd
    def test_something(self):
        pass

Quindi -a wippuò essere utilizzato dalla riga di comando per restringere l'esecuzione del test a quelli contrassegnati con @wipd.

Nota sui nomi ...

Sto usando il nome @wipdper il decoratore piuttosto che @wipper evitare questo tipo di problema:

import unittest
class Test(unittest.TestCase):

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

    def test_something_else(self):
        pass

Il decoratore importrenderà wipun membro della classe e verranno selezionati tutti i test della classe. Il attribplugin controlla la classe genitore di un metodo di test per vedere se l'attributo selezionato esiste anche lì e gli attributi che vengono creati e testati da attribnon esistono in uno spazio separato. Quindi, se esegui il test con -a fooe la tua classe contiene foo = "platypus", tutti i test nella classe verranno selezionati dal plugin.


3

Per eseguire più test specifici, puoi semplicemente aggiungerli alla riga di comando, separati da uno spazio.

nosetests test_web.py:TestWeb.test_checkout test_web.py:TestWeb.test_another_checkout

0

Nei miei test, specificare i test con i nomi dei moduli non funziona

È necessario specificare il percorso effettivo per .py:

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

Questo con nose==1.3.7


0

La mia esigenza era di eseguire un singolo test in un file di test che si trovava in un'altra directory di Windows - questo è stato fatto dal prompt dei comandi di anaconda come segue:

ha eseguito nosetest da:

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

ma test_MyTestFile.py e methodsFile.py erano in:

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

gestito singolo test da incluso il percorso con le virgolette come segue:

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

test_MyTestFile.py aveva questo aspetto:

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 aveva questo aspetto:

def add(num1, num2):
        return num1 + num2
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.