allure-python icon indicating copy to clipboard operation
allure-python copied to clipboard

Pytest: allure.dynamic.title() не группируются по имени, если используется allure.dynamic.story()

Open acqa opened this issue 4 years ago • 3 comments

I'm submitting a ...

  • [x ] bug report

What is the current behavior?

При использовании динамических story и title, title-ы не группируются по имени - появляется большое кол-во title-ов с одинаковым названием и временем выполнения. 1

При использовании статического story - группировка производится ожидаемо. Как видно - дублирующих тестов (title-ов) - нет. 2

If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem

Можно выполнить следующий код в pytest

import schemathesis
import allure

schema = schemathesis.from_uri("https://petstore.swagger.io/v2/swagger.json")

#@allure.story("Static story")
@schema.parametrize()
def test_api(case):

    allure.dynamic.title(case.method)
    allure.dynamic.story(case.endpoint.path)
    #allure.dynamic.title(str(case.method) + ": " + str(case.endpoint.path))

    with allure.step("Endpoint: " + str(case.formatted_path)
                  + "; Query: " + str(case.query)
                  + "; Body: " + str(case.body)
                  ):

        resp = case.call()

        resp_to_attach = resp.request.method \
                         + "\n" + resp.request.url \
                         + "\n" + str(resp.status_code) \
                         + "\n" + resp.text

        allure.attach(resp_to_attach, name="output",
                          attachment_type=allure.attachment_type.TEXT)

        case.validate_response(resp)

Для получения результата со статическим story, можно убрать # у закомментированных строк и закомментировать

    allure.dynamic.title(case.method)
    allure.dynamic.story(case.endpoint.path)

What is the expected behavior?

При использовании динамического story, группировка title-ов должна сохраняться.

What is the motivation / use case for changing the behavior?

Хотелось бы добавить поддержку allure в schemathesis

Please tell us about your environment:

  • Allure version: 2.13.6
  • Test framework: [email protected]
  • Allure adaptor: allure-pytest-2.7.1

Other information

Обновил информацию, добавил скрины с отчетами. //: # ( . e.g. detailed explanation, stacktraces, related issues, suggestions . how to fix, links for us to have more context, eg. Stackoverflow, Gitter etc )

acqa avatar Dec 15 '20 13:12 acqa

import schemathesis
import allure

schema = schemathesis.from_uri("https://petstore.swagger.io/v2/swagger.json")


# @allure.story("Static story")
@schema.parametrize()
def test_api(case):
    allure.dynamic.title(str(case.method) + ": " + str(case.endpoint.path))
    allure.dynamic.story(case.endpoint.path)
    # allure.dynamic.title(str(case.method) + ": " + str(case.endpoint.path))

    with allure.step("Endpoint: " + str(case.formatted_path)
                     + "; Query: " + str(case.query)
                     + "; Body: " + str(case.body)
                     ):
        resp = case.call()

        resp_to_attach = resp.request.method \
                         + "\n" + resp.request.url \
                         + "\n" + str(resp.status_code) \
                         + "\n" + resp.text

        allure.attach(resp_to_attach, name="output",
                      attachment_type=allure.attachment_type.TEXT)

        case.validate_response(resp)

Вот так становится чуть понятнее в чем проблема: image

rad96 avatar Dec 15 '20 13:12 rad96

I am not sure what is the default communication language here, as the issue author wrote it in Russian. I'll provide my comment also in Russian.

Хотелось бы добавить поддержку allure в schemathesis

Здесь важно учесть, что тесты которые генерирует Schemathesis это в первую очередь hypothesis тесты. Их особенность в том что тело функции выполняется множество раз внутри одного pytest теста - там разные этапы, включая генерацию данных + минимизацию. Тем самым все вызовы allure.dynamic.title и прочее выполняются множество раз. Больше деталей можно узнать в этом issue, но во многом это больше вопрос интеграции hypothesis с pytest, чем schemathesis с pytest-allure.

Со своей стороны могу предложить добавить хуки в pytest плагин в schemathesis. Т.е. можно сделать два хука (по-крайней мере на первый взгляд), один бы вызывался до вызова schemathesis-теста, а один после. Чтото вроде такого:

def pytest_schemathesis_before_call(endpoint):
    ...

def pytest_schemathesis_after_call(exception, case):
    ...

И можно сделать чтобы они вызывались один раз на каждый endpoint - и внутри них уже можно было бы вызывать allure. Дайте знать если такое подойдет - добавлю в roadmap в Schemathesis.

P.S. To the plugin maintainers. Let me know if it makes sense to give the comment above in English as well.

Stranger6667 avatar Dec 15 '20 15:12 Stranger6667

Дмитрий привет! Обновил стартовый пост, добавил скрины отчетов. Первый раз оформляю тут баг, сначала не разобрался как правильно их вставлять.

Тем самым все вызовы allure.dynamic.title и прочее выполняются множество раз.

Как видно из скринов, если использовать антотацию @allure.story("Static story") над тестовой функцией, то проблем с множественным выполнением allure.dynamic.title не возникает - отчет формируется без дубликатов тестов (title-ов). А если использовать allure.dynamic.story() вместе с allure.dynamic.title в самой тестовой функции, то получаем дубликаты строк title-ов в отчете. Поэтому предположил, что ошибка на стороне формирователя результата allure.

Больше деталей можно узнать в этом issue

Если я правильно понял, то там речь про глубокую интеграцию hypothesis c pytest- ом. В моем примере, assert-ов для pytest-а нет совсем, я полагаюсь только на ошибки, которые выведет сам hypothesis. Для того, чтобы было проще эти ошибки разбирать, я каждый из запросов обрамляю allure.step-ом, в котором прописываю условия выполнения каждого запроса и прикладываю условия и результат http-запроса. В принципе, allure.dynamic.title со статическим @allure.story() позволяет определенную группировку производить. Но хочется сделать группировку чуть детальнее: Endpoint - GET - POST - PUT - DELETE А для этого, нужно как-то в @allure.story() передать текущее значение из case.endpoint.path. Иного способа, кроме как allure.dynamic.story(), пока не придумал - но это решение вызывает некорректное оформление теста.

Со своей стороны могу предложить добавить хуки в pytest плагин в schemathesis.

Если это позволит передавать в @allure.story() текущие параметры из фикстуры case (в частности, case.endpoint.path), то было бы хорошо :)

acqa avatar Dec 15 '20 16:12 acqa