Я использую нос для тестовой коллекции, и я также хочу использовать его плагин doctest. У меня есть модуль, который нуждается в приспособлении, чтобы его можно было импортировать. Поэтому я не могу использовать фикстуры модуля Nose, так как они загружаются из тестируемого модуля. Есть ли способ указать фикстуры модуля для Nose-doctest вне модуля?
Для некоторых вариантов использования можно было бы обнаружить, что выполняется под doctest, и применить фикстуру в начале модуля. Мне было бы интересно услышать ответы и для этого варианта использования.
Однако бывают ситуации, когда это не работает: когда импорт завершается ошибкой из-за SyntaxError
, код модуля никогда не запускается. В моем случае я в основном разрабатываю код, совместимый как с Python 2, так и с Python 3 (без 2to3
). Однако есть несколько модулей, специфичных для python 3, которые просто не следует проверять носом, когда они работают под python 2. Каков был бы мой лучший вариант здесь?
EDIT: MWE (для ситуации SyntaxError
)
У меня есть пакет с множеством небольших модулей, некоторые из них используют синтаксис Python 3. Вот структура пакета:
~/pckg/
__init__.py
py3only.py
... (other modules)
tests/
test_py3only.py
Некоторые тесты написаны как unittest.TestCase
, но я также хочу протестировать примеры кода в строках документации. ~/pckg/__init__.py
пусто.
~/pckg/py3only.py:
def fancy_py3_func(a:"A function argument annotation (python 3 only syntax)"):
""" A function using fancy syntax doubling it's input.
>>> fancy_py3_func(4)
8
"""
return a*2
~/pckg/тесты/test_py3only.py:
import sys, unittest
def setup_module():
if sys.version_info[0] < 3:
raise unittest.SkipTest("py3only unavailable on python "+sys.version)
class TestFancyFunc(unittest.TestCase):
def test_bruteforce(self):
from pckg.py3only import fancy_py3_func
for k in range(10):
self.assertEqual(fancy_py3_func(k),2*k)
Тестирование на python 3, все тестируется и проходит (запускается из прилагаемой папки, например ~
):
~ nosetests3 -v --with-doctest pckg
Doctest: pckg.py3only.fancy_py3_func ... ok
test_bruteforce (test_py3only.TestFancyFunc) ... ok
В Python 2 фикстура модуля ~/pckg/tests/test_py2only.py
правильно определяет ситуацию и пропускает тест. Однако мы получаем SyntaxError
из ~/pckg/py3only.py
:
~ nosetests -v --with-doctest pckg
Failure: SyntaxError (invalid syntax (py3only.py, line 1)) ... ERROR
SKIP: py3only unavailable on python 2.7.6 (default, Mar 22 2014, 22:59:56)
Функция, похожая на ~/pckg/tests/test_py3only.py:setup_module()
, могла бы решить эту проблему, если бы я мог заставить nose
запустить этот код до того, как его плагин doctest даже попытается импортировать этот модуль.
Похоже, мне лучше всего написать правильный тестовый скрипт верхнего уровня, который обрабатывает набор тестов...
pydoc
, ниpylint
нельзя использовать в вашем коде. Изменение модуля во время импорта, потому что он тестируется, как бы сводит на нет весь смысл тестирования, не так ли? - person Dima Tisnek   schedule 16.04.2015nosetests -v --with-doctest pckg
вы позволяете Python 2 видеть код Python 3, потому что запускаете--with-doctest
из верхнего каталога. Запустите тесты как unittest, так и doctest из папкиtests
. Для успешного выполнения doctest извлеките его в обычный текстовый файл, как я сделал, чтобы вы могли условно импортировать. - person Nizam Mohamed   schedule 22.04.2015setup_
функции предназначены для модульного тестирования. - person Nizam Mohamed   schedule 22.04.2015setup_
составляют часть так называемыхfixtures
, и я надеялся, что есть способ указать их для встроенных тестов документации. Думаю, это было напрасно. - person burnpanck   schedule 22.04.2015nosetests
имеет-I REGEX
возможность игнорировать файлы. - person Nizam Mohamed   schedule 22.04.2015