我是Python的新手,但想创建一个包含以下内容的基本程序结构: -记录多个模块的日志,仅打印到一个日志文件; -跨所有模块的单元测试,忽略所有日志记录。
我的程序结构是:
Project
- Components
| - __init__.py
| - mathtoolbox.py
- Tests
| - __init__.py
| - test_mathtoolbox.py
__main__.py
- Logs
| - logfile.log
在mathtoolbox.py中,说我有一个函数除法,除了在ZeroDivisionError上可以尝试,当被捕获时,仅将错误打印到日志文件(没有任何日志记录将打印到控制台) 。下面提供了三个* .py文件中的代码
__ main__.py配置记录器并运行除法功能。
def main():
X = mathtoolbox.divide(5, 0)
print(X)
if __name__ == '__main__':
import logging
root_logger = logging.getLogger()
formatter = logging.Formatter(
'%(asctime)s - %(levelname)-8s - [%(module)-15s]: %(message)s when running %(funcName)s')
handler = logging.FileHandler("Logs/logfile.log")
handler.setFormatter(formatter)
root_logger.setLevel(logging.DEBUG)
root_logger.addHandler(handler)
root_logger.info("Code has initiated the logger from " + __name__)
main()
mathtoolbox.py具有:
import logging
logger = logging.getLogger(__name__)
def divide(x, y):
logger.info("An INFO message from " + __name__)
try:
return x / y
except ZeroDivisionError:
logger.error(
"An ERROR message from " + __name__)
和test_mathtoolbox.py具有:
import unittest
import Components.mathtoolbox as mathtoolbox
class Test(unittest.TestCase):
def test_divide_when_zero(self):
self.assertRaises(ZeroDivisionError, mathtoolbox.divide(5, 0))
def test_divide(self):
result = mathtoolbox.divide(6, 2)
self.assertEqual(result, 3)
if __name__ == "__main__":
#import sys;sys.argv = ['', 'Test.testName']
unittest.main()
正常运行 main 时,它会完全按照我的意愿运行,控制台仅显示除法打印语句的结果,而日志文件则正确显示所有记录的内容。但是,在进行单元测试时,“ test_divide_when_zero”将在“控制台”上打印“我从Components.mathtoolbox发来的错误消息”,因为该单元测试已经断言了该异常,因此该错误消息是不必要的。我了解这是因为尚未运行 main 中的任何内容来配置记录器。那么,在进行单元测试时,有没有一种方法可以配置记录器以防止将其输出到控制台,或者有一个更聪明的框架来处理整个问题?
谢谢!