attualmente hanno un progetto configurato per eseguire la copertura tramite il comando gestore di Django in questo modo:Come testare una copertura correttamente con Django + Nose
Questo si traduce in un rapporto come il seguente:
Name Stmts Miss Branch BrMiss Cover Missing
--------------------------------------------------------------------------
notify.decorators 4 1 0 0 75% 4
notify.handlers 6 1 2 0 88% 11
notify.notification_types 46 39 2 0 19% 8-55, 59, 62, 66
notify.notifications 51 51 0 0 0% 11-141
--------------------------------------------------------------------------
TOTAL 107 92 4 0 17%
Tuttavia, c'è un problema con questo rapporto. È sbagliato. La copertura segna le linee mancanti, nonostante siano effettivamente coperte da test.
Name Stmts Miss Branch BrMiss Cover Missing
-----------------------------------------------------------------------------
notify.decorators 4 0 0 0 100%
notify.handlers 6 0 2 0 100%
notify.notification_types 46 0 2 0 100%
notify.notifications 51 25 0 0 51% 13, 18, 23, 28, 33, 38, 43, 48, 53, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 116, 121, 126, 131, 136, 141
-----------------------------------------------------------------------------
TOTAL 107 25 4 0 77%
Google mi ha portato a FAQ del sito web di copertura, http://nedbatchelder.com/code/coverage/faq.html
D:: Per esempio, se si esegue il test tramite
nosetests
invece di Django del comando ottengo il seguente corretto rapporto gestire Perché la corpi di funzioni (o classi) mostrano come eseguiti, ma le linee di def non lo fanno?Ciò accade perché la copertura viene avviata dopo la definizione delle funzioni. Le linee di definizione vengono eseguite senza misurazione della copertura, quindi viene avviata la copertura, quindi viene richiamata la funzione. Ciò significa che il corpo è misurato, ma la definizione della funzione stessa non lo è.
Per risolvere questo problema, avviare la copertura in precedenza. Se si utilizza la riga di comando per eseguire il programma con copertura, verrà monitorato l'intero programma. Se si utilizza l'API, è necessario chiamare coverage.start() prima di importare i moduli che definiscono le proprie funzioni.
La domanda è: posso eseguire correttamente i rapporti di copertura tramite il comando di gestione di Django? O devo bypassare gestire per evitare la situazione in cui viene avviata la copertura dopo l'esecuzione delle linee "mancanti"?
Questa è la soluzione più comoda (anche se hacky) e funziona perfettamente e in modo trasparente con il naso django – danigosa