django 测试 url 状态码

Mar*_*Mar 5 python testing django

你好,我为我的项目创建了一些测试,主要是为了丰富我的知识。

我有一些问题。

简单的测试代码:

测试文件

from django.test import Client, TestCase
class User_Form_Test(TestCase):
    def test_logged_user_get_details(self):
        response = self.client.get('/details/', follow=True)
        self.assertEqual(response.status_code, 200)

    def test_logged_user_get_details_images(self):
        response = self.client.get('/details-images/', follow=True)
        self.assertEqual(response.status_code, 200)
Run Code Online (Sandbox Code Playgroud)

网址.py

url(r'^details/(?P<id>\d+)/$', views.details, name='details'),
url(r'^details-images/(?P<slug>[^\.]+)/$', views.details_images, name='details_images')
Run Code Online (Sandbox Code Playgroud)

所有这些代码工作正常我在这两个测试中传递了消息。

我的问题是如何像这个例子一样测试id第一种情况下所有可能的正则表达式slug,第二种情况下的第二个自动化?

Vai*_*hal 5

首先使用path()和re_path(),我认为url()已经贬值甚至被删除了。
查看您的正则表达式模式看起来像是您已制作idslug可选的,这没有多大意义,但没关系。
现在您想要检查idand的所有可能的正则表达式slug,但可能的匹配总数是无限的,因为任何数字都会匹配id,任何内容都会匹配slug,所以这是不可能的。
我认为对于您视图中的第一个案例,您将在数据库中查找一个对象id,然后在您呈现的页面上显示有关它的详细信息。因此,在 setUp() 方法中,您应该创建模型的一些对象,例如:

def setUp(self):
    MyModel.objects.create(id=1)
    MyModel.objects.create(id=5)
    ...
Run Code Online (Sandbox Code Playgroud)

现在在您的测试中检查这些 id:

def test_logged_user_get_details(self):
    response = self.client.get(reverse('details', args=(1,)), follow=True)    # for first object
    self.assertEqual(response.status_code, 200)
    response = self.client.get(reverse('details', args=(5,)), follow=True)    # for second object
    self.assertEqual(response.status_code, 200)
Run Code Online (Sandbox Code Playgroud)

还要检查是否存在不存在的 id:

response = self.client.get(reverse('details', args=(2,)), follow=True)    # for object that doesn't exists
self.assertEqual(response.status_code, 404)
Run Code Online (Sandbox Code Playgroud)

由于测试名称表明只有登录的用户才能访问给定的网页,因此您的设置应该包含此内容(假设您正在使用 django 的身份验证):

self.user = User.objects.create_user('test', 'test@email.com', 'testtest')
Run Code Online (Sandbox Code Playgroud)

然后在每个需要登录的测试中,首先执行以下操作:

self.client.force_login(self.user)
Run Code Online (Sandbox Code Playgroud)

正如您在问题中所说,您想要检查所有可能的正则表达式匹配,这是不可能的,但出于某种原因,如果您想检查很多id,或者slug可以使用循环:

for i in range(1,n):    # define n
    response = self.client.get(reverse('details', args=(i,)), follow=True)
    self.assertEqual(response.status_code, 200)
Run Code Online (Sandbox Code Playgroud)

对我来说,做这样的事情没有任何意义,但由于我不完全了解你的应用程序是如何工作的,它可能对你有一些用处。