Я использую нос для коллекции тестов, и я также хочу использовать его плагин 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
На питоне 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 плагин даже пытается импортировать этот модуль.
Похоже, мой лучший выбор, чтобы написать правильный сценарий тестирования верхнего уровня, который обрабатывает коллекцию тестов ...
модуль не может быть импортирован без X или Y плохо пахнет, то это означает, например, что ни '' pydoc' ни pylint' могут быть использованы в вашем коде. Меняя модуль во время импорта, потому что он находится под проверкой, разыгрывает всю точку тестирования, не так ли? –
У меня есть по существу два случая: Отсутствие внешних зависимостей _optional_ и модулей с использованием нового синтаксиса python 3, протестированного под python 2. В обоих случаях тестирование практически бесполезно, модули недоступны. Я хочу подавить тестовые сбои и, возможно, заменить их сообщениями, что некоторая часть библиотеки недоступна из-за отсутствия зависимостей. – burnpanck
'nosetests -v --with-doctest pckg' вы позволяете Python 2 видеть код Python 3, потому что вы запускаете' --with-doctest' из верхней директории. Запустите тесты как unittest, так и doctest из папки 'tests'. Чтобы doctest смог извлечь его в текстовый файл, как я сделал, чтобы вы могли условно импортировать. –