test_ok1/py/test/testing/test_session.py

328 lines
12 KiB
Python

import py
from setupdata import setup_module # sets up global 'tmpdir'
from py.__.test.outcome import Skipped, Failed, Passed, Outcome
implied_options = {
'--pdb': 'usepdb and nocapture',
'-v': 'verbose',
'-l': 'showlocals',
'--runbrowser': 'startserver and runbrowser',
}
conflict_options = ('--looponfailing --pdb',
'--dist --pdb',
'--exec=%s --pdb' % py.std.sys.executable,
)
def test_conflict_options():
for spec in conflict_options:
opts = spec.split()
yield check_conflict_option, opts
def check_conflict_option(opts):
print "testing if options conflict:", " ".join(opts)
config = py.test.config._reparse(opts + [datadir/'filetest.py'])
py.test.raises((ValueError, SystemExit), """
config.initsession()
""")
def test_implied_options():
for key, expr in implied_options.items():
yield check_implied_option, [key], expr
def check_implied_option(opts, expr):
config = py.test.config._reparse(opts + [datadir/'filetest.py'])
session = config.initsession()
assert eval(expr, session.config.option.__dict__)
def test_default_session_options():
for opts in ([], ['-l'], ['-s'], ['--tb=no'], ['--tb=short'],
['--tb=long'], ['--fulltrace'], ['--nomagic'],
['--traceconfig'], ['-v'], ['-v', '-v']):
yield runfiletest, opts
def runfiletest(opts):
config = py.test.config._reparse(opts + [datadir/'filetest.py'])
session = config.initsession()
session.main()
l = session.getitemoutcomepairs(Failed)
assert len(l) == 2
l = session.getitemoutcomepairs(Passed)
assert not l
def test_is_not_boxed_by_default():
config = py.test.config._reparse([datadir])
assert not config.option.boxed
class TestKeywordSelection:
def test_select_simple(self):
for keyword in ['test_one', 'est_on']:
config = py.test.config._reparse([datadir/'filetest.py',
'-k', keyword])
session = config._getsessionclass()(config, py.std.sys.stdout)
session.main()
l = session.getitemoutcomepairs(Failed)
assert len(l) == 1
item = l[0][0]
assert item.name == 'test_one'
l = session.getitemoutcomepairs(Skipped)
assert len(l) == 1
def test_select_extra_keywords(self):
o = tmpdir.ensure('selecttest', dir=1)
tfile = o.join('test_select.py').write(py.code.Source("""
def test_1():
pass
class TestClass:
def test_2(self):
pass
"""))
conftest = o.join('conftest.py').write(py.code.Source("""
import py
class Class(py.test.collect.Class):
def _haskeyword(self, keyword):
return keyword == 'xxx' or \
super(Class, self)._haskeyword(keyword)
"""))
for keyword in ('xxx', 'xxx test_2', 'TestClass', 'xxx -test_1',
'TestClass test_2', 'xxx TestClass test_2',):
f = py.std.StringIO.StringIO()
config = py.test.config._reparse([o, '-k', keyword])
session = config._getsessionclass()(config, f)
session.main()
print "keyword", repr(keyword)
l = session.getitemoutcomepairs(Passed)
assert len(l) == 1
assert l[0][0].name == 'test_2'
l = session.getitemoutcomepairs(Skipped)
assert l[0][0].name == 'test_1'
def test_select_starton(self):
config = py.test.config._reparse([datadir/'testmore.py',
'-j', '-k', "test_two"])
session = config._getsessionclass()(config, py.std.sys.stdout)
session.main()
l = session.getitemoutcomepairs(Passed)
assert len(l) == 2
l = session.getitemoutcomepairs(Skipped)
assert len(l) == 1
class TestTerminalSession:
def mainsession(self, *args):
from py.__.test.terminal.terminal import TerminalSession
self.file = py.std.StringIO.StringIO()
config = py.test.config._reparse(list(args))
session = TerminalSession(config, file=self.file)
session.main()
return session
def test_terminal(self):
session = self.mainsession(datadir / 'filetest.py')
out = self.file.getvalue()
l = session.getitemoutcomepairs(Failed)
assert len(l) == 2
assert out.find('2 failed') != -1
def test_syntax_error_module(self):
session = self.mainsession(datadir / 'syntax_error.py')
l = session.getitemoutcomepairs(Failed)
assert len(l) == 1
out = self.file.getvalue()
assert out.find(str('syntax_error.py')) != -1
assert out.find(str('not python')) != -1
def test_exit_first_problem(self):
session = self.mainsession("--exitfirst",
datadir / 'filetest.py')
assert session.config.option.exitfirst
l = session.getitemoutcomepairs(Failed)
assert len(l) == 1
l = session.getitemoutcomepairs(Passed)
assert not l
def test_collectonly(self):
session = self.mainsession("--collectonly",
datadir / 'filetest.py')
assert session.config.option.collectonly
out = self.file.getvalue()
#print out
l = session.getitemoutcomepairs(Failed)
#if l:
# x = l[0][1].excinfo
# print x.exconly()
# print x.traceback
assert len(l) == 0
for line in ('filetest.py', 'test_one',
'TestClass', 'test_method_one'):
assert out.find(line)
def test_recursion_detection(self):
o = tmpdir.ensure('recursiontest', dir=1)
tfile = o.join('test_recursion.py')
tfile.write(py.code.Source("""
def test_1():
def f():
g()
def g():
f()
f()
"""))
session = self.mainsession(o)
print "back from main", o
out = self.file.getvalue()
#print out
i = out.find('Recursion detected')
assert i != -1
def test_generator_yields_None(self):
o = tmpdir.ensure('generatornonetest', dir=1)
tfile = o.join('test_generatornone.py')
tfile.write(py.code.Source("""
def test_1():
yield None
"""))
session = self.mainsession(o)
out = self.file.getvalue()
#print out
i = out.find('TypeError')
assert i != -1
def test_capturing_hooks_simple(self):
o = tmpdir.ensure('capturing', dir=1)
tfile = o.join('test_capturing.py').write(py.code.Source("""
import py
print "module level output"
def test_capturing():
print 42
print >>py.std.sys.stderr, 23
def test_capturing_error():
print 1
print >>py.std.sys.stderr, 2
raise ValueError
"""))
conftest = o.join('conftest.py').write(py.code.Source("""
import py
class Function(py.test.collect.Function):
def startcapture(self):
self._mycapture = None
def finishcapture(self):
self._testmycapture = None
"""))
session = self.mainsession(o)
l = session.getitemoutcomepairs(Passed)
assert len(l) == 1
item = l[0][0]
assert hasattr(item, '_testmycapture')
print item._testmycapture
assert isinstance(item.parent, py.test.collect.Module)
out, err = item.parent._getouterr()
assert out.find('module level output') != -1
allout = self.file.getvalue()
print "allout:", allout
assert allout.find('module level output') != -1, (
"session didn't show module output")
def test_raises_output(self):
o = tmpdir.ensure('raisestest', dir=1)
tfile = o.join('test_raisesoutput.py')
tfile.write(py.code.Source("""
import py
def test_raises_doesnt():
py.test.raises(ValueError, int, "3")
"""))
session = self.mainsession(o)
out = self.file.getvalue()
if not out.find("DID NOT RAISE") != -1:
print out
py.test.fail("incorrect raises() output")
def test_order_of_execution(self):
o = tmpdir.ensure('ordertest', dir=1)
tfile = o.join('test_orderofexecution.py')
tfile.write(py.code.Source("""
l = []
def test_1():
l.append(1)
def test_2():
l.append(2)
def test_3():
assert l == [1,2]
class Testmygroup:
reslist = l
def test_1(self):
self.reslist.append(1)
def test_2(self):
self.reslist.append(2)
def test_3(self):
self.reslist.append(3)
def test_4(self):
assert self.reslist == [1,2,1,2,3]
"""))
session = self.mainsession(o)
l = session.getitemoutcomepairs(Failed)
assert len(l) == 0
l = session.getitemoutcomepairs(Passed)
assert len(l) == 7
# also test listnames() here ...
item, result = l[-1]
assert item.name == 'test_4'
names = item.listnames()
assert names == ['ordertest', 'test_orderofexecution.py', 'Testmygroup', '()', 'test_4']
def test_nested_import_error(self):
o = tmpdir.ensure('Ians_importfailure', dir=1)
tfile = o.join('test_import_fail.py')
tfile.write(py.code.Source("""
import import_fails
def test_this():
assert import_fails.a == 1
"""))
o.join('import_fails.py').write(py.code.Source("""
import does_not_work
a = 1
"""))
session = self.mainsession(o)
l = session.getitemoutcomepairs(Failed)
assert len(l) == 1
item, outcome = l[0]
assert str(outcome.excinfo).find('does_not_work') != -1
def test_safe_repr(self):
session = self.mainsession(datadir/'brokenrepr.py')
out = self.file.getvalue()
print 'Output of simulated "py.test brokenrepr.py":'
print out
l = session.getitemoutcomepairs(Failed)
assert len(l) == 2
assert out.find("""[Exception("Ha Ha fooled you, I'm a broken repr().") raised in repr()]""") != -1 #'
assert out.find("[unknown exception raised in repr()]") != -1
def test_E_on_correct_line(self):
o = tmpdir.ensure('E_on_correct_line', dir=1)
tfile = o.join('test_correct_line.py')
source = py.code.Source("""
import py
def test_hello():
assert (None ==
['a',
'b',
'c'])
""")
tfile.write(source)
session = self.mainsession(o)
out = self.file.getvalue()
print 'Output of simulated "py.test test_correct_line.py":'
print out
i = out.find('test_correct_line.py:')
assert i >= 0
linenum = int(out[i+len('test_correct_line.py:')]) # a single char
line_to_report = source[linenum-1]
expected_output = '\nE ' + line_to_report + '\n'
print 'Looking for:', expected_output
assert expected_output in out