* move some test_pytest_terminal tests to become functional/acceptance tests
* refine pytest_namespace to not take a config object --HG-- branch : 1.0.x
This commit is contained in:
parent
e43e58afed
commit
04a98700d9
|
@ -135,8 +135,8 @@ adding global py.test helpers and functionality
|
|||
If you want to make global helper functions or objects available
|
||||
to your test code you can implement:
|
||||
|
||||
def pytest_namespace(config):
|
||||
""" return dictionary with items to be made available on py.test. """
|
||||
def pytest_namespace():
|
||||
""" return dictionary with items to be made available on py.test. namespace """
|
||||
|
||||
All such returned items will be made available directly on
|
||||
the ``py.test`` namespace.
|
||||
|
|
|
@ -9,15 +9,15 @@ py.test plugin hooks
|
|||
def pytest_addoption(parser):
|
||||
""" called before commandline parsing. """
|
||||
|
||||
def pytest_namespace():
|
||||
""" return dict of name->object which will get stored at py.test. namespace"""
|
||||
|
||||
def pytest_configure(config):
|
||||
""" called after command line options have been parsed.
|
||||
and all plugins and initial conftest files been loaded.
|
||||
``config`` provides access to all such configuration values.
|
||||
"""
|
||||
|
||||
def pytest_namespace(config):
|
||||
""" return dict of name->object to become available at py.test.*"""
|
||||
|
||||
def pytest_unconfigure(config):
|
||||
""" called before test process is exited. """
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@ class HookRecorder:
|
|||
def _makecallparser(self, method):
|
||||
name = method.__name__
|
||||
args, varargs, varkw, default = py.std.inspect.getargspec(method)
|
||||
if args[0] != "self":
|
||||
if args and args[0] != "self":
|
||||
args.insert(0, 'self')
|
||||
fspec = py.std.inspect.formatargspec(args, varargs, varkw, default)
|
||||
# we use exec because we want to have early type
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
"""
|
||||
import py
|
||||
|
||||
def pytest_namespace(config):
|
||||
def pytest_namespace():
|
||||
mark = KeywordDecorator({})
|
||||
return {'mark': mark}
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ def pytest_funcarg__recwarn(request):
|
|||
request.addfinalizer(warnings.finalize)
|
||||
return warnings
|
||||
|
||||
def pytest_namespace(config):
|
||||
def pytest_namespace():
|
||||
return {'deprecated_call': deprecated_call}
|
||||
|
||||
def deprecated_call(func, *args, **kwargs):
|
||||
|
|
|
@ -16,9 +16,31 @@ from pytest_terminal import repr_pythonversion, folded_skips
|
|||
def basic_run_report(item):
|
||||
return runner.call_and_report(item, "call", log=False)
|
||||
|
||||
class Option:
|
||||
def __init__(self, verbose=False):
|
||||
self.verbose = verbose
|
||||
def _getcmdargs(self):
|
||||
l = []
|
||||
if self.verbose:
|
||||
l.append('-v')
|
||||
return l
|
||||
def _getcmdstring(self):
|
||||
return " ".join(self._getcmdargs())
|
||||
|
||||
def pytest_generate_tests(metafunc):
|
||||
if "option" in metafunc.funcargnames:
|
||||
metafunc.addcall(
|
||||
id="default",
|
||||
funcargs={'option': Option(verbose=False)}
|
||||
)
|
||||
metafunc.addcall(
|
||||
id="verbose",
|
||||
funcargs={'option': Option(verbose=True)}
|
||||
)
|
||||
|
||||
class TestTerminal:
|
||||
def test_pass_skip_fail(self, testdir, linecomp):
|
||||
modcol = testdir.getmodulecol("""
|
||||
def test_pass_skip_fail(self, testdir, option):
|
||||
p = testdir.makepyfile("""
|
||||
import py
|
||||
def test_ok():
|
||||
pass
|
||||
|
@ -27,70 +49,30 @@ class TestTerminal:
|
|||
def test_func():
|
||||
assert 0
|
||||
""")
|
||||
rep = TerminalReporter(modcol.config, file=linecomp.stringio)
|
||||
rep.config.pluginmanager.register(rep)
|
||||
rep.config.hook.pytest_sessionstart(session=testdir.session)
|
||||
|
||||
for item in testdir.genitems([modcol]):
|
||||
ev = basic_run_report(item)
|
||||
rep.config.hook.pytest_runtest_logreport(rep=ev)
|
||||
linecomp.assert_contains_lines([
|
||||
"*test_pass_skip_fail.py .sF"
|
||||
result = testdir.runpytest(option._getcmdstring())
|
||||
if option.verbose:
|
||||
result.stdout.fnmatch_lines([
|
||||
"*test_pass_skip_fail.py:2: *test_ok*PASS*",
|
||||
"*test_pass_skip_fail.py:4: *test_skip*SKIP*",
|
||||
"*test_pass_skip_fail.py:6: *test_func*FAIL*",
|
||||
])
|
||||
else:
|
||||
result.stdout.fnmatch_lines([
|
||||
"*test_pass_skip_fail.py .sF"
|
||||
])
|
||||
rep.config.hook.pytest_sessionfinish(session=testdir.session, exitstatus=1)
|
||||
linecomp.assert_contains_lines([
|
||||
result.stdout.fnmatch_lines([
|
||||
" def test_func():",
|
||||
"> assert 0",
|
||||
"E assert 0",
|
||||
])
|
||||
|
||||
def test_pass_skip_fail_verbose(self, testdir, linecomp):
|
||||
modcol = testdir.getmodulecol("""
|
||||
import py
|
||||
def test_ok():
|
||||
pass
|
||||
def test_skip():
|
||||
py.test.skip("xx")
|
||||
def test_func():
|
||||
assert 0
|
||||
""", configargs=("-v",))
|
||||
rep = TerminalReporter(modcol.config, file=linecomp.stringio)
|
||||
rep.config.pluginmanager.register(rep)
|
||||
rep.config.hook.pytest_sessionstart(session=testdir.session)
|
||||
items = modcol.collect()
|
||||
rep.config.option.debug = True #
|
||||
for item in items:
|
||||
rep.config.hook.pytest_itemstart(item=item, node=None)
|
||||
s = linecomp.stringio.getvalue().strip()
|
||||
assert s.endswith(item.name)
|
||||
rep.config.hook.pytest_runtest_logreport(rep=basic_run_report(item))
|
||||
|
||||
linecomp.assert_contains_lines([
|
||||
"*test_pass_skip_fail_verbose.py:2: *test_ok*PASS*",
|
||||
"*test_pass_skip_fail_verbose.py:4: *test_skip*SKIP*",
|
||||
"*test_pass_skip_fail_verbose.py:6: *test_func*FAIL*",
|
||||
])
|
||||
rep.config.hook.pytest_sessionfinish(session=testdir.session, exitstatus=1)
|
||||
linecomp.assert_contains_lines([
|
||||
" def test_func():",
|
||||
"> assert 0",
|
||||
"E assert 0",
|
||||
])
|
||||
|
||||
def test_collect_fail(self, testdir, linecomp):
|
||||
modcol = testdir.getmodulecol("import xyz")
|
||||
rep = TerminalReporter(modcol.config, file=linecomp.stringio)
|
||||
rep.config.pluginmanager.register(rep)
|
||||
rep.config.hook.pytest_sessionstart(session=testdir.session)
|
||||
l = list(testdir.genitems([modcol]))
|
||||
assert len(l) == 0
|
||||
linecomp.assert_contains_lines([
|
||||
"*test_collect_fail.py F*"
|
||||
])
|
||||
rep.config.hook.pytest_sessionfinish(session=testdir.session, exitstatus=1)
|
||||
linecomp.assert_contains_lines([
|
||||
def test_collect_fail(self, testdir, option):
|
||||
p = testdir.makepyfile("import xyz")
|
||||
result = testdir.runpytest(option._getcmdstring())
|
||||
result.stdout.fnmatch_lines([
|
||||
"*test_collect_fail.py F*",
|
||||
"> import xyz",
|
||||
"E ImportError: No module named xyz"
|
||||
"E ImportError: No module named xyz",
|
||||
])
|
||||
|
||||
def test_internalerror(self, testdir, linecomp):
|
||||
|
@ -163,28 +145,20 @@ class TestTerminal:
|
|||
"*%s*" % (modcol.config.topdir),
|
||||
])
|
||||
|
||||
def test_tb_option(self, testdir, linecomp):
|
||||
# XXX usage of testdir
|
||||
def test_tb_option(self, testdir, option):
|
||||
p = testdir.makepyfile("""
|
||||
import py
|
||||
def g():
|
||||
raise IndexError
|
||||
def test_func():
|
||||
print 6*7
|
||||
g() # --calling--
|
||||
""")
|
||||
for tbopt in ["long", "short", "no"]:
|
||||
print 'testing --tb=%s...' % tbopt
|
||||
modcol = testdir.getmodulecol("""
|
||||
import py
|
||||
def g():
|
||||
raise IndexError
|
||||
def test_func():
|
||||
print 6*7
|
||||
g() # --calling--
|
||||
""", configargs=("--tb=%s" % tbopt,))
|
||||
rep = TerminalReporter(modcol.config, file=linecomp.stringio)
|
||||
rep.config.pluginmanager.register(rep)
|
||||
rep.config.hook.pytest_sessionstart(session=testdir.session)
|
||||
for item in testdir.genitems([modcol]):
|
||||
rep.config.hook.pytest_runtest_logreport(
|
||||
rep=basic_run_report(item))
|
||||
rep.config.hook.pytest_sessionfinish(session=testdir.session, exitstatus=1)
|
||||
s = linecomp.stringio.getvalue()
|
||||
result = testdir.runpytest('--tb=%s' % tbopt)
|
||||
s = result.stdout.str()
|
||||
if tbopt == "long":
|
||||
print s
|
||||
assert 'print 6*7' in s
|
||||
else:
|
||||
assert 'print 6*7' not in s
|
||||
|
@ -195,7 +169,6 @@ class TestTerminal:
|
|||
assert 'FAILURES' not in s
|
||||
assert '--calling--' not in s
|
||||
assert 'IndexError' not in s
|
||||
linecomp.stringio.truncate(0)
|
||||
|
||||
def test_show_path_before_running_test(self, testdir, linecomp):
|
||||
item = testdir.getitem("def test_func(): pass")
|
||||
|
@ -245,48 +218,27 @@ class TestTerminal:
|
|||
])
|
||||
|
||||
|
||||
def pseudo_keyboard_interrupt(self, testdir, linecomp, verbose=False):
|
||||
modcol = testdir.getmodulecol("""
|
||||
def test_keyboard_interrupt(self, testdir, option):
|
||||
p = testdir.makepyfile("""
|
||||
def test_foobar():
|
||||
assert 0
|
||||
def test_spamegg():
|
||||
import py; py.test.skip('skip me please!')
|
||||
def test_interrupt_me():
|
||||
raise KeyboardInterrupt # simulating the user
|
||||
""", configargs=("-v",)*verbose)
|
||||
#""", configargs=("--showskipsummary",) + ("-v",)*verbose)
|
||||
rep = TerminalReporter(modcol.config, file=linecomp.stringio)
|
||||
modcol.config.pluginmanager.register(rep)
|
||||
modcol.config.hook.pytest_sessionstart(session=testdir.session)
|
||||
try:
|
||||
for item in testdir.genitems([modcol]):
|
||||
modcol.config.hook.pytest_runtest_logreport(
|
||||
rep=basic_run_report(item))
|
||||
except KeyboardInterrupt:
|
||||
excinfo = py.code.ExceptionInfo()
|
||||
else:
|
||||
py.test.fail("no KeyboardInterrupt??")
|
||||
s = linecomp.stringio.getvalue()
|
||||
if not verbose:
|
||||
assert s.find("_keyboard_interrupt.py Fs") != -1
|
||||
modcol.config.hook.pytest_sessionfinish(
|
||||
session=testdir.session, exitstatus=2, excrepr=excinfo.getrepr())
|
||||
text = linecomp.stringio.getvalue()
|
||||
linecomp.assert_contains_lines([
|
||||
""")
|
||||
|
||||
result = testdir.runpytest(option._getcmdstring())
|
||||
result.stdout.fnmatch_lines([
|
||||
" def test_foobar():",
|
||||
"> assert 0",
|
||||
"E assert 0",
|
||||
"*_keyboard_interrupt.py:6: KeyboardInterrupt*",
|
||||
])
|
||||
#assert "Skipped: 'skip me please!'" in text
|
||||
assert "_keyboard_interrupt.py:6: KeyboardInterrupt" in text
|
||||
see_details = "raise KeyboardInterrupt # simulating the user" in text
|
||||
assert see_details == verbose
|
||||
|
||||
def test_keyboard_interrupt(self, testdir, linecomp):
|
||||
self.pseudo_keyboard_interrupt(testdir, linecomp)
|
||||
|
||||
def test_verbose_keyboard_interrupt(self, testdir, linecomp):
|
||||
self.pseudo_keyboard_interrupt(testdir, linecomp, verbose=True)
|
||||
if option.verbose:
|
||||
result.stdout.fnmatch_lines([
|
||||
"*raise KeyboardInterrupt # simulating the user*",
|
||||
])
|
||||
|
||||
def test_skip_reasons_folding(self):
|
||||
class longrepr:
|
||||
|
|
|
@ -174,7 +174,7 @@ class PluginManager(object):
|
|||
if hasattr(self, '_config'):
|
||||
self.call_plugin(plugin, "pytest_addoption", parser=self._config._parser)
|
||||
self.call_plugin(plugin, "pytest_configure", config=self._config)
|
||||
#dic = self.call_plugin(plugin, "pytest_namespace", config=self._config)
|
||||
#dic = self.call_plugin(plugin, "pytest_namespace")
|
||||
#self._updateext(dic)
|
||||
|
||||
def call_plugin(self, plugin, methname, **kwargs):
|
||||
|
@ -191,7 +191,7 @@ class PluginManager(object):
|
|||
config.pluginmanager.register(self)
|
||||
self._config = config
|
||||
config.hook.pytest_configure(config=self._config)
|
||||
for dic in config.hook.pytest_namespace(config=config) or []:
|
||||
for dic in config.hook.pytest_namespace() or []:
|
||||
self._updateext(dic)
|
||||
|
||||
def do_unconfigure(self, config):
|
||||
|
|
|
@ -175,7 +175,7 @@ class TestPytestPluginInteractions:
|
|||
|
||||
def test_do_ext_namespace(self, testdir):
|
||||
testdir.makeconftest("""
|
||||
def pytest_namespace(config):
|
||||
def pytest_namespace():
|
||||
return {'hello': 'world'}
|
||||
""")
|
||||
p = testdir.makepyfile("""
|
||||
|
|
Loading…
Reference in New Issue