From 3b234a8cc8efd02f1ba55293b997c2ade71979ee Mon Sep 17 00:00:00 2001 From: dgusakov Date: Mon, 24 May 2021 09:38:30 +0300 Subject: [PATCH 1/2] Fix redefined fixtures handling Pytest allows to redefine fixture using results of execution of original fixture (see https://docs.pytest.org/en/stable/fixture.html#overriding-fixtures-on-various-levels for details) The previous implementation of fixture handling relied on str(fixturedef) which can be identical for both original and redefined fixtures. `fixturemanager.getfixturedefs(name, item.nodeid)` returns fixturedefs for both original and redefined fixture so we need to use all results of `fixturemanager.getfixturedefs` and not just the last element. --- allure-pytest/src/listener.py | 12 ++-- .../test/acceptance/fixture/fixture_test.py | 59 ++++++++++++++++++- 2 files changed, 63 insertions(+), 8 deletions(-) diff --git a/allure-pytest/src/listener.py b/allure-pytest/src/listener.py index b6476c21..70b1e55c 100644 --- a/allure-pytest/src/listener.py +++ b/allure-pytest/src/listener.py @@ -268,13 +268,13 @@ def __init__(self): self._items = dict() def get(self, _id): - return self._items.get(str(_id)) + return self._items.get(id(_id)) def push(self, _id): - return self._items.setdefault(str(_id), uuid4()) + return self._items.setdefault(id(_id), uuid4()) def pop(self, _id): - return self._items.pop(str(_id), None) + return self._items.pop(id(_id), None) def _test_fixtures(item): @@ -283,8 +283,8 @@ def _test_fixtures(item): if hasattr(item, "_request") and hasattr(item._request, "fixturenames"): for name in item._request.fixturenames: - fixturedef = fixturemanager.getfixturedefs(name, item.nodeid) - if fixturedef: - fixturedefs.append(fixturedef[-1]) + fixturedefs_pytest = fixturemanager.getfixturedefs(name, item.nodeid) + if fixturedefs_pytest: + fixturedefs.extend(fixturedefs_pytest) return fixturedefs diff --git a/allure-pytest/test/acceptance/fixture/fixture_test.py b/allure-pytest/test/acceptance/fixture/fixture_test.py index d407049e..9554e26f 100644 --- a/allure-pytest/test/acceptance/fixture/fixture_test.py +++ b/allure-pytest/test/acceptance/fixture/fixture_test.py @@ -2,8 +2,8 @@ import allure from hamcrest import assert_that, not_ from allure_commons_test.report import has_test_case -from allure_commons_test.container import has_container -from allure_commons_test.container import has_before +from allure_commons_test.container import has_container, has_before, has_after +from allure_commons_test.result import has_step from itertools import combinations_with_replacement fixture_scopes = ["session", "module", "class", "function"] @@ -217,3 +217,58 @@ def test_with_titled_conftest_fixtures(first_fixture, second_fixture): ) ) ) + + +def test_fixture_override(allured_testdir): + allured_testdir.testdir.makeconftest(""" + import pytest + import allure + + @pytest.fixture + def my_fixture(): + with allure.step('Step in before in original fixture'): + pass + yield + with allure.step('Step in after in original fixture'): + pass + + """) + + allured_testdir.testdir.makepyfile(""" + import pytest + import allure + + @pytest.fixture + def my_fixture(my_fixture): + with allure.step('Step in before in redefined fixture'): + pass + yield + with allure.step('Step in after in redefined fixture'): + pass + + def test_with_redefined_fixture(my_fixture): + pass + """) + + allured_testdir.run_with_allure() + + assert_that(allured_testdir.allure_report, + has_test_case("test_with_redefined_fixture", + has_container(allured_testdir.allure_report, + has_before("my_fixture", + has_step("Step in before in original fixture") + ), + has_after("my_fixture::0", + has_step("Step in after in original fixture") + ) + ), + has_container(allured_testdir.allure_report, + has_before("my_fixture", + has_step("Step in before in redefined fixture") + ), + has_after("my_fixture::0", + has_step("Step in after in redefined fixture") + ) + ), + ) + ) From be80e97d06de40a80ada5ef34229eac09db623a5 Mon Sep 17 00:00:00 2001 From: dgusakov Date: Mon, 24 May 2021 09:43:12 +0300 Subject: [PATCH 2/2] Fix linter remarks --- allure-pytest/test/acceptance/fixture/fixture_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/allure-pytest/test/acceptance/fixture/fixture_test.py b/allure-pytest/test/acceptance/fixture/fixture_test.py index 9554e26f..5249b508 100644 --- a/allure-pytest/test/acceptance/fixture/fixture_test.py +++ b/allure-pytest/test/acceptance/fixture/fixture_test.py @@ -237,7 +237,7 @@ def my_fixture(): allured_testdir.testdir.makepyfile(""" import pytest import allure - + @pytest.fixture def my_fixture(my_fixture): with allure.step('Step in before in redefined fixture'): @@ -245,7 +245,7 @@ def my_fixture(my_fixture): yield with allure.step('Step in after in redefined fixture'): pass - + def test_with_redefined_fixture(my_fixture): pass """)