测试django:意外的http状态代码的原因

时间:2014-07-01 11:12:46

标签: python django unit-testing httprequest

我们的django应用程序中有许多unitests。

但如果测试失败,因为状态代码不匹配:

Traceback (most recent call last):
  File "/home/foo_eins_di514/src/foo-time/foo_time/tests/EditTest.py", line 813, in test_web_entry_with_unclassified_activity
    self.assertEqual(200, response.status_code, url)
  File "/usr/lib64/python2.7/unittest/case.py", line 494, in assertEqual
    assertion_func(first, second, msg=msg)
  File "/usr/lib64/python2.7/unittest/case.py", line 487, in _baseAssertEqual
    raise self.failureException(msg)
AssertionError: /foo_eins_di514/modtime/calendar/entry/view/172/

....如果创建了错误的退出状态,则完全不知道。

我是大型应用程序,可能需要一些时间才能找到创建存在状态的问题的根源,因为退出状态也可以在中间件中创建。

任何提示如何使其更易于测试?

测试如下:

url=reverse(view_name, kwargs=dict(id=entry.id))
response=client.get(url)
self.assertEqual(200, response.status_code, url)

3 个答案:

答案 0 :(得分:4)

您将assertEqual中的有用消息替换为不太有用的消息,即失败的URL(第三个参数为assertEqual)。

您已完成此操作,因为相同的测试方法会测试多个网址。这是一种不好的做法。每种测试方法都应测试一件事。 DRY不适用于单元测试(或者至少更重要的是每个测试方法测试一件事,只测试一件事。)

假设你知道有问题的状态代码,那么从它所阻止的位置找到它会更加明显。说它是404,那么,也许找不到对象,也许它是300-something,也许你没有适当的权限并被重定向到登录页面。

任何真正的编程错误都会因正常异常和有用的堆栈跟踪而失败。

如果您关注特定视图中的逻辑,请将逻辑拆分为多个可测试单元。

在这种特殊情况下,我的钱可能是坏PK或缺少权限。

关于你的模仿,尝试类似:

with patch.object(HttpResponseBase, '__init__', None):
    response = client.get(url)

答案 1 :(得分:4)

听起来你应该将测试分成适当的单元测试并测试较小的代码单元。使用Django的request factory并仅测试视图代码。或者将您的视图拆分为较小的功能并单独测试它们。

使用Django的测试客户端更像是集成测试而不是单元测试,因为它测试URL路由,数据库,中间件,模板等

答案 2 :(得分:2)

我用这个解决方案来找到问题:

import django
django.http.response.HttpResponseBase.__init__=None
response=client.get(url)

这会产生一个堆栈跟踪,在那里我可以看到HttpResponse的创建位置。

当然这只是一个临时的调试解决方案。我尝试了同样的模拟,但由于我不是一个模拟专家(但是)失败了。