pytest-dev / pytest-forked

extracted --boxed from pytest-xdist to ensure backward compat
MIT License
62 stars 21 forks source link

Allow marked tests to be skipped under Windows #44

Open webknjaz opened 4 years ago

webknjaz commented 4 years ago

Currently, if the test is marked with forked, this plugin tries to run it in a forked subprocess regardless of the current env. Also, adding a conditional skip marker does not help and manifests itself as https://github.com/pytest-dev/pytest/issues/7327.

The following snippet still runs on Windows:

@pytest.mark.skipif(IS_WINDOWS, ...)
@pytest.mark.forked
def test():
    ...

The workaround that I currently use is:

@pytest.mark.skipif(IS_WINDOWS, ...)
def test():
    ...

if not IS_WINDOWS:
    test = pytest.mark.forked(test)

This could be addressed in a few ways:

  1. Actually respect skip markers.
  2. Skip any tests marked with forked when the env is not supported.
  3. Run these tests but w/o trying to sandbox them.

I think I like 1+2 most.

moble commented 3 years ago

For me, the easiest workaround is just to use a different decorator:

import sys
import pytest

if sys.platform == "win32":
    forked = pytest.mark.skip(reason="Windows doesn't fork")
else:
    forked = pytest.mark.forked

@forked
def test_thing_in_fork():
    ...

The first branch could also be forked = lambda f: f to fall back to non-forking, as in option 3 above.

untitaker commented 3 years ago

~You can write this, place it anywhere in conftest and use the marker like normal:~

@pytest.fixture(autouse=True)
def skip_forked_tests_on_windows(request):
    if request.node.get_closest_marker("forked") and sys.platform == "win32":
        pytest.skip("Windows doesn't work")

EDIT: Ah the fixture is only executed in the forked process, that's a bummer