Как установить для DEBUG значение True при запуске теста Django?

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

7 ответов

Для конкретного теста внутри тестового примера вы можете использовать декоратор 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

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

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

Идея состоит в том, чтобы подражать DEBUG=True поведение, используя обычай 500 обработчик и встроенный джанго 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.

Вдохновленный:

UPD 2021:

Это очень легко!

Вместо того TestCase использовать StaticLiveServerTestCase из django.contrib.staticfiles.testing.

Пример:

      from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from selenium.webdriver.firefox.webdriver import WebDriver

class MySeleniumTests(StaticLiveServerTestCase):
    fixtures = ['user-data.json']

    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        cls.selenium = WebDriver()
        cls.selenium.implicitly_wait(10)

    @classmethod
    def tearDownClass(cls):
        cls.selenium.quit()
        super().tearDownClass()

    def test_login(self):
        self.selenium.get('%s%s' % (self.live_server_url, '/login/'))
        username_input = self.selenium.find_element_by_name("username")
        username_input.send_keys('myuser')
        password_input = self.selenium.find_element_by_name("password")
        password_input.send_keys('secret')
        self.selenium.find_element_by_xpath('//input[@value="Log in"]').click()

Этот пример из взятдокументации

Вы также можете использовать LiveServerTestCase если вы не хотите работать со статикой

Обратите внимание : если вы работаете с настройками и соответствующими переменными на уровне модуля и пытаетесь использовать @override_settingsдекоратор, ваши переменные не будут в режиме DEBUG. Нравится:

views.py:

      from django.conf import settings

if settings.DEBUG:
    foo = bar
else:
    foo = bar * 2

def view_name(request):
    print(foo)
    return ...

test_view.py

      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

Здесь мы получим DEBUG=TrueНО foo == bar * 2

Так как этот код будет работать , когда Джанго инициализации и перед темoverride_settings декоратор.

Хорошо, скажем, я хочу написать тесты для теста testcase, для которых 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)

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

У меня ничего не работало, кроме /questions/29887906/kak-otlazhivat-v-django-horoshij-sposob/29887925#29887925 Используйте Python 3.7

breakpoint() 

метод. Прекрасно работает на pycharm

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

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

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

  1. Оставьте свою базу данных разработки.

  2. повторный показ syncdb создать пустую базу данных разработки.

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

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

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

Другие вопросы по тегам