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.