Come spostare gli esempi di doctest Python in un altro framework di test unitario?

5

Anni fa AFAIK il matematico e sviluppatore di software Tim Peters ha scoperto che molto spesso la documentazione delle API tende a non essere aggiornata nel tempo durante il ciclo di vita del software, perché i commenti che documentano l'API vengono spesso trascurati quando vengono aggiunte funzionalità o le firme di chiamata di funzioni o metodi cambiano.

Per risolvere questo problema ha inventato il modulo doctest che introduce un po '" documentation eseguable " o " literate testing " (vedi anche: la documentazione doctest ).

Come già sottolineato altrove , mettendo un'enorme quantità di test unitari nelle stringhe doc di tutti i moduli, funzioni, classi e metodi Python ingombrerebbe troppo la documentazione dell'API.

Quindi sto cercando un modo elegante e intelligente per spostare i casi di test che erano esempi di doctest in qualche altro posto in cui potevano ancora essere trovati da alcuni driver di esecuzione di test di unità.

    
posta pefu 18.12.2015 - 15:16
fonte

1 risposta

6

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.

    
risposta data 18.12.2015 - 16:43
fonte

Leggi altre domande sui tag