allure-python
allure-python copied to clipboard
Pytest: allure.dynamic.title() не группируются по имени, если используется allure.dynamic.story()
I'm submitting a ...
- [x ] bug report
What is the current behavior?
При использовании динамических story и title, title-ы не группируются по имени - появляется большое кол-во title-ов с одинаковым названием и временем выполнения.
При использовании статического story - группировка производится ожидаемо. Как видно - дублирующих тестов (title-ов) - нет.
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 )
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)
Вот так становится чуть понятнее в чем проблема:
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.
Дмитрий привет! Обновил стартовый пост, добавил скрины отчетов. Первый раз оформляю тут баг, сначала не разобрался как правильно их вставлять.
Тем самым все вызовы 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), то было бы хорошо :)