views.py中的Django函数定义未在coverage中显示?

时间:2016-03-29 12:51:17

标签: python django python-coverage

我正在使用以下方式测试我的django应用程序:

 DJANGO_SETTINGS_MODULE=$(SETTINGS) coverage run manage.py test -v 2
 DJANGO_SETTINGS_MODULE=$(SETTINGS) coverage report

在我的测试套件中,我测试了一些视图:

class TestJSON(TestCase):

    def setUp(self):
        self.client.login(username='admin', password='passwordz')

    def test_bookmarks_json(self):
        translator = User.objects.create_user('normaluser', 'foobar@test.com',
                                              'secretz')
        search = SearchBookmark(
            search="minutes")
        search.save()
        response = self.client.get('/bookmarks_json/')
        ans = json.loads(response.content)[0]
        self.assertEqual(...)

所以我明显要点击'/bookmarks_json/'视图中定义的所有内容。从来没有coverage report表示签名行没有被击中,例如:

@login_required
def bookmarks_as_json(request):
    bookmarks = SearchBookmark.objects.all()
    data = serializers.serialize("json", bookmarks)
    return HttpResponse(data, content_type='application/json')

我已经看到Ned Batchelder在这里Django coverage test for URLs 0%, why?的解决方案,我猜它是如何相关的。 结果我写了自己的测试运行器:

import os
import sys
import django
from django.conf import settings
from django.test.utils import get_runner

if __name__ == "__main__":
    os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings.dev'
    django.setup()
    TestRunner = get_runner(settings)
    test_runner = TestRunner(verbosity=2)
    failures = test_runner.run_tests(["myapp.tests"])
    sys.exit(bool(failures))

并且

   python testrunner.py   # works, def in view.py is reported !

但是,我想使用普通命令./manage.py test,所以我想知道是否有办法解决这个问题,而不是编写我自己的测试运行器。

1 个答案:

答案 0 :(得分:0)

您的测试的真正问题似乎是您在测试视图之前没有登录。由于视图使用login_required装饰器,因此客户端被重定向,视图不会运行,因此它将在覆盖率报告中显示为缺失。

您可以在self.client.login()来电之前使用self.client.get()登录。

translator = User.objects.create_user('normaluser', 'foobar@test.com',
                                      'secretz')
search = SearchBookmark(
    search="minutes")
search.save()
self.client.login(username='normaluser', password='secretz')
response = self.client.get('/bookmarks_json/')
ans = json.loads(response.content)[0]