Wie spezifiziere ich einen einzelnen Test in einer Datei mit Nosetests?

102

Ich habe eine Datei namens test_web.py, die eine Klasse TestWeb und viele Methoden wie test_something () enthält.

Ich kann jeden Test in der Klasse folgendermaßen ausführen:

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

Aber ich kann nicht scheinen, einzelne Tests durchzuführen. Diese geben mir "Kein solcher Test" -Fehler, wenn ich in derselben PWD ausgeführt werde:

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

Was könnte hier falsch sein?

opstastisch
quelle
Ich kann Ihnen nur helfen, wenn Sie Ihre Testfälle oder eine SSCCE veröffentlichen können. Ich habe gerade die Syntax ausprobiert, die Sie mit der Nase auf meinem Computer verwendet haben, und sie hat einwandfrei funktioniert.
Jeff Tratner

Antworten:

148

Sie müssen es wie folgt angeben : nosetests <file>:<Test_Case>.<test_method>, oder

nosetests test_web.py:TestWeb.test_checkout

Siehe die Dokumente

Wille
quelle
6
Warum um alles in der Welt verwendet die Bibliothek ':' anstelle von '.'? ;)
Omikron
2
Vielleicht, um die Abgrenzung zwischen einem Modul und einer Klasse zu vereinfachen?
Chris
@omikron als ich die Datei spezifizierte, hatte ich keine
Importfehler
2
Wow, das sind schreckliche, klassische Python-Bibliotheken, die sich nicht um vorhandene Schnittstellen
kümmern
16

Sie können auch ein Modul angeben:

nosetests tests.test_integration:IntegrationTests.test_user_search_returns_users
michaeljoseph
quelle
1
Ich weiß nicht, ob es sich um eine andere Version von Python handelt nosetestsoder was, aber diese Syntax schlägt fehl. Was jedoch funktioniert, ist : nosetests tests/test_integration:IntegrationTests.test_user_search_returns_users, was bedeutet - Referenzdateien als Dateien, nicht Python-Module, die /anstelle von.
dwanderson
1
@dwanderson beide Verwendungen sollten gemäß nase.readthedocs.io/en/latest/usage.html#selecting-tests funktionieren . Ihr Fehler könnte dadurch verursacht werden tests, dass Sie kein Modul in Ihrem Setup sind?
Michaeljoseph
1
Ahh, das stimmt, ich habe eine __init__.pyim testsVerzeichnis vergessen . Gut gemacht! Vielen Dank
Dwanderson
11

Das Angeben von Namen in der Befehlszeile, wie in den anderen Antworten angegeben, funktioniert und ist nützlich. Wenn ich gerade Tests schreibe, stelle ich jedoch häufig fest, dass ich nur den Test ausführen möchte, an dem ich arbeite, und die Namen, die ich in die Befehlszeile schreiben müsste, werden ziemlich lang und umständlich zu schreiben . In diesem Fall bevorzuge ich die Verwendung eines benutzerdefinierten Dekorateurs und einer Flagge.

Ich definiere wipd("work in progress decorator") folgendermaßen:

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

Dies definiert einen Dekorateur, @wipdder das wipAttribut für Objekte festlegt , die er dekoriert. Zum Beispiel:

import unittest
class Test(unittest.TestCase):

    @wipd
    def test_something(self):
        pass

Dann -a wipkann in der Befehlszeile verwendet werden , um die Ausführung des Tests auf das mit markiert zu verengen @wipd.

Hinweis zu Namen ...

Ich verwende den Namen @wipdfür den Dekorateur, anstatt @wipdiese Art von Problem zu vermeiden:

import unittest
class Test(unittest.TestCase):

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

    def test_something_else(self):
        pass

Dadurch importwird der wipDekorateur zu einem Mitglied der Klasse , und alle Tests in der Klasse werden ausgewählt. Das attribPlugin überprüft die übergeordnete Klasse einer Testmethode, um festzustellen, ob das ausgewählte Attribut auch dort vorhanden ist und die Attribute, die von erstellt und getestet werden attrib, nicht in einem getrennten Bereich vorhanden sind. Wenn Sie also mit testen -a foound Ihre Klasse enthält foo = "platypus", werden alle Tests in der Klasse vom Plugin ausgewählt.

Louis
quelle
3

Um mehrere spezifische Tests auszuführen, können Sie sie einfach der durch Leerzeichen getrennten Befehlszeile hinzufügen.

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

In meinen Tests funktioniert das Angeben von Tests mit Modulnamen nicht

Sie müssen den tatsächlichen Pfad angeben zu .py:

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

Dies mit nose==1.3.7

stephen
quelle
0

Meine Anforderung bestand darin, einen einzelnen Test in einer Testdatei auszuführen, die sich in einem anderen Windows- Verzeichnis befand. Dies erfolgte über die Anaconda-Eingabeaufforderung wie folgt:

lief nosetests von:

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

aber test_MyTestFile.py und MethodsFile.py befanden sich in:

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

einzelne Prüfung durchführen , indem einschließlich Pfad mit Anführungszeichen wie folgt:

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

test_MyTestFile.py sah folgendermaßen aus:

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

MethodsFile.py sah folgendermaßen aus:

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