Skip to content

Commit ecb6bbc

Browse files
committed
Add support for more than one relative marker for the same test
1 parent aa76291 commit ecb6bbc

File tree

4 files changed

+71
-13
lines changed

4 files changed

+71
-13
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22

33
## Unreleased
44

5+
_Note_:
6+
Support for Python 2.7 and Python 3.5 will be removed with the release of
7+
version 1.0.0, which is planned for the near future.
8+
9+
### New features
10+
- added support for more than one relative marker for the same test
11+
512
## [Version 0.10.0](https://pypi.org/project/pytest-order/0.10.0/) (2021-03-18)
613
Adds support for class-level relative markers and directory level scope.
714

docs/source/index.rst

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,26 @@ ones. This means that relative ordering always takes preference:
457457
In this case, ``test_second`` will be executed before ``test_first``,
458458
regardless of the ordinal markers.
459459

460+
Several relationships for the same marker
461+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
462+
If you need to order a certain test relative to more than one other test, you
463+
can add more than one test name to the ``before`` or ``after marker
464+
attributes, separated by spaces:
465+
466+
.. code:: python
467+
468+
import pytest
469+
470+
@pytest.mark.order(after="test_second other_module.test_other")
471+
def test_first():
472+
assert True
473+
474+
def test_second():
475+
assert True
476+
477+
This will ensure that ``test_first`` is executed both after ``test_second``
478+
and after ``test_other`` which resides in the module ``other_module``.
479+
460480
Configuration
461481
=============
462482
There are a few command line options that change the behavior of the

pytest_order/sorter.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ def handle_order_mark(self, item):
161161
warn("Unknown order attribute:'{}'".format(order))
162162
order = None
163163
item.order = order
164-
self.handle_relative_mark(item, mark)
164+
self.handle_relative_marks(item, mark)
165165
if order is not None:
166166
item.nr_rel_items = 0
167167
return order
@@ -239,18 +239,23 @@ def is_mark_for_class():
239239
return items
240240
return False
241241

242-
def handle_relative_mark(self, item, mark):
243-
before_mark = mark.kwargs.get("before")
244-
after_mark = mark.kwargs.get("after")
245-
if (before_mark and not self.handle_before_or_after_mark(
246-
item, mark, before_mark, is_after=False)):
247-
self.warn_about_unknown_test(before_mark)
248-
before_mark = None
249-
if (after_mark and not self.handle_before_or_after_mark(
250-
item, mark, after_mark, is_after=True)):
251-
self.warn_about_unknown_test(after_mark)
252-
after_mark = None
253-
return before_mark or after_mark
242+
def handle_relative_marks(self, item, mark):
243+
has_relative_marks = False
244+
before_marks = mark.kwargs.get("before", "").split()
245+
for before_mark in before_marks:
246+
if self.handle_before_or_after_mark(
247+
item, mark, before_mark, is_after=False):
248+
has_relative_marks = True
249+
else:
250+
self.warn_about_unknown_test(before_mark)
251+
after_marks = mark.kwargs.get("after", "").split()
252+
for after_mark in after_marks:
253+
if self.handle_before_or_after_mark(
254+
item, mark, after_mark, is_after=True):
255+
has_relative_marks = True
256+
else:
257+
self.warn_about_unknown_test(after_mark)
258+
return has_relative_marks
254259

255260
@staticmethod
256261
def warn_about_unknown_test(rel_mark):

tests/test_relative_ordering.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,32 @@ def test_3():
326326
assert item_names_for(test_content) == ["test_3", "test_2", "test_1"]
327327

328328

329+
def test_multiple_markers_in_same_test(item_names_for):
330+
test_content = """
331+
import pytest
332+
333+
@pytest.mark.order(after="test_3 test_4 test_5")
334+
def test_1():
335+
pass
336+
337+
def test_2():
338+
pass
339+
340+
def test_3():
341+
pass
342+
343+
@pytest.mark.order(before="test_3 test_2")
344+
def test_4():
345+
pass
346+
347+
def test_5():
348+
pass
349+
"""
350+
assert item_names_for(test_content) == [
351+
"test_4", "test_2", "test_3", "test_5", "test_1"
352+
]
353+
354+
329355
def test_dependency_after_unknown_test(item_names_for, capsys):
330356
test_content = """
331357
import pytest

0 commit comments

Comments
 (0)