当前位置: 首页 > 面试题库 >

PyDev单元测试:如何捕获记录到日志中的文本。“捕获的输出”中的记录器

蓟和煦
2023-03-14
问题内容

我正在使用PyDev进行Python应用程序的开发和单元测试。至于单元测试,除了没有内容记录到日志记录框架这一事实之外,一切都可以正常工作。记录器未被PyDev的“捕获的输出”捕获。

我已经将记录的所有内容转发到标准输出,如下所示:

import sys
logger = logging.getLogger()
logger.level = logging.DEBUG
logger.addHandler(logging.StreamHandler(sys.stdout))

但是,“捕获的输出”不会显示记录到记录器的内容。

这是一个示例unittest-script: test.py

import sys
import unittest
import logging

logger = logging.getLogger()
logger.level = logging.DEBUG
logger.addHandler(logging.StreamHandler(sys.stdout))

class TestCase(unittest.TestCase):
    def testSimpleMsg(self):
        print("AA")
        logging.getLogger().info("BB")

控制台输出为:

Finding files... done.
Importing test modules ... done.

testSimpleMsg (itf.lowlevel.tests.hl7.TestCase) ... AA
2011-09-19 16:48:00,755 - root - INFO - BB
BB
ok

----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

但是该测试的“ 捕获输出 ”是:

======================== CAPTURED OUTPUT =========================
AA

有人知道如何捕获logging.Logger执行此测试期间记录到的所有内容吗?


问题答案:

问题是unittest跑步者在测试开始之前替换了sys.stdout/
sys.stderr,并且StreamHandler仍在写入原始内容sys.stdout

如果将“当前”分配给sys.stdout处理程序,则它应该可以工作(请参见下面的代码)。

import sys
import unittest
import logging

logger = logging.getLogger()
logger.level = logging.DEBUG
stream_handler = logging.StreamHandler(sys.stdout)
logger.addHandler(stream_handler)

class TestCase(unittest.TestCase):
    def testSimpleMsg(self):
        stream_handler.stream = sys.stdout
        print("AA")
        logging.getLogger().info("BB")

虽然,更好的方法是在测试期间添加/删除处理程序:

import sys
import unittest
import logging

logger = logging.getLogger()
logger.level = logging.DEBUG

class TestCase(unittest.TestCase):
    def testSimpleMsg(self):
        stream_handler = logging.StreamHandler(sys.stdout)
        logger.addHandler(stream_handler)
        try:
            print("AA")
            logging.getLogger().info("BB")
        finally:
            logger.removeHandler(stream_handler)


 类似资料:
  • 问题 你希望将单元测试的输出写到到某个文件中去,而不是打印到标准输出。 解决方案 运行单元测试一个常见技术就是在测试文件底部加入下面这段代码片段: import unittest class MyTest(unittest.TestCase): pass if __name__ == '__main__': unittest.main() 这样的话测试文件就是可执行的,并且会将

  • ,日志记录将进入一个文件; (路径)/service_name/service_name.log 我想用logback复制这种行为,但在logback.xml配置中获取“logger”名称时遇到了真正的困难。它可以在log encoder.pattern中看到,即“%d%-5level%logger{35}-%msg%n”。

  • 我在应用程序中使用Log4JV2.0Beta3进行日志记录,并且在运行单元测试时生成日志消息。我检查了API以确定将日志级别设置为关键级别的方法,但我找不到任何方法来更改日志程序配置。 事实上,我是在log4j2网站上读到的:

  • 使用Grails 4构建一个新的API,我希望可以选择记录完整的请求(标头、方法、内容等)。我可以在Interceptor中看到请求,但是内容只能读取一次(使用),所以在Interceptor中读取它会阻止内容在Controller中可用。 在堆栈溢出中已经有一些类似的问题,通过使用Grails过滤器来解决这个需求。 我不想走这条路的一个原因是,根据Grails文档,过滤器现在被认为是不建议使用的

  • 问题内容: 当我在IPython Notebook中运行以下命令时,看不到任何输出: 有人知道怎么做,这样我才能在笔记本中看到“测试”消息吗? 问题答案: 请尝试以下操作: 根据logging.basicConfig: 通过创建具有默认Formatter的StreamHandler并将其添加到根记录器,对记录系统进行基本配置。如果没有为根记录器定义处理程序,则debug(),info(),warn

  • 问题内容: 我对jdk日志记录配置有疑问。我有一个使用JDK Logging输出消息的EJB(已部署到glassfish中)。因此,我使用具有以下代码的命名记录器: 我知道可以通过将以下行添加到Glassfish的logging.properties文件中来为记录器配置日志级别: 但是,如何为记录器指定输出文件?我想将来自名为“ org.imixs.workflow”的记录器的所有消息放入单独的文