Como testar a cobertura corretamente com o Django + Nose
Atualmente, tem um projeto configurado para executar a cobertura através do comando manage do Django, da seguinte forma:
./manage.py test --with-coverage --cover-package=notify --cover-branches --cover-inclusive --cover-erase
Isso resulta em um relatório como o seguinte:
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%
No entanto, há um problema com este relatório. Está errado. A cobertura está marcando as linhas ausentes, apesar de elas estarem realmente sendo cobertas por testes. Por exemplo, se eu executar os testes vianosetests
em vez do comando manage do django, recebo o seguinte relatório correto:
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%
O Google me levou às perguntas frequentes do site de cobertura,http://nedbatchelder.com/code/coverage/faq.html
P: Por que os corpos de funções (ou classes) aparecem como executados, mas as linhas de definição não?
Isso acontece porque a cobertura é iniciada após as funções serem definidas. As linhas de definição são executadas sem medição da cobertura, a cobertura é iniciada e a função é chamada. Isso significa que o corpo é medido, mas a definição da função em si não é.
Para corrigir isso, inicie a cobertura mais cedo. Se você usar a linha de comando para executar seu programa com cobertura, todo o seu programa será monitorado. Se você estiver usando a API, precisará chamar o license.start () antes de importar os módulos que definem suas funções.
A questão é: posso executar os relatórios de cobertura corretamente através do comando manage do Django? Ou tenho que ignorar o gerenciador para evitar a situação em que a cobertura é iniciada após a execução das linhas "ausentes"?