5.2.7 Avvertenze

  1. doctest è esigente nel richiedere un'esatta corrispondenza nell'output atteso. Se anche solo un singolo carattere non è corretto, il test fallisce. Questo potrebbe qualche volta sorprendervi, mentre imparate che cosa Python garantisce e cosa no circa l'output. Per esempio, stampando un dizionario, Python non garantisce che una coppia chiave-valore sia stampata in un ordine particolare, così un test come:

    >>> foo()
    {"Hermione": "hippogryph", "Harry": "broomstick"}
    >>>
    

    è vulnerabile! Invece, la soluzione giusta è

    >>> foo() == {"Hermione": "hippogryph", "Harry": "broomstick"}
    True
    >>>
    

    Un altro metodo è

    >>> d = foo().items()
    >>> d.sort()
    >>> d
    [('Harry', 'broomstick'), ('Hermione', 'hippogryph')]
    

    Ci sono ancora altri metodi ma ormai vi sarete fatti un'idea.

    Un'altra cattiva idea è quella di stampare cose che incorporano un indirizzo di un oggetto, come per esempio

    >>> id(1.0) # alcune volte potrà fallire
    7948648
    >>>
    

    I numeri in virgola mobile sono inoltre soggetti a piccole variazioni di output in piattaforme diverse, perché Python differisce dalle librerie C relativamente alla formattazione in virgola mobile e le stesse librerie C differiscono ampiamente in qualità riguardo a questo argomento.

    >>> 1./7  # rischiosa
    0.14285714285714285
    >>> print 1./7 # sicura
    0.142857142857
    >>> print round(1./7, 6) # molto sicura
    0.142857
    

    I numeri nella forma I/2.**J sono sicuri per tutte le piattaforme e spesso faccio in modo che gli esempi di doctest producano numeri in quella forma.

    >>> 3./4  # totalmente sicuro
    0.75
    

    Inoltre le frazioni semplici sono più facili da capire e sono quindi più indicate per la documentazione.

  2. Fate attenzione se avete del codice da eseguire una sola volta.

    Se avete codice a livello di modulo che deve essere eseguito una sola volta, una definizione molto semplice di _test() è

    def _test():
        import doctest, sys
        doctest.testmod()
    

  3. Iniziando con Python 2.3, non sempre ciò che si vede corrisponde a quello che otterremo (WYSIWYG). In Python 2.3, la stringa booleana '0' e '1' risulterà essere 'False' e 'True'. Di conseguenza risulterà goffo scrivere una doctest che visualizzi risultati booleani che superino le molte versioni di Python. In Python 2.3, in modo predefinito e come caso speciale, se un blocco di output previsto consiste esclusivamente di '0' ed il blocco di output attuale consiste solamente di 'False', il tutto verrà accettato come una corrispondenza esatta e nello stesso modo anche per '1' nei confronti di 'True'. Questo comportamento può essere eliminato passando come argomento opzionale optionflags di testmod() la costante DONT_ACCEPT_TRUE_FOR_1 del nuovo modulo (in 2.3). Fra alcuni anni, quando la rappresentazione dei boleani con interi sarà storia, questa forzatura verrà probabilmente di nuovo rimossa.

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.