2010-04-25 8 views
33

E 'possibile utilizzare il concetto doctest di Python per le classi, non solo le funzioni?Python: usando doctests per le classi

Se è così, Dove devo mettere i doctest - la classe docstring, o stringa di documentazione del costruttore?

Per chiarire, io sto cercando qualcosa di simile:

class Test: 
    """ 
    >>> a=Test(5) 
    >>> a.multiply_by_2() 
    10 
    """ 
    def __init__(self, number): 
     self._number=number 

    def multiply_by_2(self): 
     return self._number*2 

Grazie in anticipo,

Adam

+5

Come nota a margine, sempre ereditare da 'object' piuttosto che niente in modo che si sta utilizzando * nuovo classi di stile *. –

+9

Tranne in python 3, dove ci sono solo classi di nuovo stile, e 'object' è implicito senza genitori dichiarati. – Daenyth

risposta

23

Stai perdendo il codice a effettivamente eseguito i doctest alla fine del file:

class Test: 
    <snip> 

if __name__ == "__main__": 
    import doctest 
    doctest.testmod() 

quanto a dove mettere i test:

  • Se si tratta di testare la classe nel suo insieme, li avevo messo nella docstring di classe.
  • Se sta testando il costruttore, li inserirò nella docstring del costruttore.
  • Se si tratta di testare un metodo (come sembra essere in questo caso), mi piacerebbe davvero messo loro in docstring di quel metodo.
+1

+1 Grazie! Tuttavia, documentare un metodo mi sembra un po 'noioso, perché richiede l'inizializzazione di un oggetto per ogni doctest. –

+4

@Adam: se hai bisogno di test più sofisticati, usa il modulo unittest. doctest è principalmente inteso per testare le documentazioni, non testare il codice. –

5

Il modulo doctest cerca eventuali docstring in un file ed esegue alcun codice incorporato in esso, quindi sì, è possibile usare doctest per le classi.

Per quanto riguarda se sia meglio mettere i doctests nella docstring della classe o il costruttore, penso che dipende da cosa esattamente si sta documentare.

Se la docstring offre una panoramica generale della classe e come usarlo, allora penso che sia meglio mettere nella classe.

Se la docstring riguarda specificamente la modalità di creazione delle istanze della classe, è necessario passare al metodo __init__.

Ricordate l'intento di doctests è in primo luogo di avere il codice esempio autolegittimantesi nella documentazione, in modo IMHO l'aspetto documentazione dovrebbe avere la priorità rispetto all'aspetto test.

Edit:

Nel tuo esempio sopra non esiste un codice per eseguire il doctest - in esecuzione python test.py -v eseguirà il codice Python principale che solo definisce la classe.

È necessario aggiungere questo alla fine del file:

if __name__ == "__main__": 
    import doctest 
    doctest.testmod() 

In alternativa, se si sta utilizzando Python 2.6 o versione successiva eseguirlo con:

python -m doctest -v test.py 
+0

Grazie, ma perché il mio esempio non funziona? Ho provato 'python test.py -v' e non ho ottenuto nulla –

+1

@Adam Se ciò che hai postato è il file' test.py' completo, non hai fatto 'if __name__ ==" __main__ ": import doctest; doctest.testmod() '; se lo hai usato, nessun output significa nessun errore. :) – badp

+0

non se ha aggiunto -v –

47

Invece di istanziare l'oggetto in ogni metodo, si potrebbe fare qualcosa di simile:

class Test: 
    def multiply_by_2(self): 
     """ 
     >>> t.multiply_by_2() 
     10 
     """ 
     return self._number*2 

if __name__ == "__main__": 
    import doctest 
    doctest.testmod(extraglobs={'t': Test()}) 
+3

Non conoscevo la parola chiave extraglobs. Grazie! È enormemente utile. –

Problemi correlati