我正在尝试为用Python 2.7编写的模块编写单元测试,但现在无法迁移到3.x。我要进行的此测试是检查我的模块是否生成警告日志,如果它随后捕获了它。通过搜索网络和堆栈溢出,我找不到Python 2.7的答案。我提供了一个简单的可测试代码,您可以使用它来尝试解决问题或更好地理解我的问题。
更新:
为了明确起见,我愿意更改测试用例,即test_warning_2
能够捕获log.warn
该方法的当前实现只是一个占位符。
import logging
import warnings
from unittest import TestCase
def generate_warning_2():
logging.warn("this is a warning")
def generate_warning_1():
warnings.warn("this is a warning")
class TestWarning(TestCase):
def test_warning_1(self):
warnings.simplefilter("always")
with warnings.catch_warnings(record=True) as w:
generate_warning_1()
self.assertEquals(len(w), 1)
def test_warning_2(self):
# Below code is just a place holder, i need some code to replace this so that i can catch `log.warn`
warnings.simplefilter("always")
with warnings.catch_warnings(record=True) as w:
generate_warning_2()
self.assertEquals(len(w), 1)
在这里,如果您看到函数generate_warning_2
,您会注意到我使用的是常规python日志记录警告,该警告未被我的测试用例捕获。我知道原因是因为它不使用warnings
模块。我只是想展示自己想要做的事情。
我使用generate_warning_1
模块捕获警告日志的另一个功能warnings
,这是我目前可以正常使用的实现。
我希望能够捕获log.warn
,而不必使用warning
来实现。这在Python 2.7中可行吗?请不要提供Python 3.x的答案,因为我已经知道它的可能。
希望我的问题很清楚,请随时向我提问或在适当的地方进行编辑。感谢您的任何帮助。
答案 0 :(得分:0)
这可以使用记录器处理程序解决。不幸的是,似乎没有办法在根记录器上设置处理程序,而只能在2019-01-05
返回的实例上进行设置。如果您可以忍受,那应该可以:
getLogger
import logging
import warnings
import unittest
class WarningsHandler(logging.Handler):
def handle(self, record):
if record.levelno == logging.WARN:
warnings.warn(record.getMessage())
return record
log = logging.getLogger()
log.addHandler(WarningsHandler())
def generate_warning_2():
log.warn("this is a warning")
def generate_warning_1():
warnings.warn("this is a warning")
class TestWarning(unittest.TestCase):
def test_warning_1(self):
warnings.simplefilter("always")
with warnings.catch_warnings(record=True) as w:
generate_warning_1()
self.assertEquals(len(w), 1)
def test_warning_2(self):
warnings.simplefilter("always")
with warnings.catch_warnings(record=True) as w:
generate_warning_2()
self.assertEquals(len(w), 1)
if __name__ == "__main__":
unittest.main()
为了防止最终两次打印,您可能希望使处理程序仅有条件地返回LogRecord。