在 Django StaticLiveServerTestCase 期间在测试输出中显示服务器错误?
Showing server errors in test output during Django StaticLiveServerTestCase?
有没有办法在测试反馈中直接显示StaticLiveServerTestCase期间服务器上发生的错误?也就是说,当某些服务器函数调用错误并且页面没有显示时,默认情况下测试执行不知道服务器错误。有没有办法将该输出传递到测试线程?
这些错误最好出现在与测试代码执行中直接出现的错误相同的位置。如果这不是(容易)可能的,那么快速查看这些服务器错误的下一个最佳方法是什么?
谢谢!
代码(按要求):
class TestFunctionalVisitor(StaticLiveServerTestCase):
def setUp(self):
self.browser = webdriver.Firefox()
def tearDown(self):
self.browser.quit()
def test_visitor(self):
self.browser.get(self.live_server_url)
self.assertEqual(self.browser.title, "Something")
...
class Home(TemplateView):
template_name = 'home.html'
def get_context_data(self):
context = {}
MyModel = None
context['my_models'] = MyModel.objects.all()
return context
这已经进行了重大修改,使其变得简单和简短。但是当 MyModel
是 None
并尝试调用 objects.all()
时,服务器出现服务器 500 错误,但我得到的只是测试输出中的 "Something" not in self.browser.title
错误,当我'我想在测试输出中看到 NoneType has no...
错误。
这正是 it is recommended 单元测试比集成和 UI/end-to-end 多得多的原因。除了其他事情,后者不会为您提供具体的反馈,您通常需要更多时间调试和调查 UI 测试失败的原因。另一方面,当单元测试失败时,通常是失败或异常指向代码中的特定行 - 您会立即得到 "What went wrong" 答案。
换句话说,要点是:用单元测试解决这个特殊问题 让 UI 测试保持原样。
为了帮助您收集有关 "Something" not in self.browser.title
故障的更多信息,打开日志并记录尽可能多的详细信息。您也可以使用 built-in Error Reporting ,例如,让 Django 在 500 错误时向您发送电子邮件。换句话说,收集所有细节并手动排除故障。
要立即查看错误,运行 在 DEBUG 模式下测试:
from django.test.utils import override_settings
@override_settings(DEBUG=True)
class DjkSampleTestCase(StaticLiveServerTestCase):
# fixtures = ['club_app_phase01_2017-01-09_13-30-19-169537.json']
reset_sequences = True
但是还应该通过自定义 django.core.handlers.base.BaseHandler
class handle_uncaught_exception()
方法实现或通过 sentry 配置服务器端错误的日志记录。
我使用以下方法覆盖默认记录器:
import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s -%(filename)s:%(lineno)d - %(message)s')
这将在您的终端上显示标准错误。你甚至可以这样做:
logging.debug('My var %s', var)
我这样做只是为了调试,如果您想将日志记录用于非调试内容,我建议您创建自定义记录器。
有关日志记录的更多详细信息:
有没有办法在测试反馈中直接显示StaticLiveServerTestCase期间服务器上发生的错误?也就是说,当某些服务器函数调用错误并且页面没有显示时,默认情况下测试执行不知道服务器错误。有没有办法将该输出传递到测试线程?
这些错误最好出现在与测试代码执行中直接出现的错误相同的位置。如果这不是(容易)可能的,那么快速查看这些服务器错误的下一个最佳方法是什么?
谢谢!
代码(按要求):
class TestFunctionalVisitor(StaticLiveServerTestCase):
def setUp(self):
self.browser = webdriver.Firefox()
def tearDown(self):
self.browser.quit()
def test_visitor(self):
self.browser.get(self.live_server_url)
self.assertEqual(self.browser.title, "Something")
...
class Home(TemplateView):
template_name = 'home.html'
def get_context_data(self):
context = {}
MyModel = None
context['my_models'] = MyModel.objects.all()
return context
这已经进行了重大修改,使其变得简单和简短。但是当 MyModel
是 None
并尝试调用 objects.all()
时,服务器出现服务器 500 错误,但我得到的只是测试输出中的 "Something" not in self.browser.title
错误,当我'我想在测试输出中看到 NoneType has no...
错误。
这正是 it is recommended 单元测试比集成和 UI/end-to-end 多得多的原因。除了其他事情,后者不会为您提供具体的反馈,您通常需要更多时间调试和调查 UI 测试失败的原因。另一方面,当单元测试失败时,通常是失败或异常指向代码中的特定行 - 您会立即得到 "What went wrong" 答案。
换句话说,要点是:用单元测试解决这个特殊问题 让 UI 测试保持原样。
为了帮助您收集有关 "Something" not in self.browser.title
故障的更多信息,打开日志并记录尽可能多的详细信息。您也可以使用 built-in Error Reporting ,例如,让 Django 在 500 错误时向您发送电子邮件。换句话说,收集所有细节并手动排除故障。
要立即查看错误,运行 在 DEBUG 模式下测试:
from django.test.utils import override_settings
@override_settings(DEBUG=True)
class DjkSampleTestCase(StaticLiveServerTestCase):
# fixtures = ['club_app_phase01_2017-01-09_13-30-19-169537.json']
reset_sequences = True
但是还应该通过自定义 django.core.handlers.base.BaseHandler
class handle_uncaught_exception()
方法实现或通过 sentry 配置服务器端错误的日志记录。
我使用以下方法覆盖默认记录器:
import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s -%(filename)s:%(lineno)d - %(message)s')
这将在您的终端上显示标准错误。你甚至可以这样做:
logging.debug('My var %s', var)
我这样做只是为了调试,如果您想将日志记录用于非调试内容,我建议您创建自定义记录器。
有关日志记录的更多详细信息: