diff --git a/changelog/10447.bugfix.rst b/changelog/10447.bugfix.rst new file mode 100644 index 00000000000..5b3e29efd16 --- /dev/null +++ b/changelog/10447.bugfix.rst @@ -0,0 +1 @@ +When resolving marks from a class hierarchy MRO, reverse the order so that more basic classes' marks will be processed ahead of ancestral classes. diff --git a/src/_pytest/mark/structures.py b/src/_pytest/mark/structures.py index bc10d3b90ef..e1840259ef9 100644 --- a/src/_pytest/mark/structures.py +++ b/src/_pytest/mark/structures.py @@ -374,7 +374,9 @@ def get_unpacked_marks( if not consider_mro: mark_lists = [obj.__dict__.get("pytestmark", [])] else: - mark_lists = [x.__dict__.get("pytestmark", []) for x in obj.__mro__] + mark_lists = reversed( + [x.__dict__.get("pytestmark", []) for x in obj.__mro__] + ) mark_list = [] for item in mark_lists: if isinstance(item, list): diff --git a/testing/test_mark.py b/testing/test_mark.py index e2d1a40c38a..d8e4f708d24 100644 --- a/testing/test_mark.py +++ b/testing/test_mark.py @@ -1130,6 +1130,6 @@ class C(A, B): all_marks = get_unpacked_marks(C) - assert all_marks == [xfail("c").mark, xfail("a").mark, xfail("b").mark] + assert all_marks == [xfail("b").mark, xfail("a").mark, xfail("c").mark] assert get_unpacked_marks(C, consider_mro=False) == [xfail("c").mark]