我正在通过以下方式使用覆盖率来测试我的 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%,为什么?我猜这有点相关。结果我写了我自己的测试运行器:
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
,所以我想知道是否有办法解决这个问题,而无需编写我自己的测试运行程序。