diff options
Diffstat (limited to 'tests/wpt/web-platform-tests/tools/pytest/testing/python/fixture.py')
-rw-r--r-- | tests/wpt/web-platform-tests/tools/pytest/testing/python/fixture.py | 2693 |
1 files changed, 0 insertions, 2693 deletions
diff --git a/tests/wpt/web-platform-tests/tools/pytest/testing/python/fixture.py b/tests/wpt/web-platform-tests/tools/pytest/testing/python/fixture.py deleted file mode 100644 index 506d8426e3c..00000000000 --- a/tests/wpt/web-platform-tests/tools/pytest/testing/python/fixture.py +++ /dev/null @@ -1,2693 +0,0 @@ -from textwrap import dedent - -import _pytest._code -import pytest -import sys -from _pytest import python as funcargs -from _pytest.pytester import get_public_names -from _pytest.python import FixtureLookupError - - -def test_getfuncargnames(): - def f(): pass - assert not funcargs.getfuncargnames(f) - def g(arg): pass - assert funcargs.getfuncargnames(g) == ('arg',) - def h(arg1, arg2="hello"): pass - assert funcargs.getfuncargnames(h) == ('arg1',) - def h(arg1, arg2, arg3="hello"): pass - assert funcargs.getfuncargnames(h) == ('arg1', 'arg2') - class A: - def f(self, arg1, arg2="hello"): - pass - assert funcargs.getfuncargnames(A().f) == ('arg1',) - if sys.version_info < (3,0): - assert funcargs.getfuncargnames(A.f) == ('arg1',) - -class TestFillFixtures: - def test_fillfuncargs_exposed(self): - # used by oejskit, kept for compatibility - assert pytest._fillfuncargs == funcargs.fillfixtures - - def test_funcarg_lookupfails(self, testdir): - testdir.makepyfile(""" - def pytest_funcarg__xyzsomething(request): - return 42 - - def test_func(some): - pass - """) - result = testdir.runpytest() # "--collect-only") - assert result.ret != 0 - result.stdout.fnmatch_lines([ - "*def test_func(some)*", - "*fixture*some*not found*", - "*xyzsomething*", - ]) - - def test_funcarg_basic(self, testdir): - item = testdir.getitem(""" - def pytest_funcarg__some(request): - return request.function.__name__ - def pytest_funcarg__other(request): - return 42 - def test_func(some, other): - pass - """) - funcargs.fillfixtures(item) - del item.funcargs["request"] - assert len(get_public_names(item.funcargs)) == 2 - assert item.funcargs['some'] == "test_func" - assert item.funcargs['other'] == 42 - - def test_funcarg_lookup_modulelevel(self, testdir): - testdir.makepyfile(""" - def pytest_funcarg__something(request): - return request.function.__name__ - - class TestClass: - def test_method(self, something): - assert something == "test_method" - def test_func(something): - assert something == "test_func" - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=2) - - def test_funcarg_lookup_classlevel(self, testdir): - p = testdir.makepyfile(""" - class TestClass: - def pytest_funcarg__something(self, request): - return request.instance - def test_method(self, something): - assert something is self - """) - result = testdir.runpytest(p) - result.stdout.fnmatch_lines([ - "*1 passed*" - ]) - - def test_conftest_funcargs_only_available_in_subdir(self, testdir): - sub1 = testdir.mkpydir("sub1") - sub2 = testdir.mkpydir("sub2") - sub1.join("conftest.py").write(_pytest._code.Source(""" - import pytest - def pytest_funcarg__arg1(request): - pytest.raises(Exception, "request.getfuncargvalue('arg2')") - """)) - sub2.join("conftest.py").write(_pytest._code.Source(""" - import pytest - def pytest_funcarg__arg2(request): - pytest.raises(Exception, "request.getfuncargvalue('arg1')") - """)) - - sub1.join("test_in_sub1.py").write("def test_1(arg1): pass") - sub2.join("test_in_sub2.py").write("def test_2(arg2): pass") - result = testdir.runpytest("-v") - result.assert_outcomes(passed=2) - - def test_extend_fixture_module_class(self, testdir): - testfile = testdir.makepyfile(""" - import pytest - - @pytest.fixture - def spam(): - return 'spam' - - class TestSpam: - - @pytest.fixture - def spam(self, spam): - return spam * 2 - - def test_spam(self, spam): - assert spam == 'spamspam' - """) - result = testdir.runpytest() - result.stdout.fnmatch_lines(["*1 passed*"]) - result = testdir.runpytest(testfile) - result.stdout.fnmatch_lines(["*1 passed*"]) - - def test_extend_fixture_conftest_module(self, testdir): - testdir.makeconftest(""" - import pytest - - @pytest.fixture - def spam(): - return 'spam' - """) - testfile = testdir.makepyfile(""" - import pytest - - @pytest.fixture - def spam(spam): - return spam * 2 - - def test_spam(spam): - assert spam == 'spamspam' - """) - result = testdir.runpytest() - result.stdout.fnmatch_lines(["*1 passed*"]) - result = testdir.runpytest(testfile) - result.stdout.fnmatch_lines(["*1 passed*"]) - - def test_extend_fixture_conftest_conftest(self, testdir): - testdir.makeconftest(""" - import pytest - - @pytest.fixture - def spam(): - return 'spam' - """) - pkg = testdir.mkpydir("pkg") - pkg.join("conftest.py").write(_pytest._code.Source(""" - import pytest - - @pytest.fixture - def spam(spam): - return spam * 2 - """)) - testfile = pkg.join("test_spam.py") - testfile.write(_pytest._code.Source(""" - def test_spam(spam): - assert spam == "spamspam" - """)) - result = testdir.runpytest() - result.stdout.fnmatch_lines(["*1 passed*"]) - result = testdir.runpytest(testfile) - result.stdout.fnmatch_lines(["*1 passed*"]) - - def test_extend_fixture_conftest_plugin(self, testdir): - testdir.makepyfile(testplugin=""" - import pytest - - @pytest.fixture - def foo(): - return 7 - """) - testdir.syspathinsert() - testdir.makeconftest(""" - import pytest - - pytest_plugins = 'testplugin' - - @pytest.fixture - def foo(foo): - return foo + 7 - """) - testdir.makepyfile(""" - def test_foo(foo): - assert foo == 14 - """) - result = testdir.runpytest('-s') - assert result.ret == 0 - - def test_extend_fixture_plugin_plugin(self, testdir): - # Two plugins should extend each order in loading order - testdir.makepyfile(testplugin0=""" - import pytest - - @pytest.fixture - def foo(): - return 7 - """) - testdir.makepyfile(testplugin1=""" - import pytest - - @pytest.fixture - def foo(foo): - return foo + 7 - """) - testdir.syspathinsert() - testdir.makepyfile(""" - pytest_plugins = ['testplugin0', 'testplugin1'] - - def test_foo(foo): - assert foo == 14 - """) - result = testdir.runpytest() - assert result.ret == 0 - - def test_override_parametrized_fixture_conftest_module(self, testdir): - """Test override of the parametrized fixture with non-parametrized one on the test module level.""" - testdir.makeconftest(""" - import pytest - - @pytest.fixture(params=[1, 2, 3]) - def spam(request): - return request.param - """) - testfile = testdir.makepyfile(""" - import pytest - - @pytest.fixture - def spam(): - return 'spam' - - def test_spam(spam): - assert spam == 'spam' - """) - result = testdir.runpytest() - result.stdout.fnmatch_lines(["*1 passed*"]) - result = testdir.runpytest(testfile) - result.stdout.fnmatch_lines(["*1 passed*"]) - - def test_override_parametrized_fixture_conftest_conftest(self, testdir): - """Test override of the parametrized fixture with non-parametrized one on the conftest level.""" - testdir.makeconftest(""" - import pytest - - @pytest.fixture(params=[1, 2, 3]) - def spam(request): - return request.param - """) - subdir = testdir.mkpydir('subdir') - subdir.join("conftest.py").write(_pytest._code.Source(""" - import pytest - - @pytest.fixture - def spam(): - return 'spam' - """)) - testfile = subdir.join("test_spam.py") - testfile.write(_pytest._code.Source(""" - def test_spam(spam): - assert spam == "spam" - """)) - result = testdir.runpytest() - result.stdout.fnmatch_lines(["*1 passed*"]) - result = testdir.runpytest(testfile) - result.stdout.fnmatch_lines(["*1 passed*"]) - - def test_override_non_parametrized_fixture_conftest_module(self, testdir): - """Test override of the non-parametrized fixture with parametrized one on the test module level.""" - testdir.makeconftest(""" - import pytest - - @pytest.fixture - def spam(): - return 'spam' - """) - testfile = testdir.makepyfile(""" - import pytest - - @pytest.fixture(params=[1, 2, 3]) - def spam(request): - return request.param - - params = {'spam': 1} - - def test_spam(spam): - assert spam == params['spam'] - params['spam'] += 1 - """) - result = testdir.runpytest() - result.stdout.fnmatch_lines(["*3 passed*"]) - result = testdir.runpytest(testfile) - result.stdout.fnmatch_lines(["*3 passed*"]) - - def test_override_non_parametrized_fixture_conftest_conftest(self, testdir): - """Test override of the non-parametrized fixture with parametrized one on the conftest level.""" - testdir.makeconftest(""" - import pytest - - @pytest.fixture - def spam(): - return 'spam' - """) - subdir = testdir.mkpydir('subdir') - subdir.join("conftest.py").write(_pytest._code.Source(""" - import pytest - - @pytest.fixture(params=[1, 2, 3]) - def spam(request): - return request.param - """)) - testfile = subdir.join("test_spam.py") - testfile.write(_pytest._code.Source(""" - params = {'spam': 1} - - def test_spam(spam): - assert spam == params['spam'] - params['spam'] += 1 - """)) - result = testdir.runpytest() - result.stdout.fnmatch_lines(["*3 passed*"]) - result = testdir.runpytest(testfile) - result.stdout.fnmatch_lines(["*3 passed*"]) - - def test_autouse_fixture_plugin(self, testdir): - # A fixture from a plugin has no baseid set, which screwed up - # the autouse fixture handling. - testdir.makepyfile(testplugin=""" - import pytest - - @pytest.fixture(autouse=True) - def foo(request): - request.function.foo = 7 - """) - testdir.syspathinsert() - testdir.makepyfile(""" - pytest_plugins = 'testplugin' - - def test_foo(request): - assert request.function.foo == 7 - """) - result = testdir.runpytest() - assert result.ret == 0 - - def test_funcarg_lookup_error(self, testdir): - testdir.makepyfile(""" - def test_lookup_error(unknown): - pass - """) - result = testdir.runpytest() - result.stdout.fnmatch_lines([ - "*ERROR*test_lookup_error*", - "*def test_lookup_error(unknown):*", - "*fixture*unknown*not found*", - "*available fixtures*", - "*1 error*", - ]) - assert "INTERNAL" not in result.stdout.str() - - def test_fixture_excinfo_leak(self, testdir): - # on python2 sys.excinfo would leak into fixture executions - testdir.makepyfile(""" - import sys - import traceback - import pytest - - @pytest.fixture - def leak(): - if sys.exc_info()[0]: # python3 bug :) - traceback.print_exc() - #fails - assert sys.exc_info() == (None, None, None) - - def test_leak(leak): - if sys.exc_info()[0]: # python3 bug :) - traceback.print_exc() - assert sys.exc_info() == (None, None, None) - """) - result = testdir.runpytest() - assert result.ret == 0 - - -class TestRequestBasic: - def test_request_attributes(self, testdir): - item = testdir.getitem(""" - def pytest_funcarg__something(request): pass - def test_func(something): pass - """) - req = funcargs.FixtureRequest(item) - assert req.function == item.obj - assert req.keywords == item.keywords - assert hasattr(req.module, 'test_func') - assert req.cls is None - assert req.function.__name__ == "test_func" - assert req.config == item.config - assert repr(req).find(req.function.__name__) != -1 - - def test_request_attributes_method(self, testdir): - item, = testdir.getitems(""" - class TestB: - def pytest_funcarg__something(self, request): - return 1 - def test_func(self, something): - pass - """) - req = item._request - assert req.cls.__name__ == "TestB" - assert req.instance.__class__ == req.cls - - def XXXtest_request_contains_funcarg_arg2fixturedefs(self, testdir): - modcol = testdir.getmodulecol(""" - def pytest_funcarg__something(request): - pass - class TestClass: - def test_method(self, something): - pass - """) - item1, = testdir.genitems([modcol]) - assert item1.name == "test_method" - arg2fixturedefs = funcargs.FixtureRequest(item1)._arg2fixturedefs - assert len(arg2fixturedefs) == 1 - assert arg2fixturedefs[0].__name__ == "pytest_funcarg__something" - - def test_getfuncargvalue_recursive(self, testdir): - testdir.makeconftest(""" - def pytest_funcarg__something(request): - return 1 - """) - testdir.makepyfile(""" - def pytest_funcarg__something(request): - return request.getfuncargvalue("something") + 1 - def test_func(something): - assert something == 2 - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=1) - - def test_getfuncargvalue(self, testdir): - item = testdir.getitem(""" - l = [2] - def pytest_funcarg__something(request): return 1 - def pytest_funcarg__other(request): - return l.pop() - def test_func(something): pass - """) - req = item._request - pytest.raises(FixtureLookupError, req.getfuncargvalue, "notexists") - val = req.getfuncargvalue("something") - assert val == 1 - val = req.getfuncargvalue("something") - assert val == 1 - val2 = req.getfuncargvalue("other") - assert val2 == 2 - val2 = req.getfuncargvalue("other") # see about caching - assert val2 == 2 - pytest._fillfuncargs(item) - assert item.funcargs["something"] == 1 - assert len(get_public_names(item.funcargs)) == 2 - assert "request" in item.funcargs - #assert item.funcargs == {'something': 1, "other": 2} - - def test_request_addfinalizer(self, testdir): - item = testdir.getitem(""" - teardownlist = [] - def pytest_funcarg__something(request): - request.addfinalizer(lambda: teardownlist.append(1)) - def test_func(something): pass - """) - item.session._setupstate.prepare(item) - pytest._fillfuncargs(item) - # successively check finalization calls - teardownlist = item.getparent(pytest.Module).obj.teardownlist - ss = item.session._setupstate - assert not teardownlist - ss.teardown_exact(item, None) - print(ss.stack) - assert teardownlist == [1] - - def test_request_addfinalizer_failing_setup(self, testdir): - testdir.makepyfile(""" - import pytest - l = [1] - @pytest.fixture - def myfix(request): - request.addfinalizer(l.pop) - assert 0 - def test_fix(myfix): - pass - def test_finalizer_ran(): - assert not l - """) - reprec = testdir.inline_run("-s") - reprec.assertoutcome(failed=1, passed=1) - - def test_request_addfinalizer_failing_setup_module(self, testdir): - testdir.makepyfile(""" - import pytest - l = [1, 2] - @pytest.fixture(scope="module") - def myfix(request): - request.addfinalizer(l.pop) - request.addfinalizer(l.pop) - assert 0 - def test_fix(myfix): - pass - """) - reprec = testdir.inline_run("-s") - mod = reprec.getcalls("pytest_runtest_setup")[0].item.module - assert not mod.l - - - def test_request_addfinalizer_partial_setup_failure(self, testdir): - p = testdir.makepyfile(""" - l = [] - def pytest_funcarg__something(request): - request.addfinalizer(lambda: l.append(None)) - def test_func(something, missingarg): - pass - def test_second(): - assert len(l) == 1 - """) - result = testdir.runpytest(p) - result.stdout.fnmatch_lines([ - "*1 error*" # XXX the whole module collection fails - ]) - - def test_request_getmodulepath(self, testdir): - modcol = testdir.getmodulecol("def test_somefunc(): pass") - item, = testdir.genitems([modcol]) - req = funcargs.FixtureRequest(item) - assert req.fspath == modcol.fspath - - def test_request_fixturenames(self, testdir): - testdir.makepyfile(""" - import pytest - from _pytest.pytester import get_public_names - @pytest.fixture() - def arg1(): - pass - @pytest.fixture() - def farg(arg1): - pass - @pytest.fixture(autouse=True) - def sarg(tmpdir): - pass - def test_function(request, farg): - assert set(get_public_names(request.fixturenames)) == \ - set(["tmpdir", "sarg", "arg1", "request", "farg", - "tmpdir_factory"]) - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=1) - - def test_funcargnames_compatattr(self, testdir): - testdir.makepyfile(""" - def pytest_generate_tests(metafunc): - assert metafunc.funcargnames == metafunc.fixturenames - def pytest_funcarg__fn(request): - assert request._pyfuncitem.funcargnames == \ - request._pyfuncitem.fixturenames - return request.funcargnames, request.fixturenames - - def test_hello(fn): - assert fn[0] == fn[1] - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=1) - - def test_setupdecorator_and_xunit(self, testdir): - testdir.makepyfile(""" - import pytest - l = [] - @pytest.fixture(scope='module', autouse=True) - def setup_module(): - l.append("module") - @pytest.fixture(autouse=True) - def setup_function(): - l.append("function") - - def test_func(): - pass - - class TestClass: - @pytest.fixture(scope="class", autouse=True) - def setup_class(self): - l.append("class") - @pytest.fixture(autouse=True) - def setup_method(self): - l.append("method") - def test_method(self): - pass - def test_all(): - assert l == ["module", "function", "class", - "function", "method", "function"] - """) - reprec = testdir.inline_run("-v") - reprec.assertoutcome(passed=3) - - def test_fixtures_sub_subdir_normalize_sep(self, testdir): - # this tests that normalization of nodeids takes place - b = testdir.mkdir("tests").mkdir("unit") - b.join("conftest.py").write(_pytest._code.Source(""" - def pytest_funcarg__arg1(): - pass - """)) - p = b.join("test_module.py") - p.write("def test_func(arg1): pass") - result = testdir.runpytest(p, "--fixtures") - assert result.ret == 0 - result.stdout.fnmatch_lines(""" - *fixtures defined*conftest* - *arg1* - """) - - def test_show_fixtures_color_yes(self, testdir): - testdir.makepyfile("def test_this(): assert 1") - result = testdir.runpytest('--color=yes', '--fixtures') - assert '\x1b[32mtmpdir' in result.stdout.str() - - def test_newstyle_with_request(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.fixture() - def arg(request): - pass - def test_1(arg): - pass - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=1) - - def test_setupcontext_no_param(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.fixture(params=[1,2]) - def arg(request): - return request.param - - @pytest.fixture(autouse=True) - def mysetup(request, arg): - assert not hasattr(request, "param") - def test_1(arg): - assert arg in (1,2) - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=2) - -class TestRequestMarking: - def test_applymarker(self, testdir): - item1,item2 = testdir.getitems(""" - def pytest_funcarg__something(request): - pass - class TestClass: - def test_func1(self, something): - pass - def test_func2(self, something): - pass - """) - req1 = funcargs.FixtureRequest(item1) - assert 'xfail' not in item1.keywords - req1.applymarker(pytest.mark.xfail) - assert 'xfail' in item1.keywords - assert 'skipif' not in item1.keywords - req1.applymarker(pytest.mark.skipif) - assert 'skipif' in item1.keywords - pytest.raises(ValueError, "req1.applymarker(42)") - - def test_accesskeywords(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.fixture() - def keywords(request): - return request.keywords - @pytest.mark.XYZ - def test_function(keywords): - assert keywords["XYZ"] - assert "abc" not in keywords - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=1) - - def test_accessmarker_dynamic(self, testdir): - testdir.makeconftest(""" - import pytest - @pytest.fixture() - def keywords(request): - return request.keywords - - @pytest.fixture(scope="class", autouse=True) - def marking(request): - request.applymarker(pytest.mark.XYZ("hello")) - """) - testdir.makepyfile(""" - import pytest - def test_fun1(keywords): - assert keywords["XYZ"] is not None - assert "abc" not in keywords - def test_fun2(keywords): - assert keywords["XYZ"] is not None - assert "abc" not in keywords - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=2) - -class TestRequestCachedSetup: - def test_request_cachedsetup_defaultmodule(self, testdir): - reprec = testdir.inline_runsource(""" - mysetup = ["hello",].pop - - def pytest_funcarg__something(request): - return request.cached_setup(mysetup, scope="module") - - def test_func1(something): - assert something == "hello" - class TestClass: - def test_func1a(self, something): - assert something == "hello" - """) - reprec.assertoutcome(passed=2) - - def test_request_cachedsetup_class(self, testdir): - reprec = testdir.inline_runsource(""" - mysetup = ["hello", "hello2", "hello3"].pop - - def pytest_funcarg__something(request): - return request.cached_setup(mysetup, scope="class") - def test_func1(something): - assert something == "hello3" - def test_func2(something): - assert something == "hello2" - class TestClass: - def test_func1a(self, something): - assert something == "hello" - def test_func2b(self, something): - assert something == "hello" - """) - reprec.assertoutcome(passed=4) - - def test_request_cachedsetup_extrakey(self, testdir): - item1 = testdir.getitem("def test_func(): pass") - req1 = funcargs.FixtureRequest(item1) - l = ["hello", "world"] - def setup(): - return l.pop() - ret1 = req1.cached_setup(setup, extrakey=1) - ret2 = req1.cached_setup(setup, extrakey=2) - assert ret2 == "hello" - assert ret1 == "world" - ret1b = req1.cached_setup(setup, extrakey=1) - ret2b = req1.cached_setup(setup, extrakey=2) - assert ret1 == ret1b - assert ret2 == ret2b - - def test_request_cachedsetup_cache_deletion(self, testdir): - item1 = testdir.getitem("def test_func(): pass") - req1 = funcargs.FixtureRequest(item1) - l = [] - def setup(): - l.append("setup") - def teardown(val): - l.append("teardown") - req1.cached_setup(setup, teardown, scope="function") - assert l == ['setup'] - # artificial call of finalizer - setupstate = req1._pyfuncitem.session._setupstate - setupstate._callfinalizers(item1) - assert l == ["setup", "teardown"] - req1.cached_setup(setup, teardown, scope="function") - assert l == ["setup", "teardown", "setup"] - setupstate._callfinalizers(item1) - assert l == ["setup", "teardown", "setup", "teardown"] - - def test_request_cached_setup_two_args(self, testdir): - testdir.makepyfile(""" - def pytest_funcarg__arg1(request): - return request.cached_setup(lambda: 42) - def pytest_funcarg__arg2(request): - return request.cached_setup(lambda: 17) - def test_two_different_setups(arg1, arg2): - assert arg1 != arg2 - """) - result = testdir.runpytest("-v") - result.stdout.fnmatch_lines([ - "*1 passed*" - ]) - - def test_request_cached_setup_getfuncargvalue(self, testdir): - testdir.makepyfile(""" - def pytest_funcarg__arg1(request): - arg1 = request.getfuncargvalue("arg2") - return request.cached_setup(lambda: arg1 + 1) - def pytest_funcarg__arg2(request): - return request.cached_setup(lambda: 10) - def test_two_funcarg(arg1): - assert arg1 == 11 - """) - result = testdir.runpytest("-v") - result.stdout.fnmatch_lines([ - "*1 passed*" - ]) - - def test_request_cached_setup_functional(self, testdir): - testdir.makepyfile(test_0=""" - l = [] - def pytest_funcarg__something(request): - val = request.cached_setup(fsetup, fteardown) - return val - def fsetup(mycache=[1]): - l.append(mycache.pop()) - return l - def fteardown(something): - l.remove(something[0]) - l.append(2) - def test_list_once(something): - assert something == [1] - def test_list_twice(something): - assert something == [1] - """) - testdir.makepyfile(test_1=""" - import test_0 # should have run already - def test_check_test0_has_teardown_correct(): - assert test_0.l == [2] - """) - result = testdir.runpytest("-v") - result.stdout.fnmatch_lines([ - "*3 passed*" - ]) - - def test_issue117_sessionscopeteardown(self, testdir): - testdir.makepyfile(""" - def pytest_funcarg__app(request): - app = request.cached_setup( - scope='session', - setup=lambda: 0, - teardown=lambda x: 3/x) - return app - def test_func(app): - pass - """) - result = testdir.runpytest() - assert result.ret != 0 - result.stdout.fnmatch_lines([ - "*3/x*", - "*ZeroDivisionError*", - ]) - -class TestFixtureUsages: - def test_noargfixturedec(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.fixture - def arg1(): - return 1 - - def test_func(arg1): - assert arg1 == 1 - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=1) - - def test_receives_funcargs(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.fixture() - def arg1(): - return 1 - - @pytest.fixture() - def arg2(arg1): - return arg1 + 1 - - def test_add(arg2): - assert arg2 == 2 - def test_all(arg1, arg2): - assert arg1 == 1 - assert arg2 == 2 - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=2) - - def test_receives_funcargs_scope_mismatch(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.fixture(scope="function") - def arg1(): - return 1 - - @pytest.fixture(scope="module") - def arg2(arg1): - return arg1 + 1 - - def test_add(arg2): - assert arg2 == 2 - """) - result = testdir.runpytest() - result.stdout.fnmatch_lines([ - "*ScopeMismatch*involved factories*", - "* def arg2*", - "* def arg1*", - "*1 error*" - ]) - - def test_receives_funcargs_scope_mismatch_issue660(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.fixture(scope="function") - def arg1(): - return 1 - - @pytest.fixture(scope="module") - def arg2(arg1): - return arg1 + 1 - - def test_add(arg1, arg2): - assert arg2 == 2 - """) - result = testdir.runpytest() - result.stdout.fnmatch_lines([ - "*ScopeMismatch*involved factories*", - "* def arg2*", - "*1 error*" - ]) - - def test_funcarg_parametrized_and_used_twice(self, testdir): - testdir.makepyfile(""" - import pytest - l = [] - @pytest.fixture(params=[1,2]) - def arg1(request): - l.append(1) - return request.param - - @pytest.fixture() - def arg2(arg1): - return arg1 + 1 - - def test_add(arg1, arg2): - assert arg2 == arg1 + 1 - assert len(l) == arg1 - """) - result = testdir.runpytest() - result.stdout.fnmatch_lines([ - "*2 passed*" - ]) - - def test_factory_uses_unknown_funcarg_as_dependency_error(self, testdir): - testdir.makepyfile(""" - import pytest - - @pytest.fixture() - def fail(missing): - return - - @pytest.fixture() - def call_fail(fail): - return - - def test_missing(call_fail): - pass - """) - result = testdir.runpytest() - result.stdout.fnmatch_lines(""" - *pytest.fixture()* - *def call_fail(fail)* - *pytest.fixture()* - *def fail* - *fixture*'missing'*not found* - """) - - def test_factory_setup_as_classes_fails(self, testdir): - testdir.makepyfile(""" - import pytest - class arg1: - def __init__(self, request): - self.x = 1 - arg1 = pytest.fixture()(arg1) - - """) - reprec = testdir.inline_run() - l = reprec.getfailedcollections() - assert len(l) == 1 - - def test_request_can_be_overridden(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.fixture() - def request(request): - request.a = 1 - return request - def test_request(request): - assert request.a == 1 - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=1) - - def test_usefixtures_marker(self, testdir): - testdir.makepyfile(""" - import pytest - - l = [] - - @pytest.fixture(scope="class") - def myfix(request): - request.cls.hello = "world" - l.append(1) - - class TestClass: - def test_one(self): - assert self.hello == "world" - assert len(l) == 1 - def test_two(self): - assert self.hello == "world" - assert len(l) == 1 - pytest.mark.usefixtures("myfix")(TestClass) - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=2) - - def test_usefixtures_ini(self, testdir): - testdir.makeini(""" - [pytest] - usefixtures = myfix - """) - testdir.makeconftest(""" - import pytest - - @pytest.fixture(scope="class") - def myfix(request): - request.cls.hello = "world" - - """) - testdir.makepyfile(""" - class TestClass: - def test_one(self): - assert self.hello == "world" - def test_two(self): - assert self.hello == "world" - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=2) - - def test_usefixtures_seen_in_showmarkers(self, testdir): - result = testdir.runpytest("--markers") - result.stdout.fnmatch_lines(""" - *usefixtures(fixturename1*mark tests*fixtures* - """) - - def test_request_instance_issue203(self, testdir): - testdir.makepyfile(""" - import pytest - - class TestClass: - @pytest.fixture - def setup1(self, request): - assert self == request.instance - self.arg1 = 1 - def test_hello(self, setup1): - assert self.arg1 == 1 - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=1) - - def test_fixture_parametrized_with_iterator(self, testdir): - testdir.makepyfile(""" - import pytest - - l = [] - def f(): - yield 1 - yield 2 - dec = pytest.fixture(scope="module", params=f()) - - @dec - def arg(request): - return request.param - @dec - def arg2(request): - return request.param - - def test_1(arg): - l.append(arg) - def test_2(arg2): - l.append(arg2*10) - """) - reprec = testdir.inline_run("-v") - reprec.assertoutcome(passed=4) - l = reprec.getcalls("pytest_runtest_call")[0].item.module.l - assert l == [1,2, 10,20] - - -class TestFixtureManagerParseFactories: - def pytest_funcarg__testdir(self, request): - testdir = request.getfuncargvalue("testdir") - testdir.makeconftest(""" - def pytest_funcarg__hello(request): - return "conftest" - - def pytest_funcarg__fm(request): - return request._fixturemanager - - def pytest_funcarg__item(request): - return request._pyfuncitem - """) - return testdir - - def test_parsefactories_evil_objects_issue214(self, testdir): - testdir.makepyfile(""" - class A: - def __call__(self): - pass - def __getattr__(self, name): - raise RuntimeError() - a = A() - def test_hello(): - pass - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=1, failed=0) - - def test_parsefactories_conftest(self, testdir): - testdir.makepyfile(""" - def test_hello(item, fm): - for name in ("fm", "hello", "item"): - faclist = fm.getfixturedefs(name, item.nodeid) - assert len(faclist) == 1 - fac = faclist[0] - assert fac.func.__name__ == "pytest_funcarg__" + name - """) - reprec = testdir.inline_run("-s") - reprec.assertoutcome(passed=1) - - def test_parsefactories_conftest_and_module_and_class(self, testdir): - testdir.makepyfile(""" - def pytest_funcarg__hello(request): - return "module" - class TestClass: - def pytest_funcarg__hello(self, request): - return "class" - def test_hello(self, item, fm): - faclist = fm.getfixturedefs("hello", item.nodeid) - print (faclist) - assert len(faclist) == 3 - assert faclist[0].func(item._request) == "conftest" - assert faclist[1].func(item._request) == "module" - assert faclist[2].func(item._request) == "class" - """) - reprec = testdir.inline_run("-s") - reprec.assertoutcome(passed=1) - - def test_parsefactories_relative_node_ids(self, testdir): - # example mostly taken from: - # https://mail.python.org/pipermail/pytest-dev/2014-September/002617.html - runner = testdir.mkdir("runner") - package = testdir.mkdir("package") - package.join("conftest.py").write(dedent("""\ - import pytest - @pytest.fixture - def one(): - return 1 - """)) - package.join("test_x.py").write(dedent("""\ - def test_x(one): - assert one == 1 - """)) - sub = package.mkdir("sub") - sub.join("__init__.py").ensure() - sub.join("conftest.py").write(dedent("""\ - import pytest - @pytest.fixture - def one(): - return 2 - """)) - sub.join("test_y.py").write(dedent("""\ - def test_x(one): - assert one == 2 - """)) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=2) - with runner.as_cwd(): - reprec = testdir.inline_run("..") - reprec.assertoutcome(passed=2) - - -class TestAutouseDiscovery: - def pytest_funcarg__testdir(self, testdir): - testdir.makeconftest(""" - import pytest - @pytest.fixture(autouse=True) - def perfunction(request, tmpdir): - pass - - @pytest.fixture() - def arg1(tmpdir): - pass - @pytest.fixture(autouse=True) - def perfunction2(arg1): - pass - - def pytest_funcarg__fm(request): - return request._fixturemanager - - def pytest_funcarg__item(request): - return request._pyfuncitem - """) - return testdir - - def test_parsefactories_conftest(self, testdir): - testdir.makepyfile(""" - from _pytest.pytester import get_public_names - def test_check_setup(item, fm): - autousenames = fm._getautousenames(item.nodeid) - assert len(get_public_names(autousenames)) == 2 - assert "perfunction2" in autousenames - assert "perfunction" in autousenames - """) - reprec = testdir.inline_run("-s") - reprec.assertoutcome(passed=1) - - def test_two_classes_separated_autouse(self, testdir): - testdir.makepyfile(""" - import pytest - class TestA: - l = [] - @pytest.fixture(autouse=True) - def setup1(self): - self.l.append(1) - def test_setup1(self): - assert self.l == [1] - class TestB: - l = [] - @pytest.fixture(autouse=True) - def setup2(self): - self.l.append(1) - def test_setup2(self): - assert self.l == [1] - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=2) - - def test_setup_at_classlevel(self, testdir): - testdir.makepyfile(""" - import pytest - class TestClass: - @pytest.fixture(autouse=True) - def permethod(self, request): - request.instance.funcname = request.function.__name__ - def test_method1(self): - assert self.funcname == "test_method1" - def test_method2(self): - assert self.funcname == "test_method2" - """) - reprec = testdir.inline_run("-s") - reprec.assertoutcome(passed=2) - - @pytest.mark.xfail(reason="'enabled' feature not implemented") - def test_setup_enabled_functionnode(self, testdir): - testdir.makepyfile(""" - import pytest - - def enabled(parentnode, markers): - return "needsdb" in markers - - @pytest.fixture(params=[1,2]) - def db(request): - return request.param - - @pytest.fixture(enabled=enabled, autouse=True) - def createdb(db): - pass - - def test_func1(request): - assert "db" not in request.fixturenames - - @pytest.mark.needsdb - def test_func2(request): - assert "db" in request.fixturenames - """) - reprec = testdir.inline_run("-s") - reprec.assertoutcome(passed=2) - - def test_callables_nocode(self, testdir): - """ - a imported mock.call would break setup/factory discovery - due to it being callable and __code__ not being a code object - """ - testdir.makepyfile(""" - class _call(tuple): - def __call__(self, *k, **kw): - pass - def __getattr__(self, k): - return self - - call = _call() - """) - reprec = testdir.inline_run("-s") - reprec.assertoutcome(failed=0, passed=0) - - def test_autouse_in_conftests(self, testdir): - a = testdir.mkdir("a") - b = testdir.mkdir("a1") - conftest = testdir.makeconftest(""" - import pytest - @pytest.fixture(autouse=True) - def hello(): - xxx - """) - conftest.move(a.join(conftest.basename)) - a.join("test_something.py").write("def test_func(): pass") - b.join("test_otherthing.py").write("def test_func(): pass") - result = testdir.runpytest() - result.stdout.fnmatch_lines(""" - *1 passed*1 error* - """) - - def test_autouse_in_module_and_two_classes(self, testdir): - testdir.makepyfile(""" - import pytest - l = [] - @pytest.fixture(autouse=True) - def append1(): - l.append("module") - def test_x(): - assert l == ["module"] - - class TestA: - @pytest.fixture(autouse=True) - def append2(self): - l.append("A") - def test_hello(self): - assert l == ["module", "module", "A"], l - class TestA2: - def test_world(self): - assert l == ["module", "module", "A", "module"], l - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=3) - - -class TestAutouseManagement: - def test_autouse_conftest_mid_directory(self, testdir): - pkgdir = testdir.mkpydir("xyz123") - pkgdir.join("conftest.py").write(_pytest._code.Source(""" - import pytest - @pytest.fixture(autouse=True) - def app(): - import sys - sys._myapp = "hello" - """)) - t = pkgdir.ensure("tests", "test_app.py") - t.write(_pytest._code.Source(""" - import sys - def test_app(): - assert sys._myapp == "hello" - """)) - reprec = testdir.inline_run("-s") - reprec.assertoutcome(passed=1) - - def test_autouse_honored_for_yield(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.fixture(autouse=True) - def tst(): - global x - x = 3 - def test_gen(): - def f(hello): - assert x == abs(hello) - yield f, 3 - yield f, -3 - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=2) - - - - def test_funcarg_and_setup(self, testdir): - testdir.makepyfile(""" - import pytest - l = [] - @pytest.fixture(scope="module") - def arg(): - l.append(1) - return 0 - @pytest.fixture(scope="module", autouse=True) - def something(arg): - l.append(2) - - def test_hello(arg): - assert len(l) == 2 - assert l == [1,2] - assert arg == 0 - - def test_hello2(arg): - assert len(l) == 2 - assert l == [1,2] - assert arg == 0 - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=2) - - def test_uses_parametrized_resource(self, testdir): - testdir.makepyfile(""" - import pytest - l = [] - @pytest.fixture(params=[1,2]) - def arg(request): - return request.param - - @pytest.fixture(autouse=True) - def something(arg): - l.append(arg) - - def test_hello(): - if len(l) == 1: - assert l == [1] - elif len(l) == 2: - assert l == [1, 2] - else: - 0/0 - - """) - reprec = testdir.inline_run("-s") - reprec.assertoutcome(passed=2) - - def test_session_parametrized_function(self, testdir): - testdir.makepyfile(""" - import pytest - - l = [] - - @pytest.fixture(scope="session", params=[1,2]) - def arg(request): - return request.param - - @pytest.fixture(scope="function", autouse=True) - def append(request, arg): - if request.function.__name__ == "test_some": - l.append(arg) - - def test_some(): - pass - - def test_result(arg): - assert len(l) == arg - assert l[:arg] == [1,2][:arg] - """) - reprec = testdir.inline_run("-v", "-s") - reprec.assertoutcome(passed=4) - - def test_class_function_parametrization_finalization(self, testdir): - p = testdir.makeconftest(""" - import pytest - import pprint - - l = [] - - @pytest.fixture(scope="function", params=[1,2]) - def farg(request): - return request.param - - @pytest.fixture(scope="class", params=list("ab")) - def carg(request): - return request.param - - @pytest.fixture(scope="function", autouse=True) - def append(request, farg, carg): - def fin(): - l.append("fin_%s%s" % (carg, farg)) - request.addfinalizer(fin) - """) - testdir.makepyfile(""" - import pytest - - class TestClass: - def test_1(self): - pass - class TestClass2: - def test_2(self): - pass - """) - reprec = testdir.inline_run("-v","-s") - reprec.assertoutcome(passed=8) - config = reprec.getcalls("pytest_unconfigure")[0].config - l = config.pluginmanager._getconftestmodules(p)[0].l - assert l == ["fin_a1", "fin_a2", "fin_b1", "fin_b2"] * 2 - - def test_scope_ordering(self, testdir): - testdir.makepyfile(""" - import pytest - l = [] - @pytest.fixture(scope="function", autouse=True) - def fappend2(): - l.append(2) - @pytest.fixture(scope="class", autouse=True) - def classappend3(): - l.append(3) - @pytest.fixture(scope="module", autouse=True) - def mappend(): - l.append(1) - - class TestHallo: - def test_method(self): - assert l == [1,3,2] - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=1) - - def test_parametrization_setup_teardown_ordering(self, testdir): - testdir.makepyfile(""" - import pytest - l = [] - def pytest_generate_tests(metafunc): - if metafunc.cls is not None: - metafunc.parametrize("item", [1,2], scope="class") - class TestClass: - @pytest.fixture(scope="class", autouse=True) - def addteardown(self, item, request): - l.append("setup-%d" % item) - request.addfinalizer(lambda: l.append("teardown-%d" % item)) - def test_step1(self, item): - l.append("step1-%d" % item) - def test_step2(self, item): - l.append("step2-%d" % item) - - def test_finish(): - print (l) - assert l == ["setup-1", "step1-1", "step2-1", "teardown-1", - "setup-2", "step1-2", "step2-2", "teardown-2",] - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=5) - - def test_ordering_autouse_before_explicit(self, testdir): - testdir.makepyfile(""" - import pytest - - l = [] - @pytest.fixture(autouse=True) - def fix1(): - l.append(1) - @pytest.fixture() - def arg1(): - l.append(2) - def test_hello(arg1): - assert l == [1,2] - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=1) - - @pytest.mark.issue226 - @pytest.mark.parametrize("param1", ["", "params=[1]"], ids=["p00","p01"]) - @pytest.mark.parametrize("param2", ["", "params=[1]"], ids=["p10","p11"]) - def test_ordering_dependencies_torndown_first(self, testdir, param1, param2): - testdir.makepyfile(""" - import pytest - l = [] - @pytest.fixture(%(param1)s) - def arg1(request): - request.addfinalizer(lambda: l.append("fin1")) - l.append("new1") - @pytest.fixture(%(param2)s) - def arg2(request, arg1): - request.addfinalizer(lambda: l.append("fin2")) - l.append("new2") - - def test_arg(arg2): - pass - def test_check(): - assert l == ["new1", "new2", "fin2", "fin1"] - """ % locals()) - reprec = testdir.inline_run("-s") - reprec.assertoutcome(passed=2) - - -class TestFixtureMarker: - def test_parametrize(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.fixture(params=["a", "b", "c"]) - def arg(request): - return request.param - l = [] - def test_param(arg): - l.append(arg) - def test_result(): - assert l == list("abc") - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=4) - - def test_multiple_parametrization_issue_736(self, testdir): - testdir.makepyfile(""" - import pytest - - @pytest.fixture(params=[1,2,3]) - def foo(request): - return request.param - - @pytest.mark.parametrize('foobar', [4,5,6]) - def test_issue(foo, foobar): - assert foo in [1,2,3] - assert foobar in [4,5,6] - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=9) - - @pytest.mark.parametrize('param_args', ["'fixt, val'", "'fixt,val'", "['fixt', 'val']", "('fixt', 'val')"]) - def test_override_parametrized_fixture_issue_979(self, testdir, param_args): - """Make sure a parametrized argument can override a parametrized fixture. - - This was a regression introduced in the fix for #736. - """ - testdir.makepyfile(""" - import pytest - - @pytest.fixture(params=[1, 2]) - def fixt(request): - return request.param - - @pytest.mark.parametrize(%s, [(3, 'x'), (4, 'x')]) - def test_foo(fixt, val): - pass - """ % param_args) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=2) - - def test_scope_session(self, testdir): - testdir.makepyfile(""" - import pytest - l = [] - @pytest.fixture(scope="module") - def arg(): - l.append(1) - return 1 - - def test_1(arg): - assert arg == 1 - def test_2(arg): - assert arg == 1 - assert len(l) == 1 - class TestClass: - def test3(self, arg): - assert arg == 1 - assert len(l) == 1 - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=3) - - def test_scope_session_exc(self, testdir): - testdir.makepyfile(""" - import pytest - l = [] - @pytest.fixture(scope="session") - def fix(): - l.append(1) - pytest.skip('skipping') - - def test_1(fix): - pass - def test_2(fix): - pass - def test_last(): - assert l == [1] - """) - reprec = testdir.inline_run() - reprec.assertoutcome(skipped=2, passed=1) - - def test_scope_session_exc_two_fix(self, testdir): - testdir.makepyfile(""" - import pytest - l = [] - m = [] - @pytest.fixture(scope="session") - def a(): - l.append(1) - pytest.skip('skipping') - @pytest.fixture(scope="session") - def b(a): - m.append(1) - - def test_1(b): - pass - def test_2(b): - pass - def test_last(): - assert l == [1] - assert m == [] - """) - reprec = testdir.inline_run() - reprec.assertoutcome(skipped=2, passed=1) - - def test_scope_exc(self, testdir): - testdir.makepyfile( - test_foo=""" - def test_foo(fix): - pass - """, - test_bar=""" - def test_bar(fix): - pass - """, - conftest=""" - import pytest - reqs = [] - @pytest.fixture(scope="session") - def fix(request): - reqs.append(1) - pytest.skip() - @pytest.fixture - def req_list(): - return reqs - """, - test_real=""" - def test_last(req_list): - assert req_list == [1] - """ - ) - reprec = testdir.inline_run() - reprec.assertoutcome(skipped=2, passed=1) - - def test_scope_module_uses_session(self, testdir): - testdir.makepyfile(""" - import pytest - l = [] - @pytest.fixture(scope="module") - def arg(): - l.append(1) - return 1 - - def test_1(arg): - assert arg == 1 - def test_2(arg): - assert arg == 1 - assert len(l) == 1 - class TestClass: - def test3(self, arg): - assert arg == 1 - assert len(l) == 1 - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=3) - - def test_scope_module_and_finalizer(self, testdir): - testdir.makeconftest(""" - import pytest - finalized = [] - created = [] - @pytest.fixture(scope="module") - def arg(request): - created.append(1) - assert request.scope == "module" - request.addfinalizer(lambda: finalized.append(1)) - def pytest_funcarg__created(request): - return len(created) - def pytest_funcarg__finalized(request): - return len(finalized) - """) - testdir.makepyfile( - test_mod1=""" - def test_1(arg, created, finalized): - assert created == 1 - assert finalized == 0 - def test_2(arg, created, finalized): - assert created == 1 - assert finalized == 0""", - test_mod2=""" - def test_3(arg, created, finalized): - assert created == 2 - assert finalized == 1""", - test_mode3=""" - def test_4(arg, created, finalized): - assert created == 3 - assert finalized == 2 - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=4) - - @pytest.mark.parametrize("method", [ - 'request.getfuncargvalue("arg")', - 'request.cached_setup(lambda: None, scope="function")', - ], ids=["getfuncargvalue", "cached_setup"]) - def test_scope_mismatch_various(self, testdir, method): - testdir.makeconftest(""" - import pytest - finalized = [] - created = [] - @pytest.fixture(scope="function") - def arg(request): - pass - """) - testdir.makepyfile( - test_mod1=""" - import pytest - @pytest.fixture(scope="session") - def arg(request): - %s - def test_1(arg): - pass - """ % method) - result = testdir.runpytest() - assert result.ret != 0 - result.stdout.fnmatch_lines([ - "*ScopeMismatch*You tried*function*session*request*", - ]) - - def test_register_only_with_mark(self, testdir): - testdir.makeconftest(""" - import pytest - @pytest.fixture() - def arg(): - return 1 - """) - testdir.makepyfile( - test_mod1=""" - import pytest - @pytest.fixture() - def arg(arg): - return arg + 1 - def test_1(arg): - assert arg == 2 - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=1) - - def test_parametrize_and_scope(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.fixture(scope="module", params=["a", "b", "c"]) - def arg(request): - return request.param - l = [] - def test_param(arg): - l.append(arg) - """) - reprec = testdir.inline_run("-v") - reprec.assertoutcome(passed=3) - l = reprec.getcalls("pytest_runtest_call")[0].item.module.l - assert len(l) == 3 - assert "a" in l - assert "b" in l - assert "c" in l - - def test_scope_mismatch(self, testdir): - testdir.makeconftest(""" - import pytest - @pytest.fixture(scope="function") - def arg(request): - pass - """) - testdir.makepyfile(""" - import pytest - @pytest.fixture(scope="session") - def arg(arg): - pass - def test_mismatch(arg): - pass - """) - result = testdir.runpytest() - result.stdout.fnmatch_lines([ - "*ScopeMismatch*", - "*1 error*", - ]) - - def test_parametrize_separated_order(self, testdir): - testdir.makepyfile(""" - import pytest - - @pytest.fixture(scope="module", params=[1, 2]) - def arg(request): - return request.param - - l = [] - def test_1(arg): - l.append(arg) - def test_2(arg): - l.append(arg) - """) - reprec = testdir.inline_run("-v") - reprec.assertoutcome(passed=4) - l = reprec.getcalls("pytest_runtest_call")[0].item.module.l - assert l == [1,1,2,2] - - def test_module_parametrized_ordering(self, testdir): - testdir.makeconftest(""" - import pytest - - @pytest.fixture(scope="session", params="s1 s2".split()) - def sarg(): - pass - @pytest.fixture(scope="module", params="m1 m2".split()) - def marg(): - pass - """) - testdir.makepyfile(test_mod1=""" - def test_func(sarg): - pass - def test_func1(marg): - pass - """, test_mod2=""" - def test_func2(sarg): - pass - def test_func3(sarg, marg): - pass - def test_func3b(sarg, marg): - pass - def test_func4(marg): - pass - """) - result = testdir.runpytest("-v") - result.stdout.fnmatch_lines(""" - test_mod1.py::test_func[s1] PASSED - test_mod2.py::test_func2[s1] PASSED - test_mod2.py::test_func3[s1-m1] PASSED - test_mod2.py::test_func3b[s1-m1] PASSED - test_mod2.py::test_func3[s1-m2] PASSED - test_mod2.py::test_func3b[s1-m2] PASSED - test_mod1.py::test_func[s2] PASSED - test_mod2.py::test_func2[s2] PASSED - test_mod2.py::test_func3[s2-m1] PASSED - test_mod2.py::test_func3b[s2-m1] PASSED - test_mod2.py::test_func4[m1] PASSED - test_mod2.py::test_func3[s2-m2] PASSED - test_mod2.py::test_func3b[s2-m2] PASSED - test_mod2.py::test_func4[m2] PASSED - test_mod1.py::test_func1[m1] PASSED - test_mod1.py::test_func1[m2] PASSED - """) - - def test_class_ordering(self, testdir): - testdir.makeconftest(""" - import pytest - - l = [] - - @pytest.fixture(scope="function", params=[1,2]) - def farg(request): - return request.param - - @pytest.fixture(scope="class", params=list("ab")) - def carg(request): - return request.param - - @pytest.fixture(scope="function", autouse=True) - def append(request, farg, carg): - def fin(): - l.append("fin_%s%s" % (carg, farg)) - request.addfinalizer(fin) - """) - testdir.makepyfile(""" - import pytest - - class TestClass2: - def test_1(self): - pass - def test_2(self): - pass - class TestClass: - def test_3(self): - pass - """) - result = testdir.runpytest("-vs") - result.stdout.fnmatch_lines(""" - test_class_ordering.py::TestClass2::test_1[1-a] PASSED - test_class_ordering.py::TestClass2::test_1[2-a] PASSED - test_class_ordering.py::TestClass2::test_2[1-a] PASSED - test_class_ordering.py::TestClass2::test_2[2-a] PASSED - test_class_ordering.py::TestClass2::test_1[1-b] PASSED - test_class_ordering.py::TestClass2::test_1[2-b] PASSED - test_class_ordering.py::TestClass2::test_2[1-b] PASSED - test_class_ordering.py::TestClass2::test_2[2-b] PASSED - test_class_ordering.py::TestClass::test_3[1-a] PASSED - test_class_ordering.py::TestClass::test_3[2-a] PASSED - test_class_ordering.py::TestClass::test_3[1-b] PASSED - test_class_ordering.py::TestClass::test_3[2-b] PASSED - """) - - def test_parametrize_separated_order_higher_scope_first(self, testdir): - testdir.makepyfile(""" - import pytest - - @pytest.fixture(scope="function", params=[1, 2]) - def arg(request): - param = request.param - request.addfinalizer(lambda: l.append("fin:%s" % param)) - l.append("create:%s" % param) - return request.param - - @pytest.fixture(scope="module", params=["mod1", "mod2"]) - def modarg(request): - param = request.param - request.addfinalizer(lambda: l.append("fin:%s" % param)) - l.append("create:%s" % param) - return request.param - - l = [] - def test_1(arg): - l.append("test1") - def test_2(modarg): - l.append("test2") - def test_3(arg, modarg): - l.append("test3") - def test_4(modarg, arg): - l.append("test4") - """) - reprec = testdir.inline_run("-v") - reprec.assertoutcome(passed=12) - l = reprec.getcalls("pytest_runtest_call")[0].item.module.l - expected = [ - 'create:1', 'test1', 'fin:1', 'create:2', 'test1', - 'fin:2', 'create:mod1', 'test2', 'create:1', 'test3', - 'fin:1', 'create:2', 'test3', 'fin:2', 'create:1', - 'test4', 'fin:1', 'create:2', 'test4', 'fin:2', - 'fin:mod1', 'create:mod2', 'test2', 'create:1', 'test3', - 'fin:1', 'create:2', 'test3', 'fin:2', 'create:1', - 'test4', 'fin:1', 'create:2', 'test4', 'fin:2', - 'fin:mod2'] - import pprint - pprint.pprint(list(zip(l, expected))) - assert l == expected - - def test_parametrized_fixture_teardown_order(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.fixture(params=[1,2], scope="class") - def param1(request): - return request.param - - l = [] - - class TestClass: - @classmethod - @pytest.fixture(scope="class", autouse=True) - def setup1(self, request, param1): - l.append(1) - request.addfinalizer(self.teardown1) - @classmethod - def teardown1(self): - assert l.pop() == 1 - @pytest.fixture(scope="class", autouse=True) - def setup2(self, request, param1): - l.append(2) - request.addfinalizer(self.teardown2) - @classmethod - def teardown2(self): - assert l.pop() == 2 - def test(self): - pass - - def test_finish(): - assert not l - """) - result = testdir.runpytest("-v") - result.stdout.fnmatch_lines(""" - *3 passed* - """) - assert "error" not in result.stdout.str() - - def test_fixture_finalizer(self, testdir): - testdir.makeconftest(""" - import pytest - import sys - - @pytest.fixture - def browser(request): - - def finalize(): - sys.stdout.write('Finalized') - request.addfinalizer(finalize) - return {} - """) - b = testdir.mkdir("subdir") - b.join("test_overriden_fixture_finalizer.py").write(dedent(""" - import pytest - @pytest.fixture - def browser(browser): - browser['visited'] = True - return browser - - def test_browser(browser): - assert browser['visited'] is True - """)) - reprec = testdir.runpytest("-s") - for test in ['test_browser']: - reprec.stdout.fnmatch_lines('*Finalized*') - - def test_class_scope_with_normal_tests(self, testdir): - testpath = testdir.makepyfile(""" - import pytest - - class Box: - value = 0 - - @pytest.fixture(scope='class') - def a(request): - Box.value += 1 - return Box.value - - def test_a(a): - assert a == 1 - - class Test1: - def test_b(self, a): - assert a == 2 - - class Test2: - def test_c(self, a): - assert a == 3""") - reprec = testdir.inline_run(testpath) - for test in ['test_a', 'test_b', 'test_c']: - assert reprec.matchreport(test).passed - - def test_request_is_clean(self, testdir): - testdir.makepyfile(""" - import pytest - l = [] - @pytest.fixture(params=[1, 2]) - def fix(request): - request.addfinalizer(lambda: l.append(request.param)) - def test_fix(fix): - pass - """) - reprec = testdir.inline_run("-s") - l = reprec.getcalls("pytest_runtest_call")[0].item.module.l - assert l == [1,2] - - def test_parametrize_separated_lifecycle(self, testdir): - testdir.makepyfile(""" - import pytest - - l = [] - @pytest.fixture(scope="module", params=[1, 2]) - def arg(request): - x = request.param - request.addfinalizer(lambda: l.append("fin%s" % x)) - return request.param - def test_1(arg): - l.append(arg) - def test_2(arg): - l.append(arg) - """) - reprec = testdir.inline_run("-vs") - reprec.assertoutcome(passed=4) - l = reprec.getcalls("pytest_runtest_call")[0].item.module.l - import pprint - pprint.pprint(l) - #assert len(l) == 6 - assert l[0] == l[1] == 1 - assert l[2] == "fin1" - assert l[3] == l[4] == 2 - assert l[5] == "fin2" - - def test_parametrize_function_scoped_finalizers_called(self, testdir): - testdir.makepyfile(""" - import pytest - - @pytest.fixture(scope="function", params=[1, 2]) - def arg(request): - x = request.param - request.addfinalizer(lambda: l.append("fin%s" % x)) - return request.param - - l = [] - def test_1(arg): - l.append(arg) - def test_2(arg): - l.append(arg) - def test_3(): - assert len(l) == 8 - assert l == [1, "fin1", 2, "fin2", 1, "fin1", 2, "fin2"] - """) - reprec = testdir.inline_run("-v") - reprec.assertoutcome(passed=5) - - - @pytest.mark.issue246 - @pytest.mark.parametrize("scope", ["session", "function", "module"]) - def test_finalizer_order_on_parametrization(self, scope, testdir): - testdir.makepyfile(""" - import pytest - l = [] - - @pytest.fixture(scope=%(scope)r, params=["1"]) - def fix1(request): - return request.param - - @pytest.fixture(scope=%(scope)r) - def fix2(request, base): - def cleanup_fix2(): - assert not l, "base should not have been finalized" - request.addfinalizer(cleanup_fix2) - - @pytest.fixture(scope=%(scope)r) - def base(request, fix1): - def cleanup_base(): - l.append("fin_base") - print ("finalizing base") - request.addfinalizer(cleanup_base) - - def test_begin(): - pass - def test_baz(base, fix2): - pass - def test_other(): - pass - """ % {"scope": scope}) - reprec = testdir.inline_run("-lvs") - reprec.assertoutcome(passed=3) - - @pytest.mark.issue396 - def test_class_scope_parametrization_ordering(self, testdir): - testdir.makepyfile(""" - import pytest - l = [] - @pytest.fixture(params=["John", "Doe"], scope="class") - def human(request): - request.addfinalizer(lambda: l.append("fin %s" % request.param)) - return request.param - - class TestGreetings: - def test_hello(self, human): - l.append("test_hello") - - class TestMetrics: - def test_name(self, human): - l.append("test_name") - - def test_population(self, human): - l.append("test_population") - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=6) - l = reprec.getcalls("pytest_runtest_call")[0].item.module.l - assert l == ["test_hello", "fin John", "test_hello", "fin Doe", - "test_name", "test_population", "fin John", - "test_name", "test_population", "fin Doe"] - - def test_parametrize_setup_function(self, testdir): - testdir.makepyfile(""" - import pytest - - @pytest.fixture(scope="module", params=[1, 2]) - def arg(request): - return request.param - - @pytest.fixture(scope="module", autouse=True) - def mysetup(request, arg): - request.addfinalizer(lambda: l.append("fin%s" % arg)) - l.append("setup%s" % arg) - - l = [] - def test_1(arg): - l.append(arg) - def test_2(arg): - l.append(arg) - def test_3(): - import pprint - pprint.pprint(l) - if arg == 1: - assert l == ["setup1", 1, 1, ] - elif arg == 2: - assert l == ["setup1", 1, 1, "fin1", - "setup2", 2, 2, ] - - """) - reprec = testdir.inline_run("-v") - reprec.assertoutcome(passed=6) - - def test_fixture_marked_function_not_collected_as_test(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.fixture - def test_app(): - return 1 - - def test_something(test_app): - assert test_app == 1 - """) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=1) - - def test_params_and_ids(self, testdir): - testdir.makepyfile(""" - import pytest - - @pytest.fixture(params=[object(), object()], - ids=['alpha', 'beta']) - def fix(request): - return request.param - - def test_foo(fix): - assert 1 - """) - res = testdir.runpytest('-v') - res.stdout.fnmatch_lines([ - '*test_foo*alpha*', - '*test_foo*beta*']) - - def test_params_and_ids_yieldfixture(self, testdir): - testdir.makepyfile(""" - import pytest - - @pytest.yield_fixture(params=[object(), object()], - ids=['alpha', 'beta']) - def fix(request): - yield request.param - - def test_foo(fix): - assert 1 - """) - res = testdir.runpytest('-v') - res.stdout.fnmatch_lines([ - '*test_foo*alpha*', - '*test_foo*beta*']) - - -class TestRequestScopeAccess: - pytestmark = pytest.mark.parametrize(("scope", "ok", "error"),[ - ["session", "", "fspath class function module"], - ["module", "module fspath", "cls function"], - ["class", "module fspath cls", "function"], - ["function", "module fspath cls function", ""] - ]) - - def test_setup(self, testdir, scope, ok, error): - testdir.makepyfile(""" - import pytest - @pytest.fixture(scope=%r, autouse=True) - def myscoped(request): - for x in %r: - assert hasattr(request, x) - for x in %r: - pytest.raises(AttributeError, lambda: - getattr(request, x)) - assert request.session - assert request.config - def test_func(): - pass - """ %(scope, ok.split(), error.split())) - reprec = testdir.inline_run("-l") - reprec.assertoutcome(passed=1) - - def test_funcarg(self, testdir, scope, ok, error): - testdir.makepyfile(""" - import pytest - @pytest.fixture(scope=%r) - def arg(request): - for x in %r: - assert hasattr(request, x) - for x in %r: - pytest.raises(AttributeError, lambda: - getattr(request, x)) - assert request.session - assert request.config - def test_func(arg): - pass - """ %(scope, ok.split(), error.split())) - reprec = testdir.inline_run() - reprec.assertoutcome(passed=1) - -class TestErrors: - def test_subfactory_missing_funcarg(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.fixture() - def gen(qwe123): - return 1 - def test_something(gen): - pass - """) - result = testdir.runpytest() - assert result.ret != 0 - result.stdout.fnmatch_lines([ - "*def gen(qwe123):*", - "*fixture*qwe123*not found*", - "*1 error*", - ]) - - def test_issue498_fixture_finalizer_failing(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.fixture - def fix1(request): - def f(): - raise KeyError - request.addfinalizer(f) - return object() - - l = [] - def test_1(fix1): - l.append(fix1) - def test_2(fix1): - l.append(fix1) - def test_3(): - assert l[0] != l[1] - """) - result = testdir.runpytest() - result.stdout.fnmatch_lines(""" - *ERROR*teardown*test_1* - *KeyError* - *ERROR*teardown*test_2* - *KeyError* - *3 pass*2 error* - """) - - - - def test_setupfunc_missing_funcarg(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.fixture(autouse=True) - def gen(qwe123): - return 1 - def test_something(): - pass - """) - result = testdir.runpytest() - assert result.ret != 0 - result.stdout.fnmatch_lines([ - "*def gen(qwe123):*", - "*fixture*qwe123*not found*", - "*1 error*", - ]) - -class TestShowFixtures: - def test_funcarg_compat(self, testdir): - config = testdir.parseconfigure("--funcargs") - assert config.option.showfixtures - - def test_show_fixtures(self, testdir): - result = testdir.runpytest("--fixtures") - result.stdout.fnmatch_lines([ - "*tmpdir*", - "*temporary directory*", - ] - ) - - def test_show_fixtures_verbose(self, testdir): - result = testdir.runpytest("--fixtures", "-v") - result.stdout.fnmatch_lines([ - "*tmpdir*--*tmpdir.py*", - "*temporary directory*", - ] - ) - - def test_show_fixtures_testmodule(self, testdir): - p = testdir.makepyfile(''' - import pytest - @pytest.fixture - def _arg0(): - """ hidden """ - @pytest.fixture - def arg1(): - """ hello world """ - ''') - result = testdir.runpytest("--fixtures", p) - result.stdout.fnmatch_lines(""" - *tmpdir - *fixtures defined from* - *arg1* - *hello world* - """) - assert "arg0" not in result.stdout.str() - - @pytest.mark.parametrize("testmod", [True, False]) - def test_show_fixtures_conftest(self, testdir, testmod): - testdir.makeconftest(''' - import pytest - @pytest.fixture - def arg1(): - """ hello world """ - ''') - if testmod: - testdir.makepyfile(""" - def test_hello(): - pass - """) - result = testdir.runpytest("--fixtures") - result.stdout.fnmatch_lines(""" - *tmpdir* - *fixtures defined from*conftest* - *arg1* - *hello world* - """) - - def test_show_fixtures_trimmed_doc(self, testdir): - p = testdir.makepyfile(''' - import pytest - @pytest.fixture - def arg1(): - """ - line1 - line2 - - """ - @pytest.fixture - def arg2(): - """ - line1 - line2 - - """ - ''') - result = testdir.runpytest("--fixtures", p) - result.stdout.fnmatch_lines(""" - * fixtures defined from test_show_fixtures_trimmed_doc * - arg2 - line1 - line2 - arg1 - line1 - line2 - - """) - - - def test_show_fixtures_different_files(self, testdir): - """ - #833: --fixtures only shows fixtures from first file - """ - testdir.makepyfile(test_a=''' - import pytest - - @pytest.fixture - def fix_a(): - """Fixture A""" - pass - - def test_a(fix_a): - pass - ''') - testdir.makepyfile(test_b=''' - import pytest - - @pytest.fixture - def fix_b(): - """Fixture B""" - pass - - def test_b(fix_b): - pass - ''') - result = testdir.runpytest("--fixtures") - result.stdout.fnmatch_lines(""" - * fixtures defined from test_a * - fix_a - Fixture A - - * fixtures defined from test_b * - fix_b - Fixture B - """) - - -class TestContextManagerFixtureFuncs: - def test_simple(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.yield_fixture - def arg1(): - print ("setup") - yield 1 - print ("teardown") - def test_1(arg1): - print ("test1 %s" % arg1) - def test_2(arg1): - print ("test2 %s" % arg1) - assert 0 - """) - result = testdir.runpytest("-s") - result.stdout.fnmatch_lines(""" - *setup* - *test1 1* - *teardown* - *setup* - *test2 1* - *teardown* - """) - - def test_scoped(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.yield_fixture(scope="module") - def arg1(): - print ("setup") - yield 1 - print ("teardown") - def test_1(arg1): - print ("test1 %s" % arg1) - def test_2(arg1): - print ("test2 %s" % arg1) - """) - result = testdir.runpytest("-s") - result.stdout.fnmatch_lines(""" - *setup* - *test1 1* - *test2 1* - *teardown* - """) - - def test_setup_exception(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.yield_fixture(scope="module") - def arg1(): - pytest.fail("setup") - yield 1 - def test_1(arg1): - pass - """) - result = testdir.runpytest("-s") - result.stdout.fnmatch_lines(""" - *pytest.fail*setup* - *1 error* - """) - - def test_teardown_exception(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.yield_fixture(scope="module") - def arg1(): - yield 1 - pytest.fail("teardown") - def test_1(arg1): - pass - """) - result = testdir.runpytest("-s") - result.stdout.fnmatch_lines(""" - *pytest.fail*teardown* - *1 passed*1 error* - """) - - def test_yields_more_than_one(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.yield_fixture(scope="module") - def arg1(): - yield 1 - yield 2 - def test_1(arg1): - pass - """) - result = testdir.runpytest("-s") - result.stdout.fnmatch_lines(""" - *fixture function* - *test_yields*:2* - """) - - - def test_no_yield(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.yield_fixture(scope="module") - def arg1(): - return 1 - def test_1(arg1): - pass - """) - result = testdir.runpytest("-s") - result.stdout.fnmatch_lines(""" - *yield_fixture*requires*yield* - *yield_fixture* - *def arg1* - """) - - def test_yield_not_allowed_in_non_yield(self, testdir): - testdir.makepyfile(""" - import pytest - @pytest.fixture(scope="module") - def arg1(): - yield 1 - def test_1(arg1): - pass - """) - result = testdir.runpytest("-s") - result.stdout.fnmatch_lines(""" - *fixture*cannot use*yield* - *def arg1* - """) - |