在 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

这已经进行了重大修改,使其变得简单和简短。但是当 MyModelNone 并尝试调用 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)

我这样做只是为了调试,如果您想将日志记录用于非调试内容,我建议您创建自定义记录器。

有关日志记录的更多详细信息: