Io uso il naso per la raccolta di test e voglio anche usare il suo plugin doctest. Ho un modulo che ha bisogno di un dispositivo per essere importuno. Pertanto, non posso utilizzare i dispositivi del modulo del naso, dal momento che sono caricati dal modulo sotto test. C'è un modo per specificare i dispositivi del modulo per nose-doctest al di fuori del modulo?fixture modulo nose-doctest prima che il modulo venga importato
Per alcuni casi d'uso, un'opzione potrebbe essere quella di rilevare l'esecuzione sotto doctest e l'applicazione del dispositivo all'inizio del modulo. Sarei interessato anche a sentire le risposte per questo caso d'uso.
Tuttavia, ci sono situazioni in cui questo non funziona: quando l'importazione non riesce a causa di un SyntaxError
, non viene mai eseguito alcun codice modulo. Nel mio caso, sto principalmente sviluppando un codice che sia compatibile con python 2 e python 3 (senza 2to3
). Esistono tuttavia alcuni moduli specifici di python 3, che semplicemente non dovrebbero essere controllati del tutto dal naso, quando si esegue sotto python 2. Quale sarebbe la mia migliore opzione qui?
EDIT: MWE (per la situazione SyntaxError
)
Ho un pacchetto con molti piccoli moduli, alcuni di loro usano pitone 3 sintassi. Ecco la struttura del pacchetto:
~/pckg/
__init__.py
py3only.py
... (other modules)
tests/
test_py3only.py
Alcuni test sono scritti come unittest.TestCase
, ma voglio anche gli esempi di codice nelle docstring testati. ~/pckg/__init__.py
è vuoto.
~/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/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)
test su Python 3, tutto diventa testati e passa (eseguiti dalla racchiudendo cartella, ad esempio ~
):
~ nosetests3 -v --with-doctest pckg
Doctest: pckg.py3only.fancy_py3_func ... ok
test_bruteforce (test_py3only.TestFancyFunc) ... ok
il pitone 2, l'apparecchio modulo di ~/pckg/tests/test_py2only.py
rileva correttamente la situazione e salta il test. Tuttavia, otteniamo un SyntaxError
da ~/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)
una funzione simile a ~/pckg/tests/test_py3only.py:setup_module()
potrebbe risolvere il problema, se potessi ottenere nose
per eseguire il codice prima che sia doctest plug anche tenta di importare quel modulo.
Sembra che la mia scommessa migliore è quello di scrivere una vera e propria script di test di livello superiore che si occupa della raccolta delle prove ...
modulo non può essere importato senza X o Y cattivo odore, che significa, ad esempio, che né '' pydoc' né pylint' possono essere utilizzati sul vostro codice. Cambiare modulo al momento dell'importazione perché è in fase di test, sconfigge l'intero punto di test, vero? –
Ho essenzialmente due casi: le dipendenze esterne _optional_ mancanti e i moduli che usano la nuova sintassi python 3, testati sotto python 2. In entrambi i casi, il test è essenzialmente vano, i moduli non sono disponibili. Voglio sopprimere i fallimenti del test e magari sostituirli con messaggi, che alcune parti della libreria non sono disponibili a causa di dipendenze mancanti. – burnpanck
'nosetests -v --with-doctest pckg' consente a Python 2 di vedere il codice Python 3 perché si esegue' --with-doctest' dalla directory principale. Esegui i test sia unittest che doctest dalla cartella 'tests'. Perché doctest riesca a estrarlo in un file di testo normale come ho fatto in modo che tu possa importare condizionalmente. –