Pytest allure中steps中添加日志
是否在使用allure时,为了更好的定位问题,会把日志添加上去。类似如下的情行:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2023/7/18 9:12 # @Author : huzq # @File : test_allure.py import logging import allure import pytest LOG = logging.getLogger(__name__) def test_example(testfixture): with allure.step("First step"): LOG.info("There is first step") LOG.info("Between steps") second = "second" with allure.step("Second step"): LOG.info("There is %s step", second) LOG.info("Another message in second step") with allure.step("Outer step"): LOG.info("First line outer step") LOG.info("Seconds line outer step") with allure.step("Inner step"): LOG.info("First line for inner step") LOG.info("Second line for inner step") LOG.info("Lets close outer step with another line") def test_print(): ssss() ssss2() pytest.assume(1==2) logging.info("Logging an info message") logging.debug("Logging a DEBUG message") logging.warning("Sample time is too low!") raise Exception def test_print22(): ssss() ssss2() pytest.assume(1==2) logging.info("Logging an info message") logging.debug("Logging a DEBUG message") logging.warning("Sample time is too low!") raise Exception @allure.step('first step') def ssss(): logging.info('this is the first step') @allure.step('2 step') def ssss2(): logging.info('this is the first step')
执行后,allure显示的日志如下:
有step,有日志。
是不是感觉还行。但问题来了,一旦日志多了怎么定位问题。要是能在step中将这个step的日志显示出来就更好了。
解决方案:
翻遍了allure及pytest的API文档,倾情奉献:
只需要在conftest.py中加入如下代码:
class AllureLogStep: def __init__( self, capture_handler: _pytest.logging.LogCaptureHandler = None ): self._capture_handler = capture_handler self._io_stack = [] @allure_commons.hookimpl def start_step(self, uuid, title, params): if self._capture_handler: stream = self._capture_handler.setStream(io.StringIO()) self._io_stack.append(stream) @allure_commons.hookimpl def stop_step(self, uuid, exc_type, exc_val, exc_tb): if self._capture_handler: previous_stream = self._io_stack.pop() stream = self._capture_handler.setStream(previous_stream) step_logs = stream.getvalue().strip() allure.attach( step_logs, name="log", attachment_type=allure.attachment_type.TEXT, ) @pytest.hookimpl(trylast=True) def pytest_configure(config: _pytest.config.Config): logging_plugin = config.pluginmanager.get_plugin("logging-plugin") handler = _pytest.logging.LogCaptureHandler() handler.setFormatter(logging_plugin.formatter) handler.setLevel(logging_plugin.log_level) logger = logging.getLogger() logger.addHandler(handler) step_plugin = AllureLogStep(handler) allure_commons.plugin_manager.register(step_plugin) def unregister_plugin(plugin): def unregister(): allure_commons.plugin_manager.unregister(plugin) return unregister config.add_cleanup(unregister_plugin(step_plugin))
再次执行用例,结果就会如下:
看,步骤中是不是有log文件了。而且还是单独的step中的日志。
献给有需要的人。
Email:362299908@qq.com