Wie führe ich einen einzelnen Test mit Nose in Pylons durch?

152

Ich habe eine Pylons 1.0-App mit einer Reihe von Tests im Verzeichnis test / function. Ich erhalte seltsame Testergebnisse und möchte nur einen einzigen Test ausführen. Die Nasen-Dokumentation besagt, dass ich in der Lage sein sollte, einen Testnamen über die Befehlszeile zu übergeben, aber ich erhalte ImportErrors, egal was ich tue

Beispielsweise:

nosetests -x -s sometestname

Gibt:

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

Ich bekomme den gleichen Fehler für

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

Was ist die richtige Syntax?

Ben
quelle

Antworten:

233

nosetests appname.tests.functional.test_controllersollte funktionieren, wo die Datei benannt ist test_controller.py.

Verwenden Sie zum Ausführen einer bestimmten Testklasse und -methode einen Pfad des Formulars module.path:ClassNameInFile.method_name, dh einen Doppelpunkt, der den Modul- / Dateipfad und die Objekte in der Datei trennt. module.pathist der relative Pfad zur Datei (z tests/my_tests.py:ClassNameInFile.method_name. B. ).

Antoine Leclair
quelle
1
Ahhh, die eine Kombination, die ich nicht ausprobiert habe. seufz . Vielen Dank!
Ben
2
Dadurch wird jeder Test in einem Testcontroller / -modul ausgeführt. Was ist mit einer einzelnen Testmethode? So etwas wie appname.tests.functional.test_controller.name_of_test_method.
Ryonlife
69
Verwenden Sie zum Ausführen einer bestimmten Testklasse und -methode einen Pfad des Formulars module.path:ClassNameInFile.method_name, dh einen Doppelpunkt, der den Modul- / Dateipfad und die Objekte in der Datei trennt.
James Murty
9
Für alle anderen verwirrt: module.pathist der relative Pfad zur Datei (z. B. my_tests.py:ClassNameInFile.method_name), nicht der Pfad, den Sie in einer importAnweisung verwenden würden
bcoughlan
1
@bcoughlan Ich habe dies zur Antwort hinzugefügt! Das war wirklich verwirrend.
Schlamar
47

Bei Verwendung von Nosetests 1.3.0 funktionieren diese Varianten (stellen Sie jedoch sicher, dass Sie sie __init__.pyin Ihrem Testordner haben ):

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

Beachten Sie den einzelnen Doppelpunkt zwischen Modulname und Klassenname.

Kee
quelle
1
Vielen Dank für die zweite Option, mit Hilfe von Bash Autocomplete definitiv die bequemste.
Peter Kilczuk
Es ist zu beachten, dass Sie zum Aufrufen parametrisierter Tests (diejenigen, die @ parameterized.expand verwenden) diese Syntax verwenden müssen: test_file.py:ClassNameInFile.MethodName_TestNumber, wobei TestNumber 1, 2, 3, ... eins pro sein kann parametrisierter Test
Luca
2

Ich muss die Dateierweiterung ".py" hinzufügen, d. H.

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

Vielleicht liegt das daran, dass ich keine Klassen in der Datei habe. Ohne die .pybeschwerte sich die Nase:

Callable test_func_xy kann in Datei / path_to / my_file nicht gefunden werden: Datei ist kein Python-Modul

Und das obwohl ich einen __init__.pyim Ordner habe /path_to/.

langlauf.io
quelle
0

Ich habe dieses kleine Skript basierend auf den vorherigen Antworten geschrieben:

#!/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
quelle
0

Folgendes hat bei mir einfach gut funktioniert:

nosetests test_file.py:method_name

Beachten Sie, dass meine Tests nicht in einer Klasse waren. Die Testmethoden befanden sich in einer einzigen Datei.

Raubvogel
quelle