如何为pytest中的每次测试创建新的日志文件?

时间:2019-07-23 13:57:57

标签: python python-3.x logging pytest

我已经创建了一个pytest.ini文件,

addopts = --resultlog=log.txt

这将创建一个日志文件,但是我希望每次运行测试时都创建一个新的日志文件。

我是pytest的新手,如果在阅读文档时错过了任何内容,请原谅我。

谢谢

3 个答案:

答案 0 :(得分:3)

注意

--result-log自变量已弃用,并计划在6.0版中删除(请参见Deprecations and Removals: Result log)。 issue #4488中讨论了可能的替换实现,因此请注意下一个主要版本-下面的代码将停止与pytest==6.0一起使用。

答案

您可以在pytest_configure hookimpl中修改resultlog。示例:将下面的代码放在项目根目录的conftest.py文件中:

import datetime


def pytest_configure(config):
    if not config.option.resultlog:
        timestamp = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d_%H-%M-%S')
        config.option.resultlog = 'log.' + timestamp

现在,如果未明确传递--result-log(不是 )(因此必须从addopts = --resultlog=log.txt中删除pytest.ini),pytest将创建一个日志以时间戳记结尾的文件。向--result-log传递日志文件名将覆盖此行为。

答案 1 :(得分:0)

回答我自己的问题。 弃用提到的--result-log时,我不得不找到一种无需使用该标志的方法。这是我的方法,

conftest.py

from datetime import datetime
import logging

log = logging.getLogger(__name__)

def pytest_assertrepr_compare(op, left, right):
    """ This function will print log everytime the assert fails"""
    log.error('Comparing Foo instances:    vals: %s != %s \n' % (left, right))
    return ["Comparing Foo instances:", " vals: %s != %s" % (left, right)]

def pytest_configure(config):
    """ Create a log file if log_file is not mentioned in *.ini file"""
    if not config.option.log_file:
        timestamp = datetime.strftime(datetime.now(), '%Y-%m-%d_%H-%M-%S')
        config.option.log_file = 'log.' + timestamp

pytest.ini

[pytest]
log_cli = true
log_cli_level = CRITICAL
log_cli_format = %(message)s
log_file_level = DEBUG
log_file_format = %(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)
log_file_date_format=%Y-%m-%d %H:%M:%S

test_my_code.py

import logging
log = logging.getLogger(__name__)

def test_my_code():
    ****test code

答案 2 :(得分:0)

通过将日志文件命名为测试执行开始的时间,可以拥有不同的pytest运行日志。

pytest tests --log-file $(date '+%F_%H:%M:%S') 

这将为每次测试运行创建一个日志文件。测试运行的名称将是时间戳记。

$(date '+%F_%H:%M:%S')是bash命令,用于获取DATE_Hr:Min:Sec格式的当前时间戳。