Как установить для DEBUG значение True при запуске теста Django? - PullRequest
42 голосов
/ 16 сентября 2011

В настоящее время я выполняю некоторые тесты Django, и похоже, что DEBUG=False по умолчанию. Есть ли способ запустить определенный тест, где я могу установить DEBUG=True в командной строке или в коде?

Ответы [ 5 ]

78 голосов
/ 28 ноября 2012

Для конкретного теста внутри тестового примера вы можете использовать декоратор override_settings:

from django.test.utils import override_settings
from django.conf import settings
class TestSomething(TestCase):
    @override_settings(DEBUG=True)
    def test_debug(self):
        assert settings.DEBUG
22 голосов
/ 05 августа 2017

Начиная с Django 1.11 , вы можете использовать --debug-mode, чтобы установить для параметра DEBUG значение True до запуска тестов.

11 голосов
/ 16 июля 2013

Принятый ответ не сработал для меня. Я использую Selenium для тестирования, и установка @override_settings(DEBUG=True) заставляет тестовый браузер всегда отображать ошибку 404 на каждой странице. И DEBUG=False не показывает отслеживания исключений. Поэтому я нашел обходной путь.

Идея состоит в том, чтобы эмулировать поведение DEBUG=True, используя собственный обработчик 500 и встроенный обработчик ошибок django 500.

  1. Добавить в myapp.views:

    import sys
    from django import http
    from django.views.debug import ExceptionReporter
    
    def show_server_error(request):
        """
        500 error handler to show Django default 500 template
        with nice error information and traceback.
        Useful in testing, if you can't set DEBUG=True.
    
        Templates: `500.html`
        Context: sys.exc_info() results
         """
        exc_type, exc_value, exc_traceback = sys.exc_info()
        error = ExceptionReporter(request, exc_type, exc_value, exc_traceback)
        return http.HttpResponseServerError(error.get_traceback_html())
    
  2. urls.py:

    from django.conf import settings
    
    if settings.TESTING_MODE:
        # enable this handler only for testing, 
        # so that if DEBUG=False and we're not testing,
        # the default handler is used
        handler500 = 'myapp.views.show_server_error'
    
  3. settings.py:

    # detect testing mode
    import sys
    TESTING_MODE = 'test' in sys.argv
    

Теперь, если в каком-либо из ваших тестов Selenium обнаружится ошибка 500, вы увидите красивую страницу с сообщением traceback и всем остальным. Если вы работаете в обычной среде без тестирования, используется обработчик по умолчанию 500.

Вдохновлен:

0 голосов
/ 25 августа 2017

Хорошо, допустим, я хочу написать тесты для тестового примера ошибки, для которого URL-адреса: -

urls.py

if settings.DEBUG:
    urlpatterns += [
        url(r'^404/$', page_not_found_view),
        url(r'^500/$', my_custom_error_view),
        url(r'^400/$', bad_request_view),
        url(r'^403/$', permission_denied_view),
    ] 

test_urls.py : -

from django.conf import settings

class ErroCodeUrl(TestCase):

    def setUp(self):
        settings.DEBUG = True

    def test_400_error(self):
        response = self.client.get('/400/')
        self.assertEqual(response.status_code, 500)

Надеюсь, у вас есть идея!

0 голосов
/ 16 сентября 2011

Вы не можете видеть результаты DEBUG=True при запуске модульного теста. Страницы нигде не отображаются. Нет браузера.

Изменение DEBUG не имеет никакого эффекта, поскольку веб-страницы (с выводом отладки) нигде не видны.

Если вы хотите увидеть отладочную веб-страницу, относящуюся к неудачному модульному тесту, сделайте это.

  1. Удалите базу данных разработки.

  2. Повторите syncdb для создания пустой базы данных разработки.

  3. Запустите различные сценарии loaddata, чтобы перестроить приборы для этого теста в базе данных разработки.

  4. Запустите сервер и просмотрите страницу.

Теперь вы можете увидеть выходные данные отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...