2010-11-18 05:12:16 +08:00
|
|
|
import py, pytest
|
2010-10-06 20:48:24 +08:00
|
|
|
import sys
|
2009-09-06 22:59:39 +08:00
|
|
|
|
2013-09-06 17:56:04 +08:00
|
|
|
from test_doctest import xfail_if_pdbpp_installed
|
|
|
|
|
2010-07-27 03:15:15 +08:00
|
|
|
class TestPDB:
|
2009-09-06 22:59:39 +08:00
|
|
|
def pytest_funcarg__pdblist(self, request):
|
|
|
|
monkeypatch = request.getfuncargvalue("monkeypatch")
|
|
|
|
pdblist = []
|
|
|
|
def mypdb(*args):
|
|
|
|
pdblist.append(args)
|
2009-10-17 18:56:59 +08:00
|
|
|
plugin = request.config.pluginmanager.getplugin('pdb')
|
2009-09-06 22:59:39 +08:00
|
|
|
monkeypatch.setattr(plugin, 'post_mortem', mypdb)
|
2010-07-27 03:15:15 +08:00
|
|
|
return pdblist
|
|
|
|
|
2009-09-06 22:59:39 +08:00
|
|
|
def test_pdb_on_fail(self, testdir, pdblist):
|
|
|
|
rep = testdir.inline_runsource1('--pdb', """
|
2010-07-27 03:15:15 +08:00
|
|
|
def test_func():
|
2009-09-06 22:59:39 +08:00
|
|
|
assert 0
|
|
|
|
""")
|
|
|
|
assert rep.failed
|
|
|
|
assert len(pdblist) == 1
|
|
|
|
tb = py.code.Traceback(pdblist[0][0])
|
|
|
|
assert tb[-1].name == "test_func"
|
|
|
|
|
2010-06-16 18:35:08 +08:00
|
|
|
def test_pdb_on_xfail(self, testdir, pdblist):
|
|
|
|
rep = testdir.inline_runsource1('--pdb', """
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
@pytest.mark.xfail
|
2010-07-27 03:15:15 +08:00
|
|
|
def test_func():
|
2010-06-16 18:35:08 +08:00
|
|
|
assert 0
|
|
|
|
""")
|
|
|
|
assert "xfail" in rep.keywords
|
2010-07-27 03:15:15 +08:00
|
|
|
assert not pdblist
|
2010-06-16 18:35:08 +08:00
|
|
|
|
2009-09-06 22:59:39 +08:00
|
|
|
def test_pdb_on_skip(self, testdir, pdblist):
|
|
|
|
rep = testdir.inline_runsource1('--pdb', """
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
2009-09-06 22:59:39 +08:00
|
|
|
def test_func():
|
2010-11-18 05:12:16 +08:00
|
|
|
pytest.skip("hello")
|
2009-09-06 22:59:39 +08:00
|
|
|
""")
|
2010-07-27 03:15:15 +08:00
|
|
|
assert rep.skipped
|
2009-09-06 22:59:39 +08:00
|
|
|
assert len(pdblist) == 0
|
|
|
|
|
2010-10-06 20:28:06 +08:00
|
|
|
def test_pdb_on_BdbQuit(self, testdir, pdblist):
|
|
|
|
rep = testdir.inline_runsource1('--pdb', """
|
2010-11-18 05:12:16 +08:00
|
|
|
import bdb
|
2010-10-06 20:28:06 +08:00
|
|
|
def test_func():
|
|
|
|
raise bdb.BdbQuit
|
|
|
|
""")
|
|
|
|
assert rep.failed
|
|
|
|
assert len(pdblist) == 0
|
|
|
|
|
2009-09-06 22:59:39 +08:00
|
|
|
def test_pdb_interaction(self, testdir):
|
|
|
|
p1 = testdir.makepyfile("""
|
|
|
|
def test_1():
|
|
|
|
i = 0
|
|
|
|
assert i == 1
|
|
|
|
""")
|
|
|
|
child = testdir.spawn_pytest("--pdb %s" % p1)
|
2009-12-25 02:43:14 +08:00
|
|
|
child.expect(".*def test_1")
|
|
|
|
child.expect(".*i = 0")
|
2009-09-06 22:59:39 +08:00
|
|
|
child.expect("(Pdb)")
|
|
|
|
child.sendeof()
|
2010-06-17 18:53:29 +08:00
|
|
|
rest = child.read()
|
|
|
|
assert "1 failed" in rest
|
2010-07-27 03:15:15 +08:00
|
|
|
assert "def test_1" not in rest
|
|
|
|
if child.isalive():
|
2009-09-06 22:59:39 +08:00
|
|
|
child.wait()
|
2010-02-08 21:17:01 +08:00
|
|
|
|
|
|
|
def test_pdb_interaction_exception(self, testdir):
|
|
|
|
p1 = testdir.makepyfile("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
2010-02-08 21:17:01 +08:00
|
|
|
def globalfunc():
|
|
|
|
pass
|
|
|
|
def test_1():
|
2010-11-18 05:12:16 +08:00
|
|
|
pytest.raises(ValueError, globalfunc)
|
2010-02-08 21:17:01 +08:00
|
|
|
""")
|
|
|
|
child = testdir.spawn_pytest("--pdb %s" % p1)
|
|
|
|
child.expect(".*def test_1")
|
2010-11-18 05:12:16 +08:00
|
|
|
child.expect(".*pytest.raises.*globalfunc")
|
2010-02-08 21:17:01 +08:00
|
|
|
child.expect("(Pdb)")
|
|
|
|
child.sendline("globalfunc")
|
|
|
|
child.expect(".*function")
|
|
|
|
child.sendeof()
|
|
|
|
child.expect("1 failed")
|
2010-07-27 03:15:15 +08:00
|
|
|
if child.isalive():
|
2010-02-08 21:17:01 +08:00
|
|
|
child.wait()
|
2010-10-06 20:48:24 +08:00
|
|
|
|
2013-09-06 17:56:04 +08:00
|
|
|
def test_pdb_interaction_on_collection_issue181(self, testdir):
|
|
|
|
p1 = testdir.makepyfile("""
|
|
|
|
import pytest
|
|
|
|
xxx
|
|
|
|
""")
|
|
|
|
child = testdir.spawn_pytest("--pdb %s" % p1)
|
|
|
|
#child.expect(".*import pytest.*")
|
|
|
|
child.expect("(Pdb)")
|
|
|
|
child.sendeof()
|
|
|
|
child.expect("1 error")
|
|
|
|
if child.isalive():
|
|
|
|
child.wait()
|
|
|
|
|
|
|
|
def test_pdb_interaction_on_internal_error(self, testdir):
|
|
|
|
testdir.makeconftest("""
|
|
|
|
def pytest_runtest_protocol():
|
|
|
|
0/0
|
|
|
|
""")
|
|
|
|
p1 = testdir.makepyfile("def test_func(): pass")
|
|
|
|
child = testdir.spawn_pytest("--pdb %s" % p1)
|
|
|
|
#child.expect(".*import pytest.*")
|
|
|
|
child.expect("(Pdb)")
|
|
|
|
child.sendeof()
|
|
|
|
if child.isalive():
|
|
|
|
child.wait()
|
|
|
|
|
2010-10-06 20:48:24 +08:00
|
|
|
def test_pdb_interaction_capturing_simple(self, testdir):
|
|
|
|
p1 = testdir.makepyfile("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
2010-10-06 20:48:24 +08:00
|
|
|
def test_1():
|
|
|
|
i = 0
|
|
|
|
print ("hello17")
|
2010-11-18 05:12:16 +08:00
|
|
|
pytest.set_trace()
|
2010-10-06 20:48:24 +08:00
|
|
|
x = 3
|
|
|
|
""")
|
|
|
|
child = testdir.spawn_pytest(str(p1))
|
|
|
|
child.expect("test_1")
|
|
|
|
child.expect("x = 3")
|
|
|
|
child.expect("(Pdb)")
|
|
|
|
child.sendeof()
|
|
|
|
rest = child.read()
|
|
|
|
assert "1 failed" in rest
|
|
|
|
assert "def test_1" in rest
|
|
|
|
assert "hello17" in rest # out is captured
|
|
|
|
if child.isalive():
|
|
|
|
child.wait()
|
|
|
|
|
2013-09-06 21:29:00 +08:00
|
|
|
def test_pdb_set_trace_interception(self, testdir):
|
|
|
|
p1 = testdir.makepyfile("""
|
|
|
|
import pdb
|
|
|
|
def test_1():
|
|
|
|
pdb.set_trace()
|
|
|
|
""")
|
|
|
|
child = testdir.spawn_pytest(str(p1))
|
|
|
|
child.expect("test_1")
|
|
|
|
child.expect("(Pdb)")
|
|
|
|
child.sendeof()
|
|
|
|
rest = child.read()
|
|
|
|
assert "1 failed" in rest
|
|
|
|
assert "reading from stdin while output" not in rest
|
|
|
|
if child.isalive():
|
|
|
|
child.wait()
|
|
|
|
|
2012-11-22 03:43:31 +08:00
|
|
|
def test_pdb_and_capsys(self, testdir):
|
|
|
|
p1 = testdir.makepyfile("""
|
|
|
|
import pytest
|
|
|
|
def test_1(capsys):
|
|
|
|
print ("hello1")
|
|
|
|
pytest.set_trace()
|
|
|
|
""")
|
|
|
|
child = testdir.spawn_pytest(str(p1))
|
|
|
|
child.expect("test_1")
|
|
|
|
child.send("capsys.readouterr()\n")
|
|
|
|
child.expect("hello1")
|
|
|
|
child.sendeof()
|
|
|
|
rest = child.read()
|
|
|
|
if child.isalive():
|
|
|
|
child.wait()
|
|
|
|
|
2013-09-06 17:56:04 +08:00
|
|
|
@xfail_if_pdbpp_installed
|
2011-11-15 21:28:22 +08:00
|
|
|
def test_pdb_interaction_doctest(self, testdir):
|
|
|
|
p1 = testdir.makepyfile("""
|
|
|
|
import pytest
|
|
|
|
def function_1():
|
|
|
|
'''
|
|
|
|
>>> i = 0
|
|
|
|
>>> assert i == 1
|
|
|
|
'''
|
|
|
|
""")
|
|
|
|
child = testdir.spawn_pytest("--doctest-modules --pdb %s" % p1)
|
|
|
|
child.expect("(Pdb)")
|
|
|
|
child.sendline('i')
|
|
|
|
child.expect("0")
|
|
|
|
child.expect("(Pdb)")
|
|
|
|
child.sendeof()
|
|
|
|
rest = child.read()
|
|
|
|
assert "1 failed" in rest
|
|
|
|
if child.isalive():
|
|
|
|
child.wait()
|
|
|
|
|
2010-10-06 20:48:24 +08:00
|
|
|
def test_pdb_interaction_capturing_twice(self, testdir):
|
|
|
|
p1 = testdir.makepyfile("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
2010-10-06 20:48:24 +08:00
|
|
|
def test_1():
|
|
|
|
i = 0
|
|
|
|
print ("hello17")
|
2010-11-18 05:12:16 +08:00
|
|
|
pytest.set_trace()
|
2010-10-06 20:48:24 +08:00
|
|
|
x = 3
|
|
|
|
print ("hello18")
|
2010-11-18 05:12:16 +08:00
|
|
|
pytest.set_trace()
|
2010-10-06 20:48:24 +08:00
|
|
|
x = 4
|
|
|
|
""")
|
|
|
|
child = testdir.spawn_pytest(str(p1))
|
|
|
|
child.expect("test_1")
|
|
|
|
child.expect("x = 3")
|
|
|
|
child.expect("(Pdb)")
|
|
|
|
child.sendline('c')
|
|
|
|
child.expect("x = 4")
|
|
|
|
child.sendeof()
|
|
|
|
rest = child.read()
|
|
|
|
assert "1 failed" in rest
|
|
|
|
assert "def test_1" in rest
|
|
|
|
assert "hello17" in rest # out is captured
|
|
|
|
assert "hello18" in rest # out is captured
|
|
|
|
if child.isalive():
|
|
|
|
child.wait()
|
|
|
|
|
|
|
|
def test_pdb_used_outside_test(self, testdir):
|
|
|
|
p1 = testdir.makepyfile("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
pytest.set_trace()
|
2010-10-06 20:48:24 +08:00
|
|
|
x = 5
|
|
|
|
""")
|
|
|
|
child = testdir.spawn("%s %s" %(sys.executable, p1))
|
|
|
|
child.expect("x = 5")
|
|
|
|
child.sendeof()
|
|
|
|
child.wait()
|
2010-11-23 23:10:47 +08:00
|
|
|
|
2011-08-01 16:53:37 +08:00
|
|
|
def test_pdb_used_in_generate_tests(self, testdir):
|
|
|
|
p1 = testdir.makepyfile("""
|
|
|
|
import pytest
|
|
|
|
def pytest_generate_tests(metafunc):
|
|
|
|
pytest.set_trace()
|
|
|
|
x = 5
|
|
|
|
def test_foo(a):
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
child = testdir.spawn_pytest(str(p1))
|
|
|
|
child.expect("x = 5")
|
|
|
|
child.sendeof()
|
|
|
|
child.wait()
|
2010-11-23 23:10:47 +08:00
|
|
|
def test_pdb_collection_failure_is_shown(self, testdir):
|
|
|
|
p1 = testdir.makepyfile("""xxx """)
|
|
|
|
result = testdir.runpytest("--pdb", p1)
|
|
|
|
result.stdout.fnmatch_lines([
|
|
|
|
"*NameError*xxx*",
|
|
|
|
"*1 error*",
|
|
|
|
])
|