Django覆盖率测试URL为0%,为什么?

3
使用Django Nose。我已经为我的URL编写了测试,但是覆盖率仍然显示URL的0%,为什么? python manage.py test profiles
这是我的覆盖率结果:
Name                               Stmts   Miss  Cover   Missing
----------------------------------------------------------------
profiles                               0      0   100%
profiles.migrations                    0      0   100%
profiles.migrations.0001_initial       6      0   100%
profiles.models                        0      0   100%
profiles.urls                          4      4     0%   1-9
----------------------------------------------------------------
TOTAL                                 10      4    60%
----------------------------------------------------------------

这是我的URL测试之一... url_tests.py
import nose.tools as noz
from django.test import TestCase
from django.core.urlresolvers import resolve, reverse

class URLsTest(TestCase):

    def test_user_list(self):
        url = reverse('api_user_list', args=[])
        noz.assert_equal(url, '/api/user/')

看不到更多你的代码库,我不确定我能否提供帮助;但是我可以确认,将我的一个项目(使用Django 1.6)转移到使用django-nose,并运行 python manage.py test --with-coverage 和对URL进行测试的结果,在urls.py中会得到正确的覆盖率报告; 所以这似乎与你的代码/用法特别相关。 - James Aylett
1个回答

2

通常这与coverage.py在进程中启动得太晚有关。确保它足够早地启动的最简单方法是在coverage下运行测试运行程序:

$ coverage run nosetests.py ....

urls.py的一个相关细节:它只包含在导入时执行的代码。因此,当Django启动并导入urls.py时,整个文件会被执行。这与大多数文件不同,大多数文件定义的是稍后执行其函数或类的主体。


我正在使用Django Nose。然而,为什么其他测试都可以通过而这个测试不行呢?无论顺序如何,它都应该报告一些东西,除非我在测试URL时做错了什么。 - Prometheus
覆盖率只能测量在覆盖率启动后执行的代码。如果 Django Nose 在启动 coverage.py 之前导入(并因此执行)urls.py,则您将看到 urls.py 报告为0%。 - Ned Batchelder
你尝试过按照我在答案中展示的方式在覆盖率下运行测试吗? - Ned Batchelder
@Sputnik,你的测试显示你的urls.py已被导入和处理,但并没有直接执行urls.py中的任何代码...正如Ned所说,很可能Django在测试运行器开始测量覆盖率之前已经处理了你的urls.py。 - Anentropic
@NedBatchelder 我已经安装了覆盖率,但是命令却无法使用。 - Prometheus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接