diff --git a/changelog/4435.bugfix.rst b/changelog/4435.bugfix.rst new file mode 100644 index 000000000..de60b5e62 --- /dev/null +++ b/changelog/4435.bugfix.rst @@ -0,0 +1 @@ +Fix ``raises(..., 'code(string)')`` frame filename. diff --git a/src/_pytest/python_api.py b/src/_pytest/python_api.py index f895fb8a8..e9cc2bbde 100644 --- a/src/_pytest/python_api.py +++ b/src/_pytest/python_api.py @@ -679,7 +679,7 @@ def raises(expected_exception, *args, **kwargs): loc.update(kwargs) # print "raises frame scope: %r" % frame.f_locals try: - code = _pytest._code.Source(code).compile() + code = _pytest._code.Source(code).compile(_genframe=frame) six.exec_(code, frame.f_globals, loc) # XXX didn't mean f_globals == f_locals something special? # this is destroyed here ... diff --git a/testing/python/fixture.py b/testing/python/fixture.py index 1008bd3d8..86cd29724 100644 --- a/testing/python/fixture.py +++ b/testing/python/fixture.py @@ -526,15 +526,8 @@ class TestRequestBasic(object): try: gc.collect() - leaked_types = sum(1 for _ in gc.garbage - if isinstance(_, PseudoFixtureDef)) - - # debug leaked types if the test fails - print(leaked_types) - - gc.garbage[:] = [] - - assert leaked_types == 0 + leaked = [x for _ in gc.garbage if isinstance(_, PseudoFixtureDef)] + assert leaked == [] finally: gc.set_debug(original) @@ -542,7 +535,7 @@ class TestRequestBasic(object): pass """ ) - result = testdir.runpytest() + result = testdir.runpytest_subprocess() result.stdout.fnmatch_lines("* 1 passed in *") def test_getfixturevalue_recursive(self, testdir): diff --git a/testing/python/raises.py b/testing/python/raises.py index 130b196ac..6ca19c677 100644 --- a/testing/python/raises.py +++ b/testing/python/raises.py @@ -17,6 +17,10 @@ class TestRaises(object): def test_raises_exec(self): pytest.raises(ValueError, "a,x = []") + def test_raises_exec_correct_filename(self): + excinfo = pytest.raises(ValueError, 'int("s")') + assert __file__ in excinfo.traceback[-1].path + def test_raises_syntax_error(self): pytest.raises(SyntaxError, "qwe qwe qwe")