如何调试Django中失败的测试?

2024-06-16 11:48:35 发布

您现在位置:Python中文网/ 问答频道 /正文

如何调试测试?例如,我发布一个条目,希望它验证并返回一个特定的页面。它可以在浏览器和shell中工作,但测试是唯一失败的(讽刺的是!)。我想把响应打印到控制台或其他东西上,这样我就可以读取错误或您的错误。但我只能看到我在视图中看到的东西。

不确定是否有必要,但这里有来自tests.py的测试代码:

    resp = self.client.post('/meal/invite/', 
        {'summary': 'Test munch', 'when': now(), 'max_diners': '1', 'description': 'Munchies'}, follow=True)
    self.assertEqual(resp.status_code, 200)
    self.assertContains(resp, 'Test munch', 1)
    self.assertContains(resp, 'You are hosting this meal', 1)

最后的断言是不正确的。如果我将其更改为显示“field required”错误的原始表单页中的值,则它将通过。我只是看不到我错过了什么。

我还有一些其他的测试,但是我不知道如何调试。

怎么做的?


Tags: pytestself视图错误浏览器tests条目
3条回答

你可以加入一个pdb检查所有的东西。

如果您使用的是nose,我相信您必须使用-s运行测试

 -s, --nocapture       Don't capture stdout (any stdout output will be
                        printed immediately) [NOSE_NOCAPTURE]

这就是使您无法立即看到输出的原因。

最简单的方法是在断言之前添加print response.content。输出可能有点过大,但通常足以让您发现问题所在。

如果这不能解决问题,文档中列出了大量的功能,可以提供帮助。添加一些打印语句,看看你得到了什么。这里有一些建议,但不要局限于这些,文档中有更多的工具。

https://docs.djangoproject.com/en/dev/topics/testing/

首先,您需要检查页面是否按您预期的方式实际重定向。尝试使用redirect_chainassertRedirects

我怀疑你的帖子数据出于某种原因无效。您可以从响应上下文中获取表单。

form = response.context['form']
print form.is_valid()
print form.errors

要在pdb下运行测试:

python -m pdb manage.py test yourapp

我同意阿拉斯代尔的观点,print response.content(以及一般的打印内容)是一个很好的帮助。输出会与正常的测试运行器输出混淆,一旦发现问题并修复它,就应该将其删除,但它可以帮助您缩小问题的范围。

另外,如果代码在浏览器和shell中工作,而不是在单元测试中,请记住单元测试会生成一个新的(空的)数据库。确保安装程序输入测试所需的任何数据。

(更新了帕特里克建议的代码部分,谢谢帕特里克)

相关问题 更多 >