Używam nosa do testowania kolekcji i również chcę korzystać z jego wtyczki doctest. Mam moduł, który potrzebuje urządzenia, aby można go było importować. Dlatego nie mogę używać modułów nosa, ponieważ są one ładowane z testowanego modułu. Czy istnieje sposób na określenie ustawień modułów dla nosa-doctest poza modułem?Moduł modułu nosa-doctest przed zaimportowaniem modułu
W przypadku niektórych przypadków przydatna byłaby możliwość wykrycia bycia uruchamianym w trybie doctest i zastosowania urządzenia na początku modułu. Byłbym zainteresowany usłyszeniem odpowiedzi na ten przypadek użycia.
Istnieją jednak sytuacje, w których to nie może działać: Gdy import nie powiedzie się z powodu SyntaxError
, żaden kod modułu nigdy nie zostanie uruchomiony. W moim przypadku głównie rozwijam kod, który jest kompatybilny z python 2 i python 3 (bez 2to3
). Istnieje jednak kilka specyficznych modułów python 3, które po prostu nie powinny być sprawdzane przez nos, kiedy działają pod pytonem 2. Jaka byłaby tu moja najlepsza opcja?
EDIT: MWE (dla sytuacji SyntaxError
)
Mam pakiet z wielu małych modułów, niektóre z nich korzysta Python 3 składnię. Oto struktura pakietu:
~/pckg/
__init__.py
py3only.py
... (other modules)
tests/
test_py3only.py
Niektóre testy są pisane jako unittest.TestCase
, ale chcę również przykłady kodu w badanych docstrings. ~/pckg/__init__.py
jest pusty.
~/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/testy/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)
Testowanie na Pythonie 3, wszystko zostanie sprawdzone i karnety (biegnie od folder np ~
) obejmującą:
~ nosetests3 -v --with-doctest pckg
Doctest: pckg.py3only.fancy_py3_func ... ok
test_bruteforce (test_py3only.TestFancyFunc) ... ok
Na pytona 2, urządzenie moduł ~/pckg/tests/test_py2only.py
prawidłowo wykrywa sytuację i pomija test. Jednak otrzymujemy SyntaxError
z ~/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)
funkcję podobną do ~/pckg/tests/test_py3only.py:setup_module()
może rozwiązać ten problem, czy mogę dostać nose
uruchomić ten kod, zanim będzie doctest plugin nawet próbuje zaimportować ten moduł.
Wygląda jak moja Najprościej jest napisać odpowiedni skrypt testowy najwyższego poziomu, który obsługuje zbiór testów ...
moduł nie mogą być importowane bez X lub Y pachnie źle, to znaczy, na przykład, że ani '' pylint' pydoc' nie może być stosowany na kodzie. Zmiana modułu w czasie importu, ponieważ jest w fazie testowej, pokonuje cały punkt testowania, czyż nie? –
Mam zasadniczo dwa przypadki: brakujące _optional_ zewnętrznych zależności i moduły przy użyciu nowej składni Pythona 3, testowane w python 2. W obu przypadkach testowanie jest zasadniczo próżne, moduły są niedostępne. Chcę wyłączyć błędy testowe i może zastąpić je komunikatami, że jakaś część biblioteki jest niedostępna z powodu braku zależności. – burnpanck
'nosetests -v --with-doctest pckg' pozwalasz Pythonowi 2 zobaczyć kod Pythona 3, ponieważ uruchamiasz' --with-doctest' z górnego katalogu. Uruchom testy zarówno unittest, jak i doctest z folderu 'tests'. Aby doctest powiodło się, wyodrębnij go do zwykłego pliku tekstowego, tak jak zrobiłem to, abyś mógł warunkowo zaimportować. –