diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9e8d3b6fe..17c0bf788 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,6 +16,7 @@ concurrency: cancel-in-progress: true env: + PYTHONDEVMODE: 1 PIP_BREAK_SYSTEM_PACKAGES: 1 PIP_ONLY_BINARY: numpy FORCE_COLOR: 3 diff --git a/.github/workflows/reusable-standard.yml b/.github/workflows/reusable-standard.yml index d3c769449..17837858e 100644 --- a/.github/workflows/reusable-standard.yml +++ b/.github/workflows/reusable-standard.yml @@ -14,6 +14,16 @@ on: required: true type: string +env: + PYTHONDEVMODE: 1 + PIP_BREAK_SYSTEM_PACKAGES: 1 + PIP_ONLY_BINARY: numpy + FORCE_COLOR: 3 + PYTEST_TIMEOUT: 300 + # For cmake: + VERBOSE: 1 + CMAKE_COLOR_DIAGNOSTICS: 1 + jobs: standard: name: 🧪 diff --git a/tests/conftest.py b/tests/conftest.py index b8338d46f..5f515378b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -206,6 +206,8 @@ def gc_collect(): gc.collect() gc.collect() gc.collect() + gc.collect() + gc.collect() def pytest_configure(): diff --git a/tests/test_methods_and_attributes.py b/tests/test_methods_and_attributes.py index cc3a51e0d..6a8d993cb 100644 --- a/tests/test_methods_and_attributes.py +++ b/tests/test_methods_and_attributes.py @@ -305,11 +305,9 @@ def test_property_rvalue_policy(): # https://foss.heptapod.net/pypy/pypy/-/issues/2447 @pytest.mark.xfail("env.PYPY") -@pytest.mark.xfail( - sys.version_info == (3, 14, 0, "beta", 1) - or sys.version_info == (3, 14, 0, "beta", 2), - reason="3.14.0b1/2 bug: https://github.com/python/cpython/issues/133912", - strict=True, +@pytest.mark.skipif( + sys.version_info in ((3, 14, 0, "beta", 1), (3, 14, 0, "beta", 2)), + reason="3.14.0b1/2 managed dict bug: https://github.com/python/cpython/issues/133912", ) def test_dynamic_attributes(): instance = m.DynamicClass() @@ -337,25 +335,31 @@ def test_dynamic_attributes(): cstats = ConstructorStats.get(m.DynamicClass) assert cstats.alive() == 1 del instance + pytest.gc_collect() assert cstats.alive() == 0 # Derived classes should work as well class PythonDerivedDynamicClass(m.DynamicClass): pass - for cls in m.CppDerivedDynamicClass, PythonDerivedDynamicClass: + for cls in (m.CppDerivedDynamicClass, PythonDerivedDynamicClass): derived = cls() derived.foobar = 100 assert derived.foobar == 100 assert cstats.alive() == 1 del derived + pytest.gc_collect() assert cstats.alive() == 0 # https://foss.heptapod.net/pypy/pypy/-/issues/2447 @pytest.mark.xfail("env.PYPY") @pytest.mark.skipif("env.GRAALPY", reason="Cannot reliably trigger GC") +@pytest.mark.skipif( + sys.version_info in ((3, 14, 0, "beta", 1), (3, 14, 0, "beta", 2)), + reason="3.14.0b1/2 managed dict bug: https://github.com/python/cpython/issues/133912", +) def test_cyclic_gc(): # One object references itself instance = m.DynamicClass() @@ -364,6 +368,7 @@ def test_cyclic_gc(): cstats = ConstructorStats.get(m.DynamicClass) assert cstats.alive() == 1 del instance + pytest.gc_collect() assert cstats.alive() == 0 # Two object reference each other @@ -374,6 +379,7 @@ def test_cyclic_gc(): assert cstats.alive() == 2 del i1, i2 + pytest.gc_collect() assert cstats.alive() == 0 diff --git a/tests/test_pickling.py b/tests/test_pickling.py index 56f91cc4b..9febc3f6a 100644 --- a/tests/test_pickling.py +++ b/tests/test_pickling.py @@ -68,11 +68,9 @@ def test_roundtrip(cls_name): [ pytest.param( "PickleableWithDict", - marks=pytest.mark.xfail( - sys.version_info == (3, 14, 0, "beta", 1) - or sys.version_info == (3, 14, 0, "beta", 2), - reason="3.14.0b1/2 bug: https://github.com/python/cpython/issues/133912", - strict=True, + marks=pytest.mark.skipif( + sys.version_info in ((3, 14, 0, "beta", 1), (3, 14, 0, "beta", 2)), + reason="3.14.0b1/2 managed dict bug: https://github.com/python/cpython/issues/133912", ), ), "PickleableWithDictNew",