Как мне запустить один тест с Nose in Pylons

152

У меня есть приложение Pylons 1.0 с кучей тестов в каталоге test / functions. Я получаю странные результаты теста и хочу просто запустить один тест. В документации к носу сказано, что я должен быть в состоянии передать имя теста в командной строке, но я получаю ImportErrors независимо от того, что я делаю

Например:

nosetests -x -s sometestname

дает:

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

Я получаю ту же ошибку для

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

Какой правильный синтаксис?

Бен
источник

Ответы:

233

nosetests appname.tests.functional.test_controllerдолжно работать, где файл назван test_controller.py.

Чтобы запустить определенный тестовый класс и метод, используйте путь в форме module.path:ClassNameInFile.method_name, то есть с двоеточием, разделяющим путь к модулю / файлу и объекты внутри файла. module.pathотносительный путь к файлу (например tests/my_tests.py:ClassNameInFile.method_name).

Антуан Леклер
источник
1
Ааа, единственная комбинация, которую я не пробовал. Вздох . Спасибо!
Бен
2
Это будет запускать каждый тест в тестовом контроллере / модуле. Как насчет запуска одного метода тестирования? Нечто подобное appname.tests.functional.test_controller.name_of_test_method.
ryonlife
69
Чтобы запустить определенный тестовый класс и метод, используйте путь в форме module.path:ClassNameInFile.method_name, то есть с двоеточием, разделяющим путь к модулю / файлу и объекты внутри файла.
Джеймс Мёрти
9
Для всех, кто запутался: module.pathэто относительный путь к файлу (например my_tests.py:ClassNameInFile.method_name), а не путь, который вы бы использовали в importвыражении
bcoughlan
1
@bcoughlan Я добавил это в ответ! Это действительно сбивало с толку.
schlamar
47

Для меня, использующего Nosetests 1.3.0, эти варианты работают (но убедитесь, что они есть __init__.pyв папке с тестами):

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

Обратите внимание, что двоеточие между именем модуля и именем класса.

Kee
источник
1
Спасибо за второй вариант, с помощью bash autocomplete определенно самый удобный.
Питер Кильчук
Стоит отметить, что для вызова параметризованных тестов (тех, которые используют @ parameterized.expand) вы должны использовать этот синтаксис: test_file.py:ClassNameInFile.MethodName_TestNumber, где TestNumber может быть 1, 2, 3, ... по одному на параметризованный тест
Лука
2

Я должен добавить расширение ".py", то есть

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

Может быть, это потому, что у меня нет никаких классов в файле. Без той .py, нос жаловался:

Не удается найти вызываемый test_func_xy в файле / path_to / my_file: файл не является модулем python

И это, хотя у меня есть __init__.pyв папке /path_to/.

langlauf.io
источник
0

Я написал этот небольшой сценарий, основываясь на предыдущих ответах:

#!/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
источник
0

Следующее сработало для меня просто хорошо:

nosetests test_file.py:method_name

Обратите внимание, что мои тесты, где не в классе. Методы испытаний были в одном файле.

Raptor
источник