Как установить для 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
обработчик ошибок.
Добавьте это к 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())
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'
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
не имеет никакого эффекта, так как веб-страницы (с выводом отладки) нигде не видны.
Если вы хотите увидеть отладочную веб-страницу, связанную с неудачным модульным тестом, сделайте это.
Оставьте свою базу данных разработки.
повторный показ
syncdb
создать пустую базу данных разработки.Запустить различные
loaddata
скрипты для перестройки приборов для этого теста в вашей базе данных разработки.Запустите сервер и просмотрите страницу.
Теперь вы можете увидеть результат отладки.