2011-12-26 7 views
13

Próbuję osiągnąć 100% pokrycie podstawowego modułu python. Używam modułu coverage.py Neda Batcheldera do przetestowania go.Czy funkcja coverage.py mierzy definicje funkcji i klas?

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 

To są testy.

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

Oto, co otrzymałem raport o zasięgu.

 
    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 

Jak widać, wiersze 1-2 i 4 nie są objęte definicją. Pozostałe linie są wykonywane.

Odpowiedz

14

Myślę, że problem jest opisany w FAQ:

Q: Dlaczego ciała funkcji (lub klasach) pokazują, jak wykonana, ale linie def nie?

Dzieje się tak, ponieważ zasięg jest uruchamiany po zdefiniowaniu funkcji . Linie definicji są wykonywane bez pokrycia pomiarowego, następnie rozpoczyna się pokrycie, a następnie wywoływana jest funkcja. Oznacza to, że ciało jest mierzone, ale sama definicja funkcji nie jest.

Aby to naprawić, rozpocznij wcześniej pokrycie. Jeśli użyjesz linii komend do , uruchom program z zasięgiem, wtedy cały twój program będzie monitorowany . Jeśli używasz interfejsu API, musisz wywołać funkcję coverage.start() przed zaimportowaniem modułów definiujących twoje funkcje.

+0

! Dzięki za pomoc. Zadziałało. – praveen

4

następującą odpowiedź jcollado za:

mam ten problem z Django nose która obejmuje tylko linie wykorzystywane przez testy.

Dla poprawienia uruchamiam najpierw manage.py z pokryciem i po uruchomieniu testów. .coverage plik będzie zawierać oba raporty.

Moje pierwsze polecenie to a custom, które drukuje moje ustawienia projektu. Przykład:

coverage run ./manage.py settings && ./manage.py test myapp 
Powiązane problemy