2011-12-26 9 views
13

Sto cercando di ottenere una copertura del 100% per un modulo Python di base. Uso il modulo coverage.py di Ned Batchelder per testarlo.coverage.py misura la funzione e le definizioni di classe?

1 class account(object): 
2 def __init__(self, initial_balance=0): 
3  self.balance = initial_balance 
4 def add_one(self): 
5 self.balance = self.balance + 1 

Questi sono i test.

class TestAccount(unittest.TestCase): 
    def test_create_edit_account(self): 
    a = account1.account() 
    a.add_one() 

Ecco il report di copertura che ottengo.

 
    COVERAGE REPORT = 
    Name     Stmts Miss Cover Missing 
    ----------------------------------------------------- 
    __init__     1  1  0% 1 
    account1     5  3 40% 1-2, 4 
    account2     7  7  0% 1-7 

Come si vede, le linee 1-2 e 4 non sono coperte che sono i defintions. Il resto delle righe sono eseguite.

risposta

14

Credo che il problema è descritto nella FAQ:

D: Perché i corpi di funzioni (o classi) mostrano come eseguito, ma le linee Def non lo faccio?

Questo accade perché la copertura viene avviata dopo che le funzioni sono state definite . Le linee di definizione vengono eseguite senza misurazione , quindi viene avviata la copertura, quindi viene richiamata la funzione. Ciò significa che il corpo è misurato, ma la definizione della funzione non lo è.

Per risolvere questo problema, avviare la copertura in precedenza. Se si utilizza la riga di comando per eseguire il programma con copertura, quindi l'intero programma sarà monitorato . Se si utilizza l'API, è necessario chiamare coverage.start() prima di importare i moduli che definiscono le proprie funzioni.

+0

! Grazie per l'aiuto. Ha funzionato. – praveen

4

seguito la risposta di jcollado:

ho questo problema con Django nose che copre solo le linee utilizzate dai test.

Per risolvere il problema, lancio prima il numero manage.py con la copertura e dopo il lancio dei test. Il file .coverage conterrà entrambi i report.

Il mio primo comando è a custom che stampa le impostazioni del mio progetto. Esempio:

coverage run ./manage.py settings && ./manage.py test myapp 
Problemi correlati