gpt4 book ai didi

python - 确保所有 Django View 返回 200?

转载 作者:太空狗 更新时间:2023-10-30 01:23:04 24 4
gpt4 key购买 nike

我有很多看起来像这样的简单 Django View :

@team_leader_required
def view_all_teams(request):
teams = Team.objects.all()

template_vars = {'toolbar': 'teams',
'teams': teams}
return render(request, "all_teams.html", template_vars)

我最终写了很多形式的单元测试:

def test_view_all_teams_renders(self):
user = self.create_team_leader()
self.log_in(user)

response = self.client.get(reverse('all_teams'))
self.assertHttp200(response)

尽管我使用了方便的方法来创建用户(例如 .create_team_leader)和各种方便的断言(例如 .assertHttp200),但我的代码中仍然有很多重复测试。

(我的测试很简单,因为我看不到任何其他有用的东西来断言这些 View ——即使重命名模板,TestCase.assertTemplateUsed 也会中断,即使 View 是正确的。)

很容易错过测试,这让我在重命名模板时信心不足。有什么办法可以自动生成测试用例吗?类似(伪代码)的东西:

for every view in urls:
if view doesn't take extra arguments:
test that view returns 200 when a logged in superuser does a GET

编辑

这是我的 urls.py 中的一个代表性片段:

urlpatterns = patterns('',
url(r'^teams/$', 'teams.views.view_all_teams', name='all_teams'),
url(r'^teams/major/$', 'teams.views.view_major_teams', name='major_teams'),
url(r'^teams/minor/$', 'teams.views.view_minor_teams', name='minor_teams'),
url(r'^teams/(?P<team_id>\d+)/$', 'teams.views.view_team', name='view_team'),
url(r'^teams/(?P<team_id>\d+)/edit$', 'teams.views.edit_team', name='edit_team'),
url(r'^teams/(?P<team_id>\d+)/delete$', 'teams.views.delete_team', name='delete_team'),

我想自动测试此列表中的前三个 View 。

最佳答案

from django.core import urlresolvers
from django.test import TestCase


class SimpleTest(TestCase):
def test_simple_views(self):
url_names = [
'all_teams',
'major_teams',
'minor_teams',
'view_team',
'edit_team',
]

user = self.create_team_leader()
self.log_in(user)

for url_name in url_names:
try:
url = urlresolvers.reverse(url_name, args=(), kwargs={})
except urlresolvers.NoReverseMatch:
#print('Pass {}'.format(url_name))
continue

#print('Try {}'.format(url_name))
response = self.client.get(url)
self.assertHttp200(response)

如果所有的 url 模式都有它们的名字,你可以使用下面的代码来定义 url_names:

url_names = [p.name for p in teams.urls.urlpatterns]

已知问题

  • 如果 View 函数失败,您将不知道是哪个 View 失败了。
  • 不会测试失败 View 旁边的 View 。

处理上述问题的另一个版本。

import unittest

from django.core import urlresolvers
from django.test import TestCase

from teams.urls import urlpatterns


class SimpleTest(TestCase):
...

def setUp(self):
user = self.create_team_leader()
self.log_in(user)

url_names = [p.name for p in urlpatterns]
vs = vars()
def make_test_function(idx, url_name, url):
def t(self):
response = self.client.get(url)
self.assertHttp200(response)
t.__name__ = 'test_' + idx
t.__doc__ = 'simple get test for ' + url_name
return t

for i, url_name in enumerate(url_names):
i = str(i)
try:
url = urlresolvers.reverse(url_name, args=(), kwargs={})
vs['test_' + i] = make_test_function(i, url_name, url)
except urlresolvers.NoReverseMatch as e:
vs['test_' + i] = unittest.skip(url_name + ' requires parameter(s) or view not found')(lambda: 0)

del url_names, vs, make_test_function,

关于python - 确保所有 Django View 返回 200?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17194542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com