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

时间:2012-10-19 20:29:08

标签: python django unit-testing 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)

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

我还有其他一些测试工作,但我只是不知道如何调试它。

怎么做?

6 个答案:

答案 0 :(得分:10)

您可以放入pdb并检查所有内容。

如果您正在使用nose,我相信您必须使用-s

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

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

答案 1 :(得分:9)

在pdb:

下运行测试
python -m pdb manage.py test yourapp

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

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

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

答案 2 :(得分:4)

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

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

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

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

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

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

答案 3 :(得分:0)

一个人可以将Eclipse IDE与Pydev一起使用,创建一个Debug配置,其中Arguments是测试命令。像这样:

test  users.tests.selenium_tests.UsersTestCase.test_user_creation --keepdb --settings=project.settings.test_settings

enter image description here

然后,将Pydev调试器与断点配合使用,并逐步进行工作流,变量,表达式等。

文档在这里(http://www.pydev.org/manual_adv_debugger.html),但不涉及Django。

答案 4 :(得分:0)

如果您使用的是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
        }
    ]
}

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

答案 5 :(得分:0)

在pycharm中,您可以使用TestCase库在test.py中放置一个测试,然后突出显示该测试,然后rt单击以获取在调试模式下运行test.tests的选项。非常方便,可以在我的常规开发周期中进行单元测试。