Jak przeprowadzić pojedynczy test z nosem w pylonach

152

Mam aplikację Pylons 1.0 z kilkoma testami w katalogu test / Function. Otrzymuję dziwne wyniki testów i chcę przeprowadzić tylko jeden test. Dokumentacja nosa mówi, że powinienem być w stanie przekazać nazwę testu w wierszu poleceń, ale otrzymuję ImportErrors bez względu na to, co zrobię

Na przykład:

nosetests -x -s sometestname

Daje:

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

Otrzymuję ten sam błąd dla

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

Jaka jest prawidłowa składnia?

Ben
źródło

Odpowiedzi:

233

nosetests appname.tests.functional.test_controllerpowinien działać, gdy plik jest nazwany test_controller.py.

Aby uruchomić określoną klasę testową i metodę, użyj ścieżki formularza module.path:ClassNameInFile.method_name, czyli dwukropka oddzielającego ścieżkę modułu / pliku od obiektów w pliku. module.pathjest względną ścieżką do pliku (np tests/my_tests.py:ClassNameInFile.method_name.).

Antoine Leclair
źródło
1
Ahhh, jedyna kombinacja, której nie próbowałem. westchnienie . Dzięki!
Ben
2
Spowoduje to uruchomienie każdego testu w kontrolerze / module testowym. A co z uruchomieniem jednej metody testowej? Coś jak appname.tests.functional.test_controller.name_of_test_method.
ryonlife
69
Aby uruchomić określoną klasę testową i metodę, użyj ścieżki formularza module.path:ClassNameInFile.method_name, czyli dwukropka oddzielającego ścieżkę modułu / pliku od obiektów w pliku.
James Murty,
9
Dla każdego, kto jest zdezorientowany: module.pathjest względną ścieżką do pliku (np. my_tests.py:ClassNameInFile.method_name), A nie ścieżką, której import
użyłbyś
1
@bcoughlan Dodałem to do odpowiedzi! To było naprawdę zagmatwane.
schlamar
47

Dla mnie przy użyciu Nosetests 1.3.0 te warianty działają (ale upewnij się, że masz __init__.pyw folderze testy):

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

Zwróć uwagę, że pojedynczy dwukropek między nazwą modułu a nazwą klasy.

Kee
źródło
1
Dzięki za drugą opcję, z pomocą autouzupełniania basha zdecydowanie najwygodniejsza.
Peter Kilczuk,
Warto zauważyć, że do wywoływania testów sparametryzowanych (tych, które używają @ parameterized.expand) musisz użyć następującej składni: test_file.py:ClassNameInFile.MethodName_TestNumber, gdzie TestNumber może wynosić 1, 2, 3, ... jeden na test sparametryzowany
luca
2

Muszę dodać rozszerzenie pliku „.py”, czyli

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

Może to dlatego, że nie mam żadnych klas w pliku. Bez .pynosa narzekał:

Nie można znaleźć wywoływalnego testu_func_xy w pliku / path_to / my_file: plik nie jest modułem Pythona

I to chociaż mam __init__.pyw folderze /path_to/.

langlauf.io
źródło
0

Napisałem ten mały skrypt na podstawie poprzednich odpowiedzi:

#!/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
źródło
0

Poniższe działały dla mnie dobrze:

nosetests test_file.py:method_name

Zwróć uwagę, że moje testy nie odbywały się w klasie. Metody testowe znajdowały się w jednym pliku.

Raptor
źródło