22

如何调试我的测试?例如,我 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)

最后的断言是错误的。如果我将其更改为显示“必填字段”错误的原始表单页面中存在的值,它就会通过。我只是看不到我错过了什么。

我还有其他一些测试正在运行,但我只是不知道如何调试它。

它是如何完成的?

4

6 回答 6

12

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

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

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

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

于 2012-10-19T20:35:22.943 回答
11

在 pdb 下运行测试:

python -m pdb manage.py test yourapp

我同意 Alasdair 的观点,打印 response.content(以及一般的打印内容)是一个很大的帮助。输出与正常的测试运行程序输出混淆,一旦发现问题并修复它就应该删除,但它可以帮助你缩小问题范围。

此外,如果代码在浏览器和 shell 中有效,但在单元测试中无效,请记住单元测试会创建一个新的(空的)数据库。确保您的设置放入测试所需的任何数据。

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

于 2013-06-14T03:27:47.930 回答
6

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

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

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

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

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

form = response.context['form']
print form.is_valid()
print form.errors
于 2012-10-20T12:30:37.223 回答
4

如果您使用的是 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 进行调试。

于 2019-05-19T10:47:18.097 回答
0

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

于 2020-07-08T19:29:44.640 回答
0

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

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

在此处输入图像描述

然后,使用带有断点和逐步工作流、变量、表达式等的 Pydev 调试器。

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

于 2018-07-18T17:09:12.080 回答