Skip to content

Commit d8bd5b8

Browse files
committed
Add support for pytest-rerunfailures
1 parent 18ec85e commit d8bd5b8

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

pytest_lazyfixture.py

+24
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
import types
55
from collections import defaultdict
66
import pytest
7+
try:
8+
from pytest_rerunfailures import get_reruns_count
9+
except ImportError:
10+
get_reruns_count = None
711

812

913
PY3 = sys.version_info[0] == 3
@@ -22,6 +26,24 @@ def pytest_runtest_setup(item):
2226
)
2327

2428

29+
def pytest_runtest_teardown(item, nextitem):
30+
""" Add support for the pytest-rerunfailures plugin"""
31+
if get_reruns_count:
32+
reruns = get_reruns_count(item)
33+
if reruns is None:
34+
return
35+
if not hasattr(item, "execution_count"):
36+
# pytest_runtest_protocol hook of this plugin was not executed
37+
# -> teardown needs to be skipped as well
38+
return
39+
if item.execution_count <= reruns and any(item._test_failed_statuses.values()):
40+
# remove any resolved lazy fixtures
41+
if hasattr(item, "callspec"):
42+
for key, value in item.callspec.params.items():
43+
if item.stash.get(key, None) and item.stash[key]["is_lazy_fixture"]:
44+
item.callspec.params[key] = lazy_fixture(item.stash[key]["name"])
45+
46+
2547
def fillfixtures(_fillfixtures):
2648
def fill(request):
2749
item = request._pyfuncitem
@@ -33,6 +55,8 @@ def fill(request):
3355
for param, val in sorted_by_dependency(item.callspec.params, fixturenames):
3456
if val is not None and is_lazy_fixture(val):
3557
item.callspec.params[param] = request.getfixturevalue(val.name)
58+
# stash the fixture value in the item, so it can be used as a backref
59+
item.stash[param] = {'is_lazy_fixture': True, "name": val.name}
3660
elif param not in item.funcargs:
3761
item.funcargs[param] = request.getfixturevalue(param)
3862

0 commit comments

Comments
 (0)