Merge pull request #12121 from jakkdl/test_scope_fixture_caching
Add tests to ensure setup&finalization for scoped fixtures only run once.
This commit is contained in:
		
						commit
						c203f1615c
					
				| 
						 | 
				
			
			@ -4622,3 +4622,77 @@ def test_staticmethod_classmethod_fixture_instance(pytester: Pytester) -> None:
 | 
			
		|||
    result = pytester.runpytest()
 | 
			
		||||
    assert result.ret == ExitCode.OK
 | 
			
		||||
    result.assert_outcomes(passed=3)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_scoped_fixture_caching(pytester: Pytester) -> None:
 | 
			
		||||
    """Make sure setup and finalization is only run once when using scoped fixture
 | 
			
		||||
    multiple times."""
 | 
			
		||||
    pytester.makepyfile(
 | 
			
		||||
        """
 | 
			
		||||
        from __future__ import annotations
 | 
			
		||||
 | 
			
		||||
        from typing import Generator
 | 
			
		||||
 | 
			
		||||
        import pytest
 | 
			
		||||
        executed: list[str] = []
 | 
			
		||||
        @pytest.fixture(scope="class")
 | 
			
		||||
        def fixture_1() -> Generator[None, None, None]:
 | 
			
		||||
            executed.append("fix setup")
 | 
			
		||||
            yield
 | 
			
		||||
            executed.append("fix teardown")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        class TestFixtureCaching:
 | 
			
		||||
            def test_1(self, fixture_1: None) -> None:
 | 
			
		||||
                assert executed == ["fix setup"]
 | 
			
		||||
 | 
			
		||||
            def test_2(self, fixture_1: None) -> None:
 | 
			
		||||
                assert executed == ["fix setup"]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        def test_expected_setup_and_teardown() -> None:
 | 
			
		||||
            assert executed == ["fix setup", "fix teardown"]
 | 
			
		||||
        """
 | 
			
		||||
    )
 | 
			
		||||
    result = pytester.runpytest()
 | 
			
		||||
    assert result.ret == 0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_scoped_fixture_caching_exception(pytester: Pytester) -> None:
 | 
			
		||||
    """Make sure setup & finalization is only run once for scoped fixture, with a cached exception."""
 | 
			
		||||
    pytester.makepyfile(
 | 
			
		||||
        """
 | 
			
		||||
        from __future__ import annotations
 | 
			
		||||
 | 
			
		||||
        import pytest
 | 
			
		||||
        executed_crash: list[str] = []
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        @pytest.fixture(scope="class")
 | 
			
		||||
        def fixture_crash(request: pytest.FixtureRequest) -> None:
 | 
			
		||||
            executed_crash.append("fix_crash setup")
 | 
			
		||||
 | 
			
		||||
            def my_finalizer() -> None:
 | 
			
		||||
                executed_crash.append("fix_crash teardown")
 | 
			
		||||
 | 
			
		||||
            request.addfinalizer(my_finalizer)
 | 
			
		||||
 | 
			
		||||
            raise Exception("foo")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        class TestFixtureCachingException:
 | 
			
		||||
            @pytest.mark.xfail
 | 
			
		||||
            def test_crash_1(self, fixture_crash: None) -> None:
 | 
			
		||||
                ...
 | 
			
		||||
 | 
			
		||||
            @pytest.mark.xfail
 | 
			
		||||
            def test_crash_2(self, fixture_crash: None) -> None:
 | 
			
		||||
                ...
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        def test_crash_expected_setup_and_teardown() -> None:
 | 
			
		||||
            assert executed_crash == ["fix_crash setup", "fix_crash teardown"]
 | 
			
		||||
        """
 | 
			
		||||
    )
 | 
			
		||||
    result = pytester.runpytest()
 | 
			
		||||
    assert result.ret == 0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue