Closed acqa closed 6 months 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)
Вот так становится чуть понятнее в чем проблема:
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
Со своей стороны могу предложить добавить хуки в pytest плагин в schemathesis.
Если это позволит передавать в @allure.story() текущие параметры из фикстуры case (в частности, case.endpoint.path), то было бы хорошо :)
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:
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.
Update: this should be implemented on the reported level. I'm transferring the issue now.
closed as stale.
Please create a new support request if the issue isn't fixed yet
[//]: # ( . 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-ов с одинаковым названием и временем выполнения.
При использовании статического 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
Для получения результата со статическим story, можно убрать # у закомментированных строк и закомментировать
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 )