How to move Python doctest examples into another unit test framework?
I documenti sono nella forma:
def testable_func():
"""
>>> testable_func()
'foo'
"""
E le unittests, usando il modulo di unittest incorporato, sono nella forma:
def test_testable_func(self):
self.assertEquals(testable_func(), 'foo')
C'è una sezione nella documentazione su riutilizzo del vecchio codice di test che dice:
In some cases, the existing tests may have been written using the
doctest module. If so, doctest provides a DocTestSuite class that can
automatically build unittest.TestSuite instances from the existing
doctest-based tests.
Ma questo esegue solo i doctest come unittests. Non crea un'impalcatura di codice unittest pre-scritto. Se vuoi lasciare i tuoi doctest al loro posto, puoi usarli per eseguirli insieme ad altri unittests.
Mantenimento dei doctest
Puoi usare i documenti preesistenti, se vuoi mantenerli così come sono, con il modulo unittest, ( consultare la documentazione ), è sufficiente plopare questa funzione dove si eseguono le unittests. Ovviamente dovrai importare il modulo in cui sono presenti i doct:
import my_module_with_doctests
def load_tests(loader, tests, ignore):
tests.addTests(doctest.DocTestSuite(my_module_with_doctests))
return tests
Puoi omettere l'argomento my_module_with_doctests
se gli oggetti o le funzioni con doctest vengono importati nel modulo test (questo dovrebbe essere codice di lavoro "taglia e incolla", incollalo nel modulo test):
def load_tests(loader, tests, ignore):
tests.addTests(doctest.DocTestSuite())
return tests
Spostamento dei doctest in unittests
Ma penso, perché stai chiedendo di "trasferirli", vuoi migrare i tuoi doctest per essere usati come unittests.
Ti consiglio vivamente di eseguire la conversione manualmente per assicurarti che le tue ipotesi riguardo ai doctest siano corrette, prendendo appunti sui test che desideri aggiungere in futuro, se ne pensi, in modo da avere un one-to- una conversione e in grado di appianare eventuali bug con modifiche minime. Puoi scegliere di lasciare i doctest come documentazione utile all'utilizzo.
Dopo esserti assicurato di avere una conversione uno a uno dei test, quindi tornare alle note / commenti e aggiungere ulteriori test.
Se devi impalcatura:
Se devi creare uno scaffolding (forse il tempo assegnato è troppo piccolo per la conversione manuale) puoi scorrere su oggetti e / o funzioni, guardare i loro attributi __doc__
, assegnarli a
example_list = doctest.DocTestParser().get_examples(a__doc__)
E per ogni esempio nella lista, inserire nella richiesta assertEquals ogni attributo ' source
e want
. Tale modello potrebbe apparire come questo:
'self.assertEquals({0}, {1})'.format(x.source, x.want)
Conclusione:
In futuro, sii consapevole dei doctest come un modo per fornire un'eccellente documentazione, ma non possono sostituire la scalabilità degli unittests.