Skip to content

Commit e3f4a93

Browse files
committed
Maintain the skip location under Pytest >= 7.0.x
Signed-off-by: Pedro Algarvio <palgarvio@vmware.com>
1 parent 27ba04b commit e3f4a93

2 files changed

Lines changed: 38 additions & 60 deletions

File tree

changelog/7.improvement.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Maintain the skip location under Pytest >= 7.0.x

src/pytestskipmarkers/utils/markers.py

Lines changed: 37 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,16 @@
1616
import os
1717
import shutil
1818

19+
import _pytest._version
1920
import pytest
2021

2122
import pytestskipmarkers.utils.platform
2223
import pytestskipmarkers.utils.ports as ports
2324
import pytestskipmarkers.utils.socket as socket
2425

26+
27+
PYTEST_GE_7 = getattr(_pytest._version, "version_tuple", (-1, -1)) >= (7, 0)
28+
2529
log = logging.getLogger(__name__)
2630

2731

@@ -162,15 +166,17 @@ def evaluate_markers(item):
162166
"""
163167
Fixtures injection based on markers or test skips based on CLI arguments
164168
"""
169+
exc_kwargs = {}
170+
if PYTEST_GE_7:
171+
exc_kwargs["_use_item_location"] = True
165172
destructive_tests_marker = item.get_closest_marker("destructive_test")
166173
if destructive_tests_marker is not None:
167174
if destructive_tests_marker.args or destructive_tests_marker.kwargs:
168175
raise pytest.UsageError(
169176
"The 'destructive_test' marker does not accept any arguments or keyword arguments"
170177
)
171178
if item.config.getoption("--run-destructive") is False:
172-
item._skipped_by_mark = True
173-
pytest.skip("Destructive tests are disabled")
179+
raise pytest.skip.Exception("Destructive tests are disabled", **exc_kwargs)
174180

175181
expensive_tests_marker = item.get_closest_marker("expensive_test")
176182
if expensive_tests_marker is not None:
@@ -179,8 +185,7 @@ def evaluate_markers(item):
179185
"The 'expensive_test' marker does not accept any arguments or keyword arguments"
180186
)
181187
if item.config.getoption("--run-expensive") is False:
182-
item._skipped_by_mark = True
183-
pytest.skip("Expensive tests are disabled")
188+
raise pytest.skip.Exception("Expensive tests are disabled", **exc_kwargs)
184189

185190
skip_if_not_root_marker = item.get_closest_marker("skip_if_not_root")
186191
if skip_if_not_root_marker is not None:
@@ -190,8 +195,7 @@ def evaluate_markers(item):
190195
)
191196
skip_reason = skip_if_not_root()
192197
if skip_reason:
193-
item._skipped_by_mark = True
194-
pytest.skip(skip_reason)
198+
raise pytest.skip.Exception(skip_reason, **exc_kwargs)
195199

196200
skip_if_binaries_missing_marker = item.get_closest_marker("skip_if_binaries_missing")
197201
if skip_if_binaries_missing_marker is not None:
@@ -216,8 +220,7 @@ def evaluate_markers(item):
216220
skip_if_binaries_missing_marker.kwargs["reason"] = message
217221
skip_reason = skip_if_binaries_missing(binaries, **skip_if_binaries_missing_marker.kwargs)
218222
if skip_reason:
219-
item._skipped_by_mark = True
220-
pytest.skip(skip_reason)
223+
raise pytest.skip.Exception(skip_reason, **exc_kwargs)
221224

222225
requires_network_marker = item.get_closest_marker("requires_network")
223226
if requires_network_marker is not None:
@@ -226,14 +229,12 @@ def evaluate_markers(item):
226229
if local_skip_reason:
227230
# Since we're only supposed to check local network, and no
228231
# local network was detected, skip the test
229-
item._skipped_by_mark = True
230-
pytest.skip(local_skip_reason)
232+
raise pytest.skip.Exception(local_skip_reason, **exc_kwargs)
231233

232234
if only_local_network is False:
233235
remote_skip_reason = skip_if_no_remote_network()
234236
if remote_skip_reason:
235-
item._skipped_by_mark = True
236-
pytest.skip(remote_skip_reason)
237+
raise pytest.skip.Exception(remote_skip_reason, **exc_kwargs)
237238

238239
# Platform Skip Markers
239240
skip_on_windows_marker = item.get_closest_marker("skip_on_windows")
@@ -248,8 +249,7 @@ def evaluate_markers(item):
248249
if reason is None:
249250
reason = "Skipped on Windows"
250251
if pytestskipmarkers.utils.platform.is_windows():
251-
item._skipped_by_mark = True
252-
pytest.skip(reason)
252+
raise pytest.skip.Exception(reason, **exc_kwargs)
253253

254254
skip_unless_on_windows_marker = item.get_closest_marker("skip_unless_on_windows")
255255
if skip_unless_on_windows_marker is not None:
@@ -265,8 +265,7 @@ def evaluate_markers(item):
265265
if reason is None:
266266
reason = "Platform is not Windows, skipped"
267267
if not pytestskipmarkers.utils.platform.is_windows():
268-
item._skipped_by_mark = True
269-
pytest.skip(reason)
268+
raise pytest.skip.Exception(reason, **exc_kwargs)
270269

271270
skip_on_linux_marker = item.get_closest_marker("skip_on_linux")
272271
if skip_on_linux_marker is not None:
@@ -280,8 +279,7 @@ def evaluate_markers(item):
280279
if reason is None:
281280
reason = "Skipped on Linux"
282281
if pytestskipmarkers.utils.platform.is_linux():
283-
item._skipped_by_mark = True
284-
pytest.skip(reason)
282+
raise pytest.skip.Exception(reason, **exc_kwargs)
285283

286284
skip_unless_on_linux_marker = item.get_closest_marker("skip_unless_on_linux")
287285
if skip_unless_on_linux_marker is not None:
@@ -295,8 +293,7 @@ def evaluate_markers(item):
295293
if reason is None:
296294
reason = "Platform is not Linux, skipped"
297295
if not pytestskipmarkers.utils.platform.is_linux():
298-
item._skipped_by_mark = True
299-
pytest.skip(reason)
296+
raise pytest.skip.Exception(reason, **exc_kwargs)
300297

301298
skip_on_darwin_marker = item.get_closest_marker("skip_on_darwin")
302299
if skip_on_darwin_marker is not None:
@@ -310,8 +307,7 @@ def evaluate_markers(item):
310307
if reason is None:
311308
reason = "Skipped on Darwin"
312309
if pytestskipmarkers.utils.platform.is_darwin():
313-
item._skipped_by_mark = True
314-
pytest.skip(reason)
310+
raise pytest.skip.Exception(reason, **exc_kwargs)
315311

316312
skip_unless_on_darwin_marker = item.get_closest_marker("skip_unless_on_darwin")
317313
if skip_unless_on_darwin_marker is not None:
@@ -327,8 +323,7 @@ def evaluate_markers(item):
327323
if reason is None:
328324
reason = "Platform is not Darwin, skipped"
329325
if not pytestskipmarkers.utils.platform.is_darwin():
330-
item._skipped_by_mark = True
331-
pytest.skip(reason)
326+
raise pytest.skip.Exception(reason, **exc_kwargs)
332327

333328
skip_on_sunos_marker = item.get_closest_marker("skip_on_sunos")
334329
if skip_on_sunos_marker is not None:
@@ -342,8 +337,7 @@ def evaluate_markers(item):
342337
if reason is None:
343338
reason = "Skipped on SunOS"
344339
if pytestskipmarkers.utils.platform.is_sunos():
345-
item._skipped_by_mark = True
346-
pytest.skip(reason)
340+
raise pytest.skip.Exception(reason, **exc_kwargs)
347341

348342
skip_unless_on_sunos_marker = item.get_closest_marker("skip_unless_on_sunos")
349343
if skip_unless_on_sunos_marker is not None:
@@ -357,8 +351,7 @@ def evaluate_markers(item):
357351
if reason is None:
358352
reason = "Platform is not SunOS, skipped"
359353
if not pytestskipmarkers.utils.platform.is_sunos():
360-
item._skipped_by_mark = True
361-
pytest.skip(reason)
354+
raise pytest.skip.Exception(reason, **exc_kwargs)
362355

363356
skip_on_smartos_marker = item.get_closest_marker("skip_on_smartos")
364357
if skip_on_smartos_marker is not None:
@@ -372,8 +365,7 @@ def evaluate_markers(item):
372365
if reason is None:
373366
reason = "Skipped on SmartOS"
374367
if pytestskipmarkers.utils.platform.is_smartos():
375-
item._skipped_by_mark = True
376-
pytest.skip(reason)
368+
raise pytest.skip.Exception(reason, **exc_kwargs)
377369

378370
skip_unless_on_smartos_marker = item.get_closest_marker("skip_unless_on_smartos")
379371
if skip_unless_on_smartos_marker is not None:
@@ -389,8 +381,7 @@ def evaluate_markers(item):
389381
if reason is None:
390382
reason = "Platform is not SmartOS, skipped"
391383
if not pytestskipmarkers.utils.platform.is_smartos():
392-
item._skipped_by_mark = True
393-
pytest.skip(reason)
384+
raise pytest.skip.Exception(reason, **exc_kwargs)
394385

395386
skip_on_freebsd_marker = item.get_closest_marker("skip_on_freebsd")
396387
if skip_on_freebsd_marker is not None:
@@ -404,8 +395,7 @@ def evaluate_markers(item):
404395
if reason is None:
405396
reason = "Skipped on FreeBSD"
406397
if pytestskipmarkers.utils.platform.is_freebsd():
407-
item._skipped_by_mark = True
408-
pytest.skip(reason)
398+
raise pytest.skip.Exception(reason, **exc_kwargs)
409399

410400
skip_unless_on_freebsd_marker = item.get_closest_marker("skip_unless_on_freebsd")
411401
if skip_unless_on_freebsd_marker is not None:
@@ -421,8 +411,7 @@ def evaluate_markers(item):
421411
if reason is None:
422412
reason = "Platform is not FreeBSD, skipped"
423413
if not pytestskipmarkers.utils.platform.is_freebsd():
424-
item._skipped_by_mark = True
425-
pytest.skip(reason)
414+
raise pytest.skip.Exception(reason, **exc_kwargs)
426415

427416
skip_on_netbsd_marker = item.get_closest_marker("skip_on_netbsd")
428417
if skip_on_netbsd_marker is not None:
@@ -436,8 +425,7 @@ def evaluate_markers(item):
436425
if reason is None:
437426
reason = "Skipped on NetBSD"
438427
if pytestskipmarkers.utils.platform.is_netbsd():
439-
item._skipped_by_mark = True
440-
pytest.skip(reason)
428+
raise pytest.skip.Exception(reason, **exc_kwargs)
441429

442430
skip_unless_on_netbsd_marker = item.get_closest_marker("skip_unless_on_netbsd")
443431
if skip_unless_on_netbsd_marker is not None:
@@ -453,8 +441,7 @@ def evaluate_markers(item):
453441
if reason is None:
454442
reason = "Platform is not NetBSD, skipped"
455443
if not pytestskipmarkers.utils.platform.is_netbsd():
456-
item._skipped_by_mark = True
457-
pytest.skip(reason)
444+
raise pytest.skip.Exception(reason, **exc_kwargs)
458445

459446
skip_on_openbsd_marker = item.get_closest_marker("skip_on_openbsd")
460447
if skip_on_openbsd_marker is not None:
@@ -468,8 +455,7 @@ def evaluate_markers(item):
468455
if reason is None:
469456
reason = "Skipped on OpenBSD"
470457
if pytestskipmarkers.utils.platform.is_openbsd():
471-
item._skipped_by_mark = True
472-
pytest.skip(reason)
458+
raise pytest.skip.Exception(reason, **exc_kwargs)
473459

474460
skip_unless_on_openbsd_marker = item.get_closest_marker("skip_unless_on_openbsd")
475461
if skip_unless_on_openbsd_marker is not None:
@@ -485,8 +471,7 @@ def evaluate_markers(item):
485471
if reason is None:
486472
reason = "Platform is not OpenBSD, skipped"
487473
if not pytestskipmarkers.utils.platform.is_openbsd():
488-
item._skipped_by_mark = True
489-
pytest.skip(reason)
474+
raise pytest.skip.Exception(reason, **exc_kwargs)
490475

491476
skip_on_aix_marker = item.get_closest_marker("skip_on_aix")
492477
if skip_on_aix_marker is not None:
@@ -500,8 +485,7 @@ def evaluate_markers(item):
500485
if reason is None:
501486
reason = "Skipped on AIX"
502487
if pytestskipmarkers.utils.platform.is_aix():
503-
item._skipped_by_mark = True
504-
pytest.skip(reason)
488+
raise pytest.skip.Exception(reason, **exc_kwargs)
505489

506490
skip_unless_on_aix_marker = item.get_closest_marker("skip_unless_on_aix")
507491
if skip_unless_on_aix_marker is not None:
@@ -515,8 +499,7 @@ def evaluate_markers(item):
515499
if reason is None:
516500
reason = "Platform is not AIX, skipped"
517501
if not pytestskipmarkers.utils.platform.is_aix():
518-
item._skipped_by_mark = True
519-
pytest.skip(reason)
502+
raise pytest.skip.Exception(reason, **exc_kwargs)
520503

521504
skip_on_aarch64_marker = item.get_closest_marker("skip_on_aarch64")
522505
if skip_on_aarch64_marker is not None:
@@ -530,8 +513,7 @@ def evaluate_markers(item):
530513
if reason is None:
531514
reason = "Skipped on AArch64"
532515
if pytestskipmarkers.utils.platform.is_aarch64():
533-
item._skipped_by_mark = True
534-
pytest.skip(reason)
516+
raise pytest.skip.Exception(reason, **exc_kwargs)
535517

536518
skip_unless_on_aarch64_marker = item.get_closest_marker("skip_unless_on_aarch64")
537519
if skip_unless_on_aarch64_marker is not None:
@@ -547,8 +529,7 @@ def evaluate_markers(item):
547529
if reason is None:
548530
reason = "Platform is not AArch64, skipped"
549531
if not pytestskipmarkers.utils.platform.is_aarch64():
550-
item._skipped_by_mark = True
551-
pytest.skip(reason)
532+
raise pytest.skip.Exception(reason, **exc_kwargs)
552533

553534
skip_on_spawning_platform_marker = item.get_closest_marker("skip_on_spawning_platform")
554535
if skip_on_spawning_platform_marker is not None:
@@ -564,8 +545,7 @@ def evaluate_markers(item):
564545
if reason is None:
565546
reason = "Skipped on spawning platforms"
566547
if pytestskipmarkers.utils.platform.is_spawning_platform():
567-
item._skipped_by_mark = True
568-
pytest.skip(reason)
548+
raise pytest.skip.Exception(reason, **exc_kwargs)
569549

570550
skip_unless_on_spawning_platform_marker = item.get_closest_marker(
571551
"skip_unless_on_spawning_platform"
@@ -583,8 +563,7 @@ def evaluate_markers(item):
583563
if reason is None:
584564
reason = "Platform does not default multiprocessing to spawn, skipped"
585565
if not pytestskipmarkers.utils.platform.is_spawning_platform():
586-
item._skipped_by_mark = True
587-
pytest.skip(reason)
566+
raise pytest.skip.Exception(reason, **exc_kwargs)
588567

589568
skip_on_platforms_marker = item.get_closest_marker("skip_on_platforms")
590569
if skip_on_platforms_marker is not None:
@@ -603,8 +582,7 @@ def evaluate_markers(item):
603582
reason = "Skipped on platform match"
604583
try:
605584
if pytestskipmarkers.utils.platform.on_platforms(**skip_on_platforms_marker.kwargs):
606-
item._skipped_by_mark = True
607-
pytest.skip(reason)
585+
raise pytest.skip.Exception(reason, **exc_kwargs)
608586
except TypeError as exc:
609587
raise pytest.UsageError(
610588
"Passed an invalid platform to skip_on_platforms: {}".format(exc)
@@ -631,8 +609,7 @@ def evaluate_markers(item):
631609
if not pytestskipmarkers.utils.platform.on_platforms(
632610
**skip_unless_on_platforms_marker.kwargs
633611
):
634-
item._skipped_by_mark = True
635-
pytest.skip(reason)
612+
raise pytest.skip.Exception(reason, **exc_kwargs)
636613
except TypeError as exc:
637614
raise pytest.UsageError(
638615
"Passed an invalid platform to skip_unless_on_platforms: {}".format(exc)

0 commit comments

Comments
 (0)