如何调试我的测试?例如,我通过 POST 创建一个条目并期望它验证并返回特定页面。它可以在浏览器和 shell 中工作,但测试是唯一失败的事情(讽刺的是!)。我想打印对控制台的响应或其他东西,这样我就可以读取错误或你有什么。但我只能看到我
print
中的东西,例如视图。
不确定是否有必要,但这是来自
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)
最终的断言是不正确的。如果我将其更改为原始表单页面中显示“需要字段”错误的值,则它会通过。我只是看不到我错过了什么。
我还有一些其他测试正在运行,但我只是不知道如何调试它。
它是如何完成的?
在 Django 中调试失败的测试与调试任何其他 Python 代码非常相似。手头上的关键工具是
pdb
模块(Python 调试器)
和
测试客户端提供的断言方法
。以下是如何执行此操作:
-
使用
pdb
设置断点: -
在你的测试方法中,在你想要检查代码的地方导入
pdb
并插入pdb.set_trace()
。
```python import pdb
class MyTests(TestCase): def test_my_view(self): # ... 你的测试代码 ...
pdb.set_trace() # 将在断点处暂停执行
resp = self.client.post('/meal/invite/',
{'summary': 'Test munch', 'when': now(), 'max_diners': '1', 'description': 'Munchies'}, follow=True)
# ... 你的断言 ...
```
-
当你运行你的测试时,执行将在
pdb.set_trace()
行暂停。 -
使用
pdb
命令检查你的代码:
一旦你处于
pdb
提示符中,你可以使用这些命令:
*
p <expression>
:
打印表达式的值。例如,
p resp.content
将显示响应的 HTML 内容。
*
n
:
执行下一行代码。
*
s
:
进入函数调用(如果当前行是一个函数调用)。
*
c
:
继续执行,直到遇到下一个断点或测试结束。
*
l
:
显示当前代码上下文。
*
q
:
退出调试器。
- 使用断言方法:
Django 的测试客户端提供了一些额外的断言方法,这些方法在你调试响应时非常有用:
-
assertTemplateUsed(response, template_name)
: 断言视图使用了特定的模板。 -
assertRedirects(response, expected_url)
: 断言响应被重定向到特定的 URL。 -
assertFormError(response, form_name, field_name, errors)
: 断言表单中存在特定的错误。
使用这些断言方法可以帮助你缩小错误的范围,并验证你的视图是否按预期运行。
适用于你的情况:
在你的情况下,看起来表单验证可能出现问题。尝试将
pdb.set_trace()
放在你进行 POST 请求的行之前,并检查以下内容:
-
self.client.post()
的响应: 检查resp.status_code
是否为预期值(200
表示成功,201
表示创建)。如果它是像302
这样的重定向,则表单可能未被验证,并且你正在被重定向回表单页面。打印resp.content
以查看返回的实际 HTML,并查看是否与预期相符。 -
表单数据:
使用
p request.POST
来确保你的表单数据被正确发送到视图中。 - 表单验证逻辑: 如果你的视图中包含自定义表单验证逻辑,请逐步执行它以确保其按预期工作。
通过使用
pdb
和 Django 的测试客户端断言,你可以全面了解你的测试失败的原因,并有效地调试你的 Django 代码。