319 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			319 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Python
		
	
	
	
import sys
 | 
						|
 | 
						|
import pytest
 | 
						|
from _pytest.config import ExitCode
 | 
						|
from _pytest.pytester import Pytester
 | 
						|
 | 
						|
 | 
						|
@pytest.fixture(params=["--setup-only", "--setup-plan", "--setup-show"], scope="module")
 | 
						|
def mode(request):
 | 
						|
    return request.param
 | 
						|
 | 
						|
 | 
						|
def test_show_only_active_fixtures(
 | 
						|
    pytester: Pytester, mode, dummy_yaml_custom_test
 | 
						|
) -> None:
 | 
						|
    pytester.makepyfile(
 | 
						|
        '''
 | 
						|
        import pytest
 | 
						|
        @pytest.fixture
 | 
						|
        def _arg0():
 | 
						|
            """hidden arg0 fixture"""
 | 
						|
        @pytest.fixture
 | 
						|
        def arg1():
 | 
						|
            """arg1 docstring"""
 | 
						|
        def test_arg1(arg1):
 | 
						|
            pass
 | 
						|
    '''
 | 
						|
    )
 | 
						|
 | 
						|
    result = pytester.runpytest(mode)
 | 
						|
    assert result.ret == 0
 | 
						|
 | 
						|
    result.stdout.fnmatch_lines(
 | 
						|
        ["*SETUP    F arg1*", "*test_arg1 (fixtures used: arg1)*", "*TEARDOWN F arg1*"]
 | 
						|
    )
 | 
						|
    result.stdout.no_fnmatch_line("*_arg0*")
 | 
						|
 | 
						|
 | 
						|
def test_show_different_scopes(pytester: Pytester, mode) -> None:
 | 
						|
    p = pytester.makepyfile(
 | 
						|
        '''
 | 
						|
        import pytest
 | 
						|
        @pytest.fixture
 | 
						|
        def arg_function():
 | 
						|
            """function scoped fixture"""
 | 
						|
        @pytest.fixture(scope='session')
 | 
						|
        def arg_session():
 | 
						|
            """session scoped fixture"""
 | 
						|
        def test_arg1(arg_session, arg_function):
 | 
						|
            pass
 | 
						|
    '''
 | 
						|
    )
 | 
						|
 | 
						|
    result = pytester.runpytest(mode, p)
 | 
						|
    assert result.ret == 0
 | 
						|
 | 
						|
    result.stdout.fnmatch_lines(
 | 
						|
        [
 | 
						|
            "SETUP    S arg_session*",
 | 
						|
            "*SETUP    F arg_function*",
 | 
						|
            "*test_arg1 (fixtures used: arg_function, arg_session)*",
 | 
						|
            "*TEARDOWN F arg_function*",
 | 
						|
            "TEARDOWN S arg_session*",
 | 
						|
        ]
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def test_show_nested_fixtures(pytester: Pytester, mode) -> None:
 | 
						|
    pytester.makeconftest(
 | 
						|
        '''
 | 
						|
        import pytest
 | 
						|
        @pytest.fixture(scope='session')
 | 
						|
        def arg_same():
 | 
						|
            """session scoped fixture"""
 | 
						|
        '''
 | 
						|
    )
 | 
						|
    p = pytester.makepyfile(
 | 
						|
        '''
 | 
						|
        import pytest
 | 
						|
        @pytest.fixture(scope='function')
 | 
						|
        def arg_same(arg_same):
 | 
						|
            """function scoped fixture"""
 | 
						|
        def test_arg1(arg_same):
 | 
						|
            pass
 | 
						|
    '''
 | 
						|
    )
 | 
						|
 | 
						|
    result = pytester.runpytest(mode, p)
 | 
						|
    assert result.ret == 0
 | 
						|
 | 
						|
    result.stdout.fnmatch_lines(
 | 
						|
        [
 | 
						|
            "SETUP    S arg_same*",
 | 
						|
            "*SETUP    F arg_same (fixtures used: arg_same)*",
 | 
						|
            "*test_arg1 (fixtures used: arg_same)*",
 | 
						|
            "*TEARDOWN F arg_same*",
 | 
						|
            "TEARDOWN S arg_same*",
 | 
						|
        ]
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def test_show_fixtures_with_autouse(pytester: Pytester, mode) -> None:
 | 
						|
    p = pytester.makepyfile(
 | 
						|
        '''
 | 
						|
        import pytest
 | 
						|
        @pytest.fixture
 | 
						|
        def arg_function():
 | 
						|
            """function scoped fixture"""
 | 
						|
        @pytest.fixture(scope='session', autouse=True)
 | 
						|
        def arg_session():
 | 
						|
            """session scoped fixture"""
 | 
						|
        def test_arg1(arg_function):
 | 
						|
            pass
 | 
						|
    '''
 | 
						|
    )
 | 
						|
 | 
						|
    result = pytester.runpytest(mode, p)
 | 
						|
    assert result.ret == 0
 | 
						|
 | 
						|
    result.stdout.fnmatch_lines(
 | 
						|
        [
 | 
						|
            "SETUP    S arg_session*",
 | 
						|
            "*SETUP    F arg_function*",
 | 
						|
            "*test_arg1 (fixtures used: arg_function, arg_session)*",
 | 
						|
        ]
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def test_show_fixtures_with_parameters(pytester: Pytester, mode) -> None:
 | 
						|
    pytester.makeconftest(
 | 
						|
        '''
 | 
						|
        import pytest
 | 
						|
        @pytest.fixture(scope='session', params=['foo', 'bar'])
 | 
						|
        def arg_same():
 | 
						|
            """session scoped fixture"""
 | 
						|
        '''
 | 
						|
    )
 | 
						|
    p = pytester.makepyfile(
 | 
						|
        '''
 | 
						|
        import pytest
 | 
						|
        @pytest.fixture(scope='function')
 | 
						|
        def arg_other(arg_same):
 | 
						|
            """function scoped fixture"""
 | 
						|
        def test_arg1(arg_other):
 | 
						|
            pass
 | 
						|
    '''
 | 
						|
    )
 | 
						|
 | 
						|
    result = pytester.runpytest(mode, p)
 | 
						|
    assert result.ret == 0
 | 
						|
 | 
						|
    result.stdout.fnmatch_lines(
 | 
						|
        [
 | 
						|
            "SETUP    S arg_same?'foo'?",
 | 
						|
            "TEARDOWN S arg_same?'foo'?",
 | 
						|
            "SETUP    S arg_same?'bar'?",
 | 
						|
            "TEARDOWN S arg_same?'bar'?",
 | 
						|
        ]
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def test_show_fixtures_with_parameter_ids(pytester: Pytester, mode) -> None:
 | 
						|
    pytester.makeconftest(
 | 
						|
        '''
 | 
						|
        import pytest
 | 
						|
        @pytest.fixture(
 | 
						|
            scope='session', params=['foo', 'bar'], ids=['spam', 'ham'])
 | 
						|
        def arg_same():
 | 
						|
            """session scoped fixture"""
 | 
						|
        '''
 | 
						|
    )
 | 
						|
    p = pytester.makepyfile(
 | 
						|
        '''
 | 
						|
        import pytest
 | 
						|
        @pytest.fixture(scope='function')
 | 
						|
        def arg_other(arg_same):
 | 
						|
            """function scoped fixture"""
 | 
						|
        def test_arg1(arg_other):
 | 
						|
            pass
 | 
						|
    '''
 | 
						|
    )
 | 
						|
 | 
						|
    result = pytester.runpytest(mode, p)
 | 
						|
    assert result.ret == 0
 | 
						|
 | 
						|
    result.stdout.fnmatch_lines(
 | 
						|
        ["SETUP    S arg_same?'spam'?", "SETUP    S arg_same?'ham'?"]
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def test_show_fixtures_with_parameter_ids_function(pytester: Pytester, mode) -> None:
 | 
						|
    p = pytester.makepyfile(
 | 
						|
        """
 | 
						|
        import pytest
 | 
						|
        @pytest.fixture(params=['foo', 'bar'], ids=lambda p: p.upper())
 | 
						|
        def foobar():
 | 
						|
            pass
 | 
						|
        def test_foobar(foobar):
 | 
						|
            pass
 | 
						|
    """
 | 
						|
    )
 | 
						|
 | 
						|
    result = pytester.runpytest(mode, p)
 | 
						|
    assert result.ret == 0
 | 
						|
 | 
						|
    result.stdout.fnmatch_lines(
 | 
						|
        ["*SETUP    F foobar?'FOO'?", "*SETUP    F foobar?'BAR'?"]
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def test_dynamic_fixture_request(pytester: Pytester) -> None:
 | 
						|
    p = pytester.makepyfile(
 | 
						|
        """
 | 
						|
        import pytest
 | 
						|
        @pytest.fixture()
 | 
						|
        def dynamically_requested_fixture():
 | 
						|
            pass
 | 
						|
        @pytest.fixture()
 | 
						|
        def dependent_fixture(request):
 | 
						|
            request.getfixturevalue('dynamically_requested_fixture')
 | 
						|
        def test_dyn(dependent_fixture):
 | 
						|
            pass
 | 
						|
    """
 | 
						|
    )
 | 
						|
 | 
						|
    result = pytester.runpytest("--setup-only", p)
 | 
						|
    assert result.ret == 0
 | 
						|
 | 
						|
    result.stdout.fnmatch_lines(
 | 
						|
        [
 | 
						|
            "*SETUP    F dynamically_requested_fixture",
 | 
						|
            "*TEARDOWN F dynamically_requested_fixture",
 | 
						|
        ]
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def test_capturing(pytester: Pytester) -> None:
 | 
						|
    p = pytester.makepyfile(
 | 
						|
        """
 | 
						|
        import pytest, sys
 | 
						|
        @pytest.fixture()
 | 
						|
        def one():
 | 
						|
            sys.stdout.write('this should be captured')
 | 
						|
            sys.stderr.write('this should also be captured')
 | 
						|
        @pytest.fixture()
 | 
						|
        def two(one):
 | 
						|
            assert 0
 | 
						|
        def test_capturing(two):
 | 
						|
            pass
 | 
						|
    """
 | 
						|
    )
 | 
						|
 | 
						|
    result = pytester.runpytest("--setup-only", p)
 | 
						|
    result.stdout.fnmatch_lines(
 | 
						|
        ["this should be captured", "this should also be captured"]
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def test_show_fixtures_and_execute_test(pytester: Pytester) -> None:
 | 
						|
    """Verify that setups are shown and tests are executed."""
 | 
						|
    p = pytester.makepyfile(
 | 
						|
        """
 | 
						|
        import pytest
 | 
						|
        @pytest.fixture
 | 
						|
        def arg():
 | 
						|
            assert True
 | 
						|
        def test_arg(arg):
 | 
						|
            assert False
 | 
						|
    """
 | 
						|
    )
 | 
						|
 | 
						|
    result = pytester.runpytest("--setup-show", p)
 | 
						|
    assert result.ret == 1
 | 
						|
 | 
						|
    result.stdout.fnmatch_lines(
 | 
						|
        ["*SETUP    F arg*", "*test_arg (fixtures used: arg)F*", "*TEARDOWN F arg*"]
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def test_setup_show_with_KeyboardInterrupt_in_test(pytester: Pytester) -> None:
 | 
						|
    p = pytester.makepyfile(
 | 
						|
        """
 | 
						|
        import pytest
 | 
						|
        @pytest.fixture
 | 
						|
        def arg():
 | 
						|
            pass
 | 
						|
        def test_arg(arg):
 | 
						|
            raise KeyboardInterrupt()
 | 
						|
    """
 | 
						|
    )
 | 
						|
    result = pytester.runpytest("--setup-show", p, no_reraise_ctrlc=True)
 | 
						|
    result.stdout.fnmatch_lines(
 | 
						|
        [
 | 
						|
            "*SETUP    F arg*",
 | 
						|
            "*test_arg (fixtures used: arg)*",
 | 
						|
            "*TEARDOWN F arg*",
 | 
						|
            "*! KeyboardInterrupt !*",
 | 
						|
            "*= no tests ran in *",
 | 
						|
        ]
 | 
						|
    )
 | 
						|
    assert result.ret == ExitCode.INTERRUPTED
 | 
						|
 | 
						|
 | 
						|
def test_show_fixture_action_with_bytes(pytester: Pytester) -> None:
 | 
						|
    # Issue 7126, BytesWarning when using --setup-show with bytes parameter
 | 
						|
    test_file = pytester.makepyfile(
 | 
						|
        """
 | 
						|
        import pytest
 | 
						|
 | 
						|
        @pytest.mark.parametrize('data', [b'Hello World'])
 | 
						|
        def test_data(data):
 | 
						|
            pass
 | 
						|
        """
 | 
						|
    )
 | 
						|
    result = pytester.run(
 | 
						|
        sys.executable, "-bb", "-m", "pytest", "--setup-show", str(test_file)
 | 
						|
    )
 | 
						|
    assert result.ret == 0
 |