Pytest:使用 allure 进行日志记录的最佳实践

Pytest: best practices for logging using allure

现在我正在尝试找出 pytest 的最佳日志记录方式。我要为此使用诱惑。记录所有包含以下内容的函数调用对我来说很重要:

比如我可以这样做:

import allure


@allure.step("The sum of two numbers")
def my_sum(a, b):
    result = a + b
    with allure.step("Result: {}".format(result)):
        pass
    return result


def test_sum():
    observed = my_sum(1, 2)
    assert observed == 3

日志:

日志对我来说看起来不错,但代码看起来很难看。

第二种方式:

import allure


@allure.step("The sum of two numbers")
def my_sum(a, b):
    result = a + b
    allure.attach(str(result), 'Result', allure.attachment_type.TEXT)
    return result


def test_sum():
    observed = my_sum(1, 2)
    assert observed == 3

日志:

日志看起来有点差,不过还好。在这种情况下,将为每个附件创建单独的文件。恐怕会为大型日志创建大量附件,报告工作会很慢。

此外,在这两种情况下,我都需要为每个函数添加大量代码 + 向我的代码添加时间戳看起来很难看。

请分享您使用 allure 进行日志记录的最佳实践。

P.S。在我使用 Robot Framework 之前,这个框架中的代码如下所示:

*** Settings ***


*** Test Cases ***
Test Sum
    ${observed}    My Sum    1    2
    Should Be Equal As Strings    ${observed}    3


*** Keywords ***
My Sum
    [Arguments]    ${a}    ${b}
    ${result}    Evaluate    ${a} + ${b}
    [Return]    ${result}

日志:

理想情况下,我希望获得这样的日志。日志包含参数、返回结果、函数内的所有步骤和时间戳。

我不确定我是否有一个解决方案可以让您的日志看起来很容易与机器人框架的日志完全一样,但我有一些提示给您:

  1. 你不必为 @allure.step 装饰器提供任何消息,你可以将其留空,allure 将获取名称和参数并为你打印。

  2. 您可以通过以下方式将 allure 日志处理程序添加到您的记录器: 在你的 conftest.py:

     def pytest_runtestloop(session) -> None:
         allure_logger = AllureLogger()
         if allure_logger not in logger.handlers:
             logger.info('Adding Allure logger')
             logger.addHandler(allure_logger)
    

    在另一个文件中 allure_log_handler.py(或任何你想要的):

     class AllureLogger(logging.Handler):
         def emit(self, record):
             if logging.DEBUG < record.levelno:  # print to allure only "info" messages
                 with allure.step(f'LOG ({record.levelname}): {record.getMessage()}'):
                     pass  # No need for content, since the step context is doing the work.
    

    现在所有“信息”日志都将被打印出来以吸引人,并且可以稍微清理一下您的代码。

  3. 你可以用你自己的装饰器包装 allure.step 并使用 timeit 或其他一些计时库来检查方法执行花费了多少时间并将其打印到你的日志中。

  4. 只要您打印到记录器就不需要 allure.attach(str(result), 'Result', allure.attachment_type.TEXT)。 allure 可以自动为您附加它 - 方法如下:How to append logs of Pytest into Allure Report