Repository: allure-framework/allure-python (language: python)

Issue:
[BUG] Latest pytest release (8.1.0) breaks allure_listener plugin
[//]: # (
. 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 ... 
  - [*] bug report

#### What is the current behavior?
After `pytest` released its latest version `8.1.0` it suddenly started to break `allure_listener` plugin on fixtures initilization/teardown thus preventing from running any tests with `pytest` and `allure-pytest` installed.

#### If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem
1. Have `pytest=8.1.0` installed
2. Have `allure-pytest` installed (as of the moment of writing it is `2.13.0`)
3. Have simple project with `pytest` configured
4. Have fixtures defined with `@pytest.fixture` decorator

The following is a minimal example the I could reproduce from our tests that caught this issue:

```python
# conftest.py
import pytest

class MyBaseTestClass:
   def __init__(self, val):
       self.val = val

@pytest.fixture
def my_fixture():
    yield MyBaseTestClass("some value")
```

```python
# test_example.py
def test_my_fixture(my_fixture):
    assert my_fixture.val == "some value"
```

#### What is the expected behavior?
It is expected for `allure-pytest` not to break whole project when updating to `pytest==8.1.0`

#### What is the motivation / use case for changing the behavior?
Not to break tests

#### Please tell us about your environment:

- Allure version:         2.26.0
- Test framework:      pytest@8.1.0
- Allure adaptor:        allure-pytest@2.13.0

#### Other information 

When running the test the stack trace gives the following error:

```python
self = <allure_pytest.listener.AllureListener object at 0x1378f7250>, item = <Function test_create_enum_metadata[options_bounds0]>

    @pytest.hookimpl(hookwrapper=True)
    def pytest_runtest_setup(self, item):
        if not self._cache.get(item.nodeid):
            uuid = self._cache.push(item.nodeid)
            test_result = TestResult(name=item.name, uuid=uuid, start=now(), stop=now())
            self.allure_logger.schedule_test(uuid, test_result)
        yield
>       self._update_fixtures_children(item)

.nox/tests-3-10/lib/python3.10/site-packages/allure_pytest/listener.py:102: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.nox/tests-3-10/lib/python3.10/site-packages/allure_pytest/listener.py:71: in _update_fixtures_children
    for fixturedef in _test_fixtures(item):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

item = <Function test_create_enum_metadata[options_bounds0]>

    def _test_fixtures(item):
        fixturemanager = item.session._fixturemanager
        fixturedefs = []
    
        if hasattr(item, "_request") and hasattr(item._request, "fixturenames"):
            for name in item._request.fixturenames:
>               fixturedefs_pytest = fixturemanager.getfixturedefs(name, item.nodeid)
E               AttributeError: 'str' object has no attribute 'iter_parents'

.nox/tests-3-10/lib/python3.10/site-packages/allure_pytest/listener.py:345: AttributeError
```

As it can be seen from the error message the following line is causing the issue: https://github.com/allure-framework/allure-python/blob/058a6afb0601f790162f058b3c1d3e7300d420ab/allure-pytest/src/listener.py#L102

I believe this can be due to following change recently introduced in the `pytest` framework, because right after that, we upgraded to the latest `pytest` and our tests started to fail without even running (the error thrown during the initialization of the fixtures I believe). And downgrading to `pytest==8.0.0` fixed this issues. However, I think, it would be nice to fix this to make sure further compatability between `allure-pytest` and `pytest` framework. 

Commit from the `pytest`: https://github.com/pytest-dev/pytest/commit/434282e17f5f1f4fcc1464a0a0921cf19804bdd7

P.S I am not exactly sure who should be responsible for handling this issue whether `allure` team or `pytest` team.

[//]: # (
. e.g. detailed explanation, stacktraces, related issues, suggestions 
. how to fix, links for us to have more context, eg. Stackoverflow, Gitter etc
)



Discussion / hints:
`pytest` team send me to `allure-pytest` team https://github.com/pytest-dev/pytest/issues/12063
This is the related change:

https://docs.pytest.org/en/stable/changelog.html#trivial-internal-changes

So it should a matter of changing:

```python
fixturedefs_pytest = fixturemanager.getfixturedefs(name, item.nodeid)
```

To:

```python
fixturedefs_pytest = fixturemanager.getfixturedefs(name, item)
```

Fix patch:
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index 6d150a8c..fb0ce63d 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -6,13 +6,29 @@ on:
       - master
 
 jobs:
-  changes:
-    name: Collect file changes
+  pytest-changes:
+    name: Collect allure-pytest file changes
+    runs-on: ubuntu-latest
+    outputs:
+      changed: ${{ steps.filter.outputs.allure-pytest }}
+    steps:
+      - uses: dorny/paths-filter@v3
+        id: filter
+        with:
+          filters: |
+            allure-pytest:
+              - allure-pytest/**
+              - allure-python-commons/**
+              - allure-python-commons-test/**
+              - tests/*.py
+              - tests/allure_pytest/**
+  other-changes:
+    name: Collect file changes other than allure-pytest
     runs-on: ubuntu-latest
     outputs:
       packages: ${{ steps.filter.outputs.changes }}
     steps:
-      - uses: dorny/paths-filter@v2
+      - uses: dorny/paths-filter@v3
         id: filter
         with:
           filters: |
@@ -28,12 +44,6 @@ jobs:
               - allure-python-commons-test/**
               - tests/*.py
               - tests/allure_nose2/**
-            allure-pytest:
-              - allure-pytest/**
-              - allure-python-commons/**
-              - allure-python-commons-test/**
-              - tests/*.py
-              - tests/allure_pytest/**
             allure-pytest-bdd:
               - allure-pytest-bdd/**
               - allure-python-commons/**
@@ -53,7 +63,7 @@ jobs:
     name: Build commons
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
 
       - name: Cache commons
         id: commons
@@ -68,13 +78,13 @@ jobs:
              python -m build allure-python-commons --outdir dist/ &&
              python -m build allure-python-commons-test --outdir dist/
 
-  linters:
+  lint:
     name: Static check
     runs-on: ubuntu-latest
-    needs: [commons, changes]
-    if: ${{ needs.changes.outputs.packages != '[]' }}
+    needs: [commons, pytest-changes, other-changes]
+    if: ${{ needs.pytest-changes.outputs.changed || needs.other-changes.outputs.packages != '[]' }}
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
 
       - name: Set up Python
         uses: actions/setup-python@v4
@@ -87,23 +97,67 @@ jobs:
       - name: Linting the codebase
         run: poe linter
 
-  build:
-    name: Test package
+  test-pytest:
+    name: Test allure-pytest
     runs-on: ubuntu-latest
-    needs: [linters, commons, changes]
-    if: ${{ needs.changes.outputs.packages != '[]' }}
+    needs: [commons, pytest-changes]
+    if: ${{ needs.pytest-changes.outputs.changed }}
     strategy:
       matrix:
-        package: ${{ fromJSON(needs.changes.outputs.packages) }}
         python-version: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
+        pytest-version: ["7.*", "8.*"]
+        exclude:
+          - python-version: "3.7"
+            pytest-version: "8.*"
     env:
       TEST_TMP: /tmp
       ALLURE_INDENT_OUTPUT: yep
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
 
       - name: Set up Python ${{ matrix.python-version }}
-        uses: actions/setup-python@v4
+        uses: actions/setup-python@v5
+        with:
+          python-version: ${{ matrix.python-version }}
+
+      - name: Get commons from cache
+        id: commons
+        uses: actions/cache@v3
+        with:
+          path: dist/
+          key: commons-${{ github.sha }}
+
+      - name: Install packages
+        run: |
+          pip install dist/allure-python-commons*.tar.gz \
+            ./allure-pytest \
+            pytest==${{ matrix.pytest-version }} \
+            -r ./requirements/testing.txt \
+            -r ./requirements/testing/allure-pytest.txt
+
+      - name: Test allure-pytest
+        working-directory: allure-pytest
+        run: poe tests
+
+  test-others:
+    name: Test packages other than allure-pytest
+    runs-on: ubuntu-latest
+    needs: [commons, other-changes]
+    if: ${{ needs.other-changes.outputs.packages != '[]' }}
+    strategy:
+      matrix:
+        package: ${{ fromJSON(needs.other-changes.outputs.packages) }}
+        python-version: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
+        exclude:
+          - package: allure-pytest
+    env:
+      TEST_TMP: /tmp
+      ALLURE_INDENT_OUTPUT: yep
+    steps:
+      - uses: actions/checkout@v4
+
+      - name: Set up Python ${{ matrix.python-version }}
+        uses: actions/setup-python@v5
         with:
           python-version: ${{ matrix.python-version }}
 


Test patch:
diff --git a/allure-pytest/src/listener.py b/allure-pytest/src/listener.py
index 63daf01d..eb222bc0 100644
--- a/allure-pytest/src/listener.py
+++ b/allure-pytest/src/listener.py
@@ -1,5 +1,7 @@
 import pytest
 import doctest
+from packaging import version
+
 import allure_commons
 from allure_commons.utils import now
 from allure_commons.utils import uuid4
@@ -347,13 +349,23 @@ def _test_fixtures(item):
 
     if hasattr(item, "_request") and hasattr(item._request, "fixturenames"):
         for name in item._request.fixturenames:
-            fixturedefs_pytest = fixturemanager.getfixturedefs(name, item.nodeid)
+            fixturedefs_pytest = _getfixturedefs(fixturemanager, name, item)
             if fixturedefs_pytest:
                 fixturedefs.extend(fixturedefs_pytest)
 
     return fixturedefs
 
 
+def _getfixturedefs(fixturemanager, name, item):
+    # See pytest-dev/pytest#11785
+    itemarg = item if __is_pytest8_1_or_greater() else item.nodeid
+    return fixturemanager.getfixturedefs(name, itemarg)
+
+
+def __is_pytest8_1_or_greater():
+    return version.parse(pytest.__version__) >= version.parse("8.1")
+
+
 def _exception_brokes_test(exception):
     return not isinstance(exception, (
         AssertionError,