Сейчас я пытаюсь найти лучший способ входа в 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}
Бревно:
В идеале я хотел бы получить такой лог. Журнал содержит аргументы, возвращенные результаты, все шаги внутри функции и временные метки.
Я не уверен, что у меня есть решение, благодаря которому ваш журнал будет выглядеть точно так же, как журнал робота, но у меня есть несколько советов для вас:
вам не нужно указывать декоратору @allure.step какое-либо сообщение, вы можете оставить его пустым, и allure возьмет имя и аргументы и напечатает их для вас.
вы можете добавить обработчик журнала 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.
теперь все «информационные» журналы будут распечатаны, чтобы привлечь внимание и могут немного очистить ваш код.
вы можете обернуть allure.step своим собственным декоратором и использовать timeit или какую-либо другую библиотеку синхронизации, чтобы проверить, сколько времени заняло выполнение метода, и распечатать его в своем журнале.
пока вы печатаете в регистратор, вам не нужен allure.attach(str(result), 'Result', allure.attachment_type.TEXT)
. allure может автоматически прикрепить его для вашего - вот как: Как добавить журналы Pytest в отчет Allure