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"?

questionAnswers(5)

yourAnswerToTheQuestion