【问题标题】:How to get status code using requests library while tesing in Django在 Django 中测试时如何使用请求库获取状态代码
【发布时间】:2015-11-07 17:21:34
【问题描述】:

我正在为我的 Django 应用程序编写测试用例,但我在 Python 中使用 requests 包来访问状态代码,然后使用 assert 语句。此测试用例仅适用于员工用户:

class StaffClientServerTestCase(TestCase):

    def test_login_staff(self):
        User.objects.create_superuser('abc', 'abc@gmail.com', '1234')
        self.client.login(username='abc', password='1234')
        self.client.get('/dashboard/')
        s = requests.get('http://localhost:8000/dashboard/')
        print s.status_code
        self.assertEqual(200, s.status_code)

只有员工用户可以访问仪表板,所以我创建了一个员工用户对象。下面一行

self.client.login(username='abc', password='1234') 即将成为现实。 self.client.get('/dashboard/') 如果我打印出这一行,它会显示页面的 html 内容,这意味着我的员工用户可以访问 dashboard。

但是当我使用请求模块查看dashboard url 的状态码时,它显示status code = 500,我的测试失败了。

s = requests.get('http://localhost:8000/dashboard/') print s.status_code

谁能告诉我这里哪里出错了?为什么我的状态码显示为 500,即使员工用户可以访问仪表板并使用 print self.client.get('/dashboard/') 打印出其内容。救命!

【问题讨论】:

  • 您应该将身份验证凭据指定为requests.get,或者在您的测试中根本不使用requests.get 并测试self.client,因为您使用self.client 方法登录,而requests.get 是另一回事使用self.client 登录并不意味着您随后将通过身份验证以使用另一个库执行其他操作(例如此处的requests)。仔细想想你应该测试什么,然后测试一下。如果您只是未通过身份验证,那么 HTTP 500 也不是正确的状态代码,因此您应该修复仪表板。
  • 知道如何获取状态码吗?我需要通过状态码测试。
  • 我已禁用我的管理页面,这就是为什么我得到状态码 500。
  • self.client.get('/dashboard/') 只返回内容,为什么还要用状态码进行测试?要么停止使用状态码进行测试,要么更改 self.client.get('/dashboard/') 以返回状态码和内容。
  • 其实client get()返回一个完整的状态码响应,这里根本不需要使用requests。

标签: python django python-requests django-testing django-tests


【解决方案1】:

您可以通过其他方式测试案例:

使用装饰器保护您的视图:

@user_passes_test(lambda u: u.is_staff)
def dashboard(request, ...):
    # ...

然后通过requests 请求查看您是否被禁止查看该页面。如果您被禁止(403 禁止),那么您的视图工作正常。要验证您的视图是否对员工用户正常工作,请删除装饰器并再次请求,如果您通过这次,那么一切都很好,唯一要测试的是视图内部的逻辑。

但是现在,您得到的是 500 而不是 403,这意味着您有后端错误。先修复它们

【讨论】:

  • 我已禁用我的管理页面,这就是我收到 500 错误的原因。否则一切都很好
猜你喜欢
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 2016-08-06
  • 2014-07-17
  • 1970-01-01
相关资源
最近更新 更多