0

次の方法でカバレッジを使用して、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')

URL 0% の Django カバレッジ テストで、Ned Batchelder によるソリューションを見てきました。なぜですか? 私はそれがどのように関連していると推測しています。その結果、私は自分のテストランナーを書きました:

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ので、独自のテストランナーを作成せずにこれを修正する方法があるかどうか疑問に思っていました.

4

1 に答える 1

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]
于 2016-03-29T13:24:47.457 に答える