allure-framework / allure2

Allure Report is a flexible, lightweight multi-language test reporting tool. It provides clear graphical reports and allows everyone involved in the development process to extract the maximum of information from the everyday testing process
https://allurereport.org/
Apache License 2.0
4.21k stars 712 forks source link

Test duplication in the report when dynamically applying the same title or story multiple times #1883

Closed acqa closed 6 months ago

acqa commented 3 years ago

[//]: # ( . Note: for support questions, please use Stackoverflow or Gitter. . This repository's issues are reserved for feature requests and bug reports. . . In case of any problems with Allure Jenkins plugin please use the following repository . to create an issue: https://github.com/jenkinsci/allure-plugin/issues . . Make sure you have a clear name for your issue. The name should start with a capital . letter and no dot is required in the end of the sentence. An example of good issue names: . . - The report is broken in IE11 . - Add an ability to disable default plugins . - Support emoji in test descriptions )

I'm submitting a ...

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:

Other information

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

rad96 commented 3 years ago
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

Stranger6667 commented 3 years ago

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.

acqa commented 3 years ago

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

Тем самым все вызовы 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

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

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

delatrie commented 1 year ago

Basically, what happens is that allure.story is called multiple times within the same test function. Putting hypothesis and schemathesis aside, the issue could be reproduced with the following test:

import allure

def test_issue537_reproduction():
    allure.dynamic.story("Story")
    allure.dynamic.story("Story")

The test produces the following test result file (insignificant fields are hidden):

{
    "name": "test_issue537_reproduction",
    "fullName": "tests.issues.issue537.issue537_test#test_issue537_reproduction",
    "status": "passed",
    "labels": [{
        "name": "story",
        "value": "Story"
    }, {
        "name": "story",
        "value": "Story"
    }]
}

Here we see duplicated labels (i.e., with both the same name and the same value). This is how the result is shown in the report:

image

Removing the duplicate of the label from the result file fixes the report.

I have a feeling that there shouldn't be a problem calling functions like allure.story multiple times with the same value, but we need to come up with a consistent policy regarding label uniqueness. Label uniqueness is neither documented, nor implied in other allure plugins, so we need to decide on what level to implement it (plugins or reporter, all labels or just some labels like story). I will post here any updates on this as soon as I have any.

delatrie commented 1 year ago

Update: this should be implemented on the reported level. I'm transferring the issue now.

baev commented 6 months ago

closed as stale.

Please create a new support request if the issue isn't fixed yet