当我同时使用pytest和日志时遇到了一个问题,当我自己运行一个程序时,我可以看到它的消息打印在屏幕上,也可以看到它的消息打印在文件test.log中。
python3 main.py -> prints on terminal, and also in test.log
然而,当我运行与pytest相同的程序时,我只在屏幕上看到消息,但没有创建文件test.log。
pytest -vs test -> prints only on terminal, but not in test.log
为什么pytest会干扰日志实用程序,以及在使用pytest时,我应该做些什么来创建这些日志文件?
我的版本如下:
platform linux -- Python 3.6.7, pytest-4.0.2, py-1.7.0, pluggy-0.8.0 -- /usr/bin/python3
目录结构如下所示:
├── logger.py
├── main.py
└── test
├── __init__.py
└── test_module01.py
这些文件的代码如下所示:
# logger.py ===================================
import logging
def logconfig(logfile, loglevel):
print('logconfig: logfile={} loglevel={}..'.format(logfile,loglevel))
logging.basicConfig(filename=logfile, level=logging.INFO, format='%(asctime)s :: %(message)s')
def logmsg(log_level, msg):
print(log_level,': ',msg)
logging.info('INFO: ' + msg)
# main.py =====================================
from datetime import datetime
from logger import *
def main(BASE_DIR):
LOG_FILE = BASE_DIR + 'test.log'
logconfig(LOG_FILE,'INFO')
logmsg('INFO',"Starting PROGRAM@[{}] at {}=".format(BASE_DIR,datetime.now()))
logmsg('INFO',"Ending PROGRAM at {}=".format(datetime.now()))
if __name__ == "__main__":
main('./')
# __init__.py =================================
all = ["test_module01"]
# test_module01.py ============================
import pytest
import main
class TestClass01:
def test_case01(self):
print("In test_case01()")
main.main('./test/')
1条答案
按热度按时间hfyxw5xn1#
默认情况下,pytest捕获程序发出的所有日志记录,这意味着代码中定义的所有日志处理程序都将被
pytest
内部使用的自定义处理程序所取代;如果你传递-s
,它会将发出的记录打印到终端,否则它将不打印任何内容,也不会进行进一步的输出。内部处理程序将捕获从你的代码发出的所有记录。要在测试中访问它们,请使用caplog
fixture。例如:假设您需要测试以下程序:如果你运行这个程序,你会看到输出
但是没有明显的方法来访问调试消息。使用
caplog
时没有问题:如果您不需要日志捕获(例如,当使用
pytest
编写系统测试时),您可以通过禁用logging
插件来关闭它:或者在
pyproject.toml
中持久化它,以便不必每次都输入它:与(传统)
pytest.cfg
相同的配置:当然,一旦显式禁用了日志捕获,就不能再依赖
caplog
了。