Как отладить неудачные тесты в Django?

Как отлаживать мои тесты? Например, я POST для создания записи и ожидаю, что она проверит и вернет определенную страницу. Он работает в браузере и в оболочке, но тест - это единственное, что не удается (по иронии!). Я хотел бы напечатать ответ на консоль или что-то еще, чтобы я мог читать ошибки или что у вас есть. Но я могу видеть только то, что я 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)

Последнее утверждение неверно. Если я изменил его на значение, присутствующее на исходной странице формы с указанием ошибок поля, оно пройдет. Я просто не вижу, что мне не хватает.

У меня есть несколько других тестов, но я просто не знаю, как отлаживать это.

Как это сделать?

Ответ 1

Вы можете зайти в pdb и проверить все.

Если вы используете nose, я считаю, что вам нужно запускать тесты с помощью -s

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

Это не дает вам увидеть результат сразу.

Ответ 2

Запуск теста под pdb:

python -m pdb manage.py test yourapp

Я согласен с Alasdair, отклик на печать. (и печатный материал в целом) - отличная помощь. Результат путается с выходным сигналом обычного тестового бегуна и должен быть удален, как только вы найдете проблему и исправите ее, но это может помочь вам сузить проблему.

Кроме того, если код работает в браузере и оболочке, но не в unit test, помните, что unit test создает новую (пустую) базу данных. Убедитесь, что ваш setUp помещает любые данные, необходимые для вашего теста.

(Обновлена ​​часть кода из предложения Патрика, спасибо Патрику)

Ответ 3

Самое простое - добавить print response.content перед вашим утверждением. Результат может быть немного подавляющим, но часто его достаточно, чтобы вы могли выявить проблему.

Если это не решит проблему, в документах есть множество функций, которые могут помочь. Добавьте несколько заявлений о печати и посмотрите, что вы получаете. Вот несколько советов, но не ограничивайте их, в документах есть больше инструментов.

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

Сначала вам нужно проверить, что страница действительно перенаправляется, как вы ожидаете. Попробуйте использовать redirect_chain или assertRedirects.

Я подозреваю, что ваши почтовые данные по какой-то причине недействительны. Вы можете получить форму из контекста ответа.

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

Ответ 4

Можно использовать eclipse IDE с Pydev, создать конфигурацию Debug, в которой Аргументы являются тестовой командой. Что-то вроде:

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.

Ответ 5

Если вы используете 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.