425 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			425 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
import pytest
 | 
						|
 | 
						|
 | 
						|
def setup_module(mod):
 | 
						|
    mod.nose = pytest.importorskip("nose")
 | 
						|
 | 
						|
 | 
						|
def test_nose_setup(testdir):
 | 
						|
    p = testdir.makepyfile(
 | 
						|
        """
 | 
						|
        values = []
 | 
						|
        from nose.tools import with_setup
 | 
						|
 | 
						|
        @with_setup(lambda: values.append(1), lambda: values.append(2))
 | 
						|
        def test_hello():
 | 
						|
            assert values == [1]
 | 
						|
 | 
						|
        def test_world():
 | 
						|
            assert values == [1,2]
 | 
						|
 | 
						|
        test_hello.setup = lambda: values.append(1)
 | 
						|
        test_hello.teardown = lambda: values.append(2)
 | 
						|
    """
 | 
						|
    )
 | 
						|
    result = testdir.runpytest(p, "-p", "nose")
 | 
						|
    result.assert_outcomes(passed=2)
 | 
						|
 | 
						|
 | 
						|
def test_setup_func_with_setup_decorator():
 | 
						|
    from _pytest.nose import call_optional
 | 
						|
 | 
						|
    values = []
 | 
						|
 | 
						|
    class A:
 | 
						|
        @pytest.fixture(autouse=True)
 | 
						|
        def f(self):
 | 
						|
            values.append(1)
 | 
						|
 | 
						|
    call_optional(A(), "f")
 | 
						|
    assert not values
 | 
						|
 | 
						|
 | 
						|
def test_setup_func_not_callable():
 | 
						|
    from _pytest.nose import call_optional
 | 
						|
 | 
						|
    class A:
 | 
						|
        f = 1
 | 
						|
 | 
						|
    call_optional(A(), "f")
 | 
						|
 | 
						|
 | 
						|
def test_nose_setup_func(testdir):
 | 
						|
    p = testdir.makepyfile(
 | 
						|
        """
 | 
						|
        from nose.tools import with_setup
 | 
						|
 | 
						|
        values = []
 | 
						|
 | 
						|
        def my_setup():
 | 
						|
            a = 1
 | 
						|
            values.append(a)
 | 
						|
 | 
						|
        def my_teardown():
 | 
						|
            b = 2
 | 
						|
            values.append(b)
 | 
						|
 | 
						|
        @with_setup(my_setup, my_teardown)
 | 
						|
        def test_hello():
 | 
						|
            print(values)
 | 
						|
            assert values == [1]
 | 
						|
 | 
						|
        def test_world():
 | 
						|
            print(values)
 | 
						|
            assert values == [1,2]
 | 
						|
 | 
						|
    """
 | 
						|
    )
 | 
						|
    result = testdir.runpytest(p, "-p", "nose")
 | 
						|
    result.assert_outcomes(passed=2)
 | 
						|
 | 
						|
 | 
						|
def test_nose_setup_func_failure(testdir):
 | 
						|
    p = testdir.makepyfile(
 | 
						|
        """
 | 
						|
        from nose.tools import with_setup
 | 
						|
 | 
						|
        values = []
 | 
						|
        my_setup = lambda x: 1
 | 
						|
        my_teardown = lambda x: 2
 | 
						|
 | 
						|
        @with_setup(my_setup, my_teardown)
 | 
						|
        def test_hello():
 | 
						|
            print(values)
 | 
						|
            assert values == [1]
 | 
						|
 | 
						|
        def test_world():
 | 
						|
            print(values)
 | 
						|
            assert values == [1,2]
 | 
						|
 | 
						|
    """
 | 
						|
    )
 | 
						|
    result = testdir.runpytest(p, "-p", "nose")
 | 
						|
    result.stdout.fnmatch_lines(["*TypeError: <lambda>()*"])
 | 
						|
 | 
						|
 | 
						|
def test_nose_setup_func_failure_2(testdir):
 | 
						|
    testdir.makepyfile(
 | 
						|
        """
 | 
						|
        values = []
 | 
						|
 | 
						|
        my_setup = 1
 | 
						|
        my_teardown = 2
 | 
						|
 | 
						|
        def test_hello():
 | 
						|
            assert values == []
 | 
						|
 | 
						|
        test_hello.setup = my_setup
 | 
						|
        test_hello.teardown = my_teardown
 | 
						|
    """
 | 
						|
    )
 | 
						|
    reprec = testdir.inline_run()
 | 
						|
    reprec.assertoutcome(passed=1)
 | 
						|
 | 
						|
 | 
						|
def test_nose_setup_partial(testdir):
 | 
						|
    pytest.importorskip("functools")
 | 
						|
    p = testdir.makepyfile(
 | 
						|
        """
 | 
						|
        from functools import partial
 | 
						|
 | 
						|
        values = []
 | 
						|
 | 
						|
        def my_setup(x):
 | 
						|
            a = x
 | 
						|
            values.append(a)
 | 
						|
 | 
						|
        def my_teardown(x):
 | 
						|
            b = x
 | 
						|
            values.append(b)
 | 
						|
 | 
						|
        my_setup_partial = partial(my_setup, 1)
 | 
						|
        my_teardown_partial = partial(my_teardown, 2)
 | 
						|
 | 
						|
        def test_hello():
 | 
						|
            print(values)
 | 
						|
            assert values == [1]
 | 
						|
 | 
						|
        def test_world():
 | 
						|
            print(values)
 | 
						|
            assert values == [1,2]
 | 
						|
 | 
						|
        test_hello.setup = my_setup_partial
 | 
						|
        test_hello.teardown = my_teardown_partial
 | 
						|
    """
 | 
						|
    )
 | 
						|
    result = testdir.runpytest(p, "-p", "nose")
 | 
						|
    result.stdout.fnmatch_lines(["*2 passed*"])
 | 
						|
 | 
						|
 | 
						|
def test_module_level_setup(testdir):
 | 
						|
    testdir.makepyfile(
 | 
						|
        """
 | 
						|
        from nose.tools import with_setup
 | 
						|
        items = {}
 | 
						|
 | 
						|
        def setup():
 | 
						|
            items[1]=1
 | 
						|
 | 
						|
        def teardown():
 | 
						|
            del items[1]
 | 
						|
 | 
						|
        def setup2():
 | 
						|
            items[2] = 2
 | 
						|
 | 
						|
        def teardown2():
 | 
						|
            del items[2]
 | 
						|
 | 
						|
        def test_setup_module_setup():
 | 
						|
            assert items[1] == 1
 | 
						|
 | 
						|
        @with_setup(setup2, teardown2)
 | 
						|
        def test_local_setup():
 | 
						|
            assert items[2] == 2
 | 
						|
            assert 1 not in items
 | 
						|
    """
 | 
						|
    )
 | 
						|
    result = testdir.runpytest("-p", "nose")
 | 
						|
    result.stdout.fnmatch_lines(["*2 passed*"])
 | 
						|
 | 
						|
 | 
						|
def test_nose_style_setup_teardown(testdir):
 | 
						|
    testdir.makepyfile(
 | 
						|
        """
 | 
						|
        values = []
 | 
						|
 | 
						|
        def setup_module():
 | 
						|
            values.append(1)
 | 
						|
 | 
						|
        def teardown_module():
 | 
						|
            del values[0]
 | 
						|
 | 
						|
        def test_hello():
 | 
						|
            assert values == [1]
 | 
						|
 | 
						|
        def test_world():
 | 
						|
            assert values == [1]
 | 
						|
        """
 | 
						|
    )
 | 
						|
    result = testdir.runpytest("-p", "nose")
 | 
						|
    result.stdout.fnmatch_lines(["*2 passed*"])
 | 
						|
 | 
						|
 | 
						|
def test_nose_setup_ordering(testdir):
 | 
						|
    testdir.makepyfile(
 | 
						|
        """
 | 
						|
        def setup_module(mod):
 | 
						|
            mod.visited = True
 | 
						|
 | 
						|
        class TestClass(object):
 | 
						|
            def setup(self):
 | 
						|
                assert visited
 | 
						|
            def test_first(self):
 | 
						|
                pass
 | 
						|
        """
 | 
						|
    )
 | 
						|
    result = testdir.runpytest()
 | 
						|
    result.stdout.fnmatch_lines(["*1 passed*"])
 | 
						|
 | 
						|
 | 
						|
def test_apiwrapper_problem_issue260(testdir):
 | 
						|
    # this would end up trying a call an optional teardown on the class
 | 
						|
    # for plain unittests we don't want nose behaviour
 | 
						|
    testdir.makepyfile(
 | 
						|
        """
 | 
						|
        import unittest
 | 
						|
        class TestCase(unittest.TestCase):
 | 
						|
            def setup(self):
 | 
						|
                #should not be called in unittest testcases
 | 
						|
                assert 0, 'setup'
 | 
						|
            def teardown(self):
 | 
						|
                #should not be called in unittest testcases
 | 
						|
                assert 0, 'teardown'
 | 
						|
            def setUp(self):
 | 
						|
                print('setup')
 | 
						|
            def tearDown(self):
 | 
						|
                print('teardown')
 | 
						|
            def test_fun(self):
 | 
						|
                pass
 | 
						|
        """
 | 
						|
    )
 | 
						|
    result = testdir.runpytest()
 | 
						|
    result.assert_outcomes(passed=1)
 | 
						|
 | 
						|
 | 
						|
def test_setup_teardown_linking_issue265(testdir):
 | 
						|
    # we accidentally didn't integrate nose setupstate with normal setupstate
 | 
						|
    # this test ensures that won't happen again
 | 
						|
    testdir.makepyfile(
 | 
						|
        '''
 | 
						|
        import pytest
 | 
						|
 | 
						|
        class TestGeneric(object):
 | 
						|
            def test_nothing(self):
 | 
						|
                """Tests the API of the implementation (for generic and specialized)."""
 | 
						|
 | 
						|
        @pytest.mark.skipif("True", reason=
 | 
						|
                    "Skip tests to check if teardown is skipped as well.")
 | 
						|
        class TestSkipTeardown(TestGeneric):
 | 
						|
 | 
						|
            def setup(self):
 | 
						|
                """Sets up my specialized implementation for $COOL_PLATFORM."""
 | 
						|
                raise Exception("should not call setup for skipped tests")
 | 
						|
 | 
						|
            def teardown(self):
 | 
						|
                """Undoes the setup."""
 | 
						|
                raise Exception("should not call teardown for skipped tests")
 | 
						|
        '''
 | 
						|
    )
 | 
						|
    reprec = testdir.runpytest()
 | 
						|
    reprec.assert_outcomes(passed=1, skipped=1)
 | 
						|
 | 
						|
 | 
						|
def test_SkipTest_during_collection(testdir):
 | 
						|
    p = testdir.makepyfile(
 | 
						|
        """
 | 
						|
        import nose
 | 
						|
        raise nose.SkipTest("during collection")
 | 
						|
        def test_failing():
 | 
						|
            assert False
 | 
						|
        """
 | 
						|
    )
 | 
						|
    result = testdir.runpytest(p)
 | 
						|
    result.assert_outcomes(skipped=1)
 | 
						|
 | 
						|
 | 
						|
def test_SkipTest_in_test(testdir):
 | 
						|
    testdir.makepyfile(
 | 
						|
        """
 | 
						|
        import nose
 | 
						|
 | 
						|
        def test_skipping():
 | 
						|
            raise nose.SkipTest("in test")
 | 
						|
        """
 | 
						|
    )
 | 
						|
    reprec = testdir.inline_run()
 | 
						|
    reprec.assertoutcome(skipped=1)
 | 
						|
 | 
						|
 | 
						|
def test_istest_function_decorator(testdir):
 | 
						|
    p = testdir.makepyfile(
 | 
						|
        """
 | 
						|
        import nose.tools
 | 
						|
        @nose.tools.istest
 | 
						|
        def not_test_prefix():
 | 
						|
            pass
 | 
						|
        """
 | 
						|
    )
 | 
						|
    result = testdir.runpytest(p)
 | 
						|
    result.assert_outcomes(passed=1)
 | 
						|
 | 
						|
 | 
						|
def test_nottest_function_decorator(testdir):
 | 
						|
    testdir.makepyfile(
 | 
						|
        """
 | 
						|
        import nose.tools
 | 
						|
        @nose.tools.nottest
 | 
						|
        def test_prefix():
 | 
						|
            pass
 | 
						|
        """
 | 
						|
    )
 | 
						|
    reprec = testdir.inline_run()
 | 
						|
    assert not reprec.getfailedcollections()
 | 
						|
    calls = reprec.getreports("pytest_runtest_logreport")
 | 
						|
    assert not calls
 | 
						|
 | 
						|
 | 
						|
def test_istest_class_decorator(testdir):
 | 
						|
    p = testdir.makepyfile(
 | 
						|
        """
 | 
						|
        import nose.tools
 | 
						|
        @nose.tools.istest
 | 
						|
        class NotTestPrefix(object):
 | 
						|
            def test_method(self):
 | 
						|
                pass
 | 
						|
        """
 | 
						|
    )
 | 
						|
    result = testdir.runpytest(p)
 | 
						|
    result.assert_outcomes(passed=1)
 | 
						|
 | 
						|
 | 
						|
def test_nottest_class_decorator(testdir):
 | 
						|
    testdir.makepyfile(
 | 
						|
        """
 | 
						|
        import nose.tools
 | 
						|
        @nose.tools.nottest
 | 
						|
        class TestPrefix(object):
 | 
						|
            def test_method(self):
 | 
						|
                pass
 | 
						|
        """
 | 
						|
    )
 | 
						|
    reprec = testdir.inline_run()
 | 
						|
    assert not reprec.getfailedcollections()
 | 
						|
    calls = reprec.getreports("pytest_runtest_logreport")
 | 
						|
    assert not calls
 | 
						|
 | 
						|
 | 
						|
def test_skip_test_with_unicode(testdir):
 | 
						|
    testdir.makepyfile(
 | 
						|
        """\
 | 
						|
        import unittest
 | 
						|
        class TestClass():
 | 
						|
            def test_io(self):
 | 
						|
                raise unittest.SkipTest('😊')
 | 
						|
        """
 | 
						|
    )
 | 
						|
    result = testdir.runpytest()
 | 
						|
    result.stdout.fnmatch_lines(["* 1 skipped *"])
 | 
						|
 | 
						|
 | 
						|
def test_raises(testdir):
 | 
						|
    testdir.makepyfile(
 | 
						|
        """
 | 
						|
        from nose.tools import raises
 | 
						|
 | 
						|
        @raises(RuntimeError)
 | 
						|
        def test_raises_runtimeerror():
 | 
						|
            raise RuntimeError
 | 
						|
 | 
						|
        @raises(Exception)
 | 
						|
        def test_raises_baseexception_not_caught():
 | 
						|
            raise BaseException
 | 
						|
 | 
						|
        @raises(BaseException)
 | 
						|
        def test_raises_baseexception_caught():
 | 
						|
            raise BaseException
 | 
						|
        """
 | 
						|
    )
 | 
						|
    result = testdir.runpytest("-vv")
 | 
						|
    result.stdout.fnmatch_lines(
 | 
						|
        [
 | 
						|
            "test_raises.py::test_raises_runtimeerror PASSED*",
 | 
						|
            "test_raises.py::test_raises_baseexception_not_caught FAILED*",
 | 
						|
            "test_raises.py::test_raises_baseexception_caught PASSED*",
 | 
						|
            "*= FAILURES =*",
 | 
						|
            "*_ test_raises_baseexception_not_caught _*",
 | 
						|
            "",
 | 
						|
            "arg = (), kw = {}",
 | 
						|
            "",
 | 
						|
            "    def newfunc(*arg, **kw):",
 | 
						|
            "        try:",
 | 
						|
            ">           func(*arg, **kw)",
 | 
						|
            "",
 | 
						|
            "*/nose/*: ",
 | 
						|
            "_ _ *",
 | 
						|
            "",
 | 
						|
            "    @raises(Exception)",
 | 
						|
            "    def test_raises_baseexception_not_caught():",
 | 
						|
            ">       raise BaseException",
 | 
						|
            "E       BaseException",
 | 
						|
            "",
 | 
						|
            "test_raises.py:9: BaseException",
 | 
						|
            "* 1 failed, 2 passed *",
 | 
						|
        ]
 | 
						|
    )
 |