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

Kin*_*Guy 15 python testing django unit-testing

我如何调试我的测试?例如,我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)
Run Code Online (Sandbox Code Playgroud)

最后的断言是不正确的.如果我将其更改为原始表单页面中显示"字段必需"错误的值,则会通过.我只是看不到我错过的东西.

我有一些其他测试工作,但我只是不知道如何调试这个.

怎么做?

Peh*_*eje 12

如果您使用 vscode,您可以在 root/vscode/launch.json 文件中创建一个新配置,如下所示:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Django RUN",
            "type": "python",
            "request": "launch",
            "program": "${workspaceFolder}/manage.py",
            "args": [
                "runserver",
                "--noreload",
                "--nothreading"
            ],
            "django": true
        },
        {
            "name": "Django TEST",
            "type": "python",
            "request": "launch",
            "program": "${workspaceFolder}/manage.py",
            "args": [
                "test",
                "<your-app-name>",
            ],
            "django": true
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

这允许您在测试中放置断点并使用 vscode 进行调试。


dm0*_*514 10

你可以投入pdb并检查一切.

如果你正在使用nose我相信你必须运行你的测试-s

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

这使您无法立即看到输出.


Bre*_*ler 9

要在pdb下运行测试:

python -m pdb manage.py test yourapp
Run Code Online (Sandbox Code Playgroud)

我同意Alasdair的印刷响应.内容(以及一般的印刷品)是一个很好的帮助.输出与正常的测试运行器输出混合在一起,一旦找到问题并修复它就应该删除,但它可以帮助您缩小问题范围.

此外,如果代码在浏览器和shell中工作但不在单元测试中工作,请记住单元测试创​​建一个新的(空)数据库.确保您的setUp放入测试所需的任何数据.

(更新了Patrick的建议中的代码部分,感谢Patrick)


Ala*_*air 5

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

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

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

首先,您需要检查页面是否确实按照您的预期进行了重定向。尝试使用redirect_chainassertRedirects

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

form = response.context['form']
print form.is_valid()
print form.errors
Run Code Online (Sandbox Code Playgroud)

  • 我可以打印响应内容,但是我不知道在运行 Django 测试时将 stdout 重定向到哪里,所以我无法查看它。 (3认同)