From 86dc477179fdebddfde037a446dfd63ba50782eb Mon Sep 17 00:00:00 2001 From: Lukasz Date: Mon, 3 Feb 2020 20:36:07 +0100 Subject: [PATCH] FIX: #455 'allure-pytest-bdd' report marks feature as 'Fail' even when all steps pass when test is using 'Scenario Outline' --- allure-pytest-bdd/src/pytest_bdd_listener.py | 6 +++--- allure-pytest-bdd/src/utils.py | 9 +++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/allure-pytest-bdd/src/pytest_bdd_listener.py b/allure-pytest-bdd/src/pytest_bdd_listener.py index 560f8ab8..2c02e1e2 100644 --- a/allure-pytest-bdd/src/pytest_bdd_listener.py +++ b/allure-pytest-bdd/src/pytest_bdd_listener.py @@ -9,8 +9,9 @@ from .utils import get_uuid from .utils import get_step_name from .utils import get_status_details +from .utils import get_pytest_report_status from allure_commons.model2 import StatusDetails -from functools import partial, reduce +from functools import partial from allure_commons.lifecycle import AllureLifecycle from .utils import get_full_name @@ -84,8 +85,7 @@ def pytest_bdd_step_func_lookup_error(self, request, feature, scenario, step, ex def pytest_runtest_makereport(self, item, call): report = (yield).get_result() - status = reduce(lambda final_status, current_status: final_status or getattr(report, current_status, None), - ["failed", "passed", "skipped"]) + status = get_pytest_report_status(report) status_details = StatusDetails( message=call.excinfo.exconly(), diff --git a/allure-pytest-bdd/src/utils.py b/allure-pytest-bdd/src/utils.py index 5f632350..6859119f 100644 --- a/allure-pytest-bdd/src/utils.py +++ b/allure-pytest-bdd/src/utils.py @@ -2,6 +2,7 @@ from uuid import UUID from allure_commons.utils import md5 from allure_commons.model2 import StatusDetails +from allure_commons.model2 import Status from allure_commons.utils import format_exception @@ -22,3 +23,11 @@ def get_status_details(exception): message = str(exception) trace = format_exception(type(exception), exception) return StatusDetails(message=message, trace=trace) if message or trace else None + + +def get_pytest_report_status(pytest_report): + pytest_statuses = ('failed', 'passed', 'skipped') + statuses = (Status.FAILED, Status.PASSED, Status.SKIPPED) + for pytest_status, status in zip(pytest_statuses, statuses): + if getattr(pytest_report, pytest_status): + return status