rename recorder functionality, unify interfaces
--HG-- branch : trunk
This commit is contained in:
parent
17762db128
commit
1973817f11
|
@ -4,7 +4,7 @@ from py.__.execnet.gateway import ExecnetAPI
|
|||
|
||||
class TestExecnetEvents:
|
||||
def test_popengateway(self, _pytest):
|
||||
rec = _pytest.getcallrecorder(ExecnetAPI)
|
||||
rec = _pytest.gethookrecorder(ExecnetAPI)
|
||||
gw = py.execnet.PopenGateway()
|
||||
call = rec.popcall("pyexecnet_gateway_init")
|
||||
assert call.gateway == gw
|
||||
|
|
|
@ -21,7 +21,7 @@ class TestGatewayManagerPopen:
|
|||
assert spec.chdir == "abc"
|
||||
|
||||
def test_popen_makegateway_events(self, _pytest):
|
||||
rec = _pytest.getcallrecorder(py.execnet._HookSpecs)
|
||||
rec = _pytest.gethookrecorder(py.execnet._HookSpecs)
|
||||
hm = GatewayManager(["popen"] * 2)
|
||||
hm.makegateways()
|
||||
call = rec.popcall("pyexecnet_gwmanage_newgateway")
|
||||
|
@ -63,7 +63,7 @@ class TestGatewayManagerPopen:
|
|||
|
||||
def test_hostmanage_rsync_same_popen_twice(self, mysetup, _pytest):
|
||||
source, dest = mysetup.source, mysetup.dest
|
||||
rec = _pytest.getcallrecorder(py.execnet._HookSpecs)
|
||||
rec = _pytest.gethookrecorder(py.execnet._HookSpecs)
|
||||
hm = GatewayManager(["popen//chdir=%s" %dest] * 2)
|
||||
hm.makegateways()
|
||||
source.ensure("dir1", "dir2", "hello")
|
||||
|
|
|
@ -174,13 +174,13 @@ class TestDSession:
|
|||
session.senditems_load([item1, item2])
|
||||
node = session.item2nodes[item1] [0]
|
||||
session.queueevent("pytest_testnodedown", node=node, error=None)
|
||||
evrec = testdir.geteventrecorder(session.pluginmanager)
|
||||
reprec = testdir.getreportrecorder(session.pluginmanager)
|
||||
print session.item2nodes
|
||||
loopstate = session._initloopstate([])
|
||||
session.loop_once(loopstate)
|
||||
|
||||
assert loopstate.colitems == [item2] # do not reschedule crash item
|
||||
testrep = evrec.matchreport(names="itemtestreport")
|
||||
testrep = reprec.matchreport(names="pytest_itemtestreport")
|
||||
assert testrep.failed
|
||||
assert testrep.colitem == item1
|
||||
assert str(testrep.longrepr).find("crashed") != -1
|
||||
|
@ -261,13 +261,13 @@ class TestDSession:
|
|||
session.addnode(node)
|
||||
loopstate = session._initloopstate([])
|
||||
loopstate.shuttingdown = True
|
||||
evrec = testdir.geteventrecorder(session.pluginmanager)
|
||||
reprec = testdir.getreportrecorder(session.pluginmanager)
|
||||
session.queueevent("pytest_itemtestreport", rep=run(item, node))
|
||||
session.loop_once(loopstate)
|
||||
assert not evrec.getcalls("pytest_testnodedown")
|
||||
assert not reprec.getcalls("pytest_testnodedown")
|
||||
session.queueevent("pytest_testnodedown", node=node, error=None)
|
||||
session.loop_once(loopstate)
|
||||
assert evrec.getcall('pytest_testnodedown').node == node
|
||||
assert reprec.getcall('pytest_testnodedown').node == node
|
||||
|
||||
def test_filteritems(self, testdir):
|
||||
modcol = testdir.getmodulecol("""
|
||||
|
@ -282,18 +282,18 @@ class TestDSession:
|
|||
dsel = session.filteritems([modcol])
|
||||
assert dsel == [modcol]
|
||||
items = modcol.collect()
|
||||
callrecorder = testdir.geteventrecorder(session.pluginmanager).callrecorder
|
||||
hookrecorder = testdir.getreportrecorder(session.pluginmanager).hookrecorder
|
||||
remaining = session.filteritems(items)
|
||||
assert remaining == []
|
||||
|
||||
event = callrecorder.getcalls("pytest_deselected")[-1]
|
||||
event = hookrecorder.getcalls("pytest_deselected")[-1]
|
||||
assert event.items == items
|
||||
|
||||
modcol.config.option.keyword = "test_fail"
|
||||
remaining = session.filteritems(items)
|
||||
assert remaining == [items[0]]
|
||||
|
||||
event = callrecorder.getcalls("pytest_deselected")[-1]
|
||||
event = hookrecorder.getcalls("pytest_deselected")[-1]
|
||||
assert event.items == [items[1]]
|
||||
|
||||
def test_testnodedown_shutdown_after_completion(self, testdir):
|
||||
|
@ -355,16 +355,16 @@ class TestDSession:
|
|||
""")
|
||||
config = testdir.parseconfig('-d', p1, '--tx=popen')
|
||||
dsession = DSession(config)
|
||||
callrecorder = testdir.geteventrecorder(config.pluginmanager).callrecorder
|
||||
hookrecorder = testdir.getreportrecorder(config.pluginmanager).hookrecorder
|
||||
dsession.main([config.getfsnode(p1)])
|
||||
rep = callrecorder.popcall("pytest_itemtestreport").rep
|
||||
rep = hookrecorder.popcall("pytest_itemtestreport").rep
|
||||
assert rep.passed
|
||||
rep = callrecorder.popcall("pytest_itemtestreport").rep
|
||||
rep = hookrecorder.popcall("pytest_itemtestreport").rep
|
||||
assert rep.skipped
|
||||
rep = callrecorder.popcall("pytest_itemtestreport").rep
|
||||
rep = hookrecorder.popcall("pytest_itemtestreport").rep
|
||||
assert rep.failed
|
||||
# see that the node is really down
|
||||
node = callrecorder.popcall("pytest_testnodedown").node
|
||||
node = hookrecorder.popcall("pytest_testnodedown").node
|
||||
assert node.gateway.spec.popen
|
||||
#XXX eq.geteventargs("pytest_testrunfinish")
|
||||
|
||||
|
|
|
@ -107,7 +107,7 @@ class TestNodeManager:
|
|||
config = py.test.config._reparse([source, '--debug'])
|
||||
assert config.option.debug
|
||||
nodemanager = NodeManager(config, specs)
|
||||
sorter = testdir.geteventrecorder(config.pluginmanager).callrecorder
|
||||
sorter = testdir.getreportrecorder(config.pluginmanager).hookrecorder
|
||||
nodemanager.setup_nodes(putevent=[].append)
|
||||
for spec in nodemanager.gwmanager.specs:
|
||||
l = sorter.getcalls("pytest_trace")
|
||||
|
|
|
@ -7,14 +7,13 @@ class PytestArg:
|
|||
def __init__(self, request):
|
||||
self.request = request
|
||||
|
||||
def getcallrecorder(self, hookspecs, comregistry=None):
|
||||
def gethookrecorder(self, hookspecs, comregistry=None):
|
||||
if comregistry is None:
|
||||
comregistry = self.request.config.pluginmanager.comregistry
|
||||
callrecorder = CallRecorder(comregistry)
|
||||
callrecorder.start_recording(hookspecs)
|
||||
self.request.addfinalizer(callrecorder.finalize)
|
||||
return callrecorder
|
||||
|
||||
hookrecorder = HookRecorder(comregistry)
|
||||
hookrecorder.start_recording(hookspecs)
|
||||
self.request.addfinalizer(hookrecorder.finish_recording)
|
||||
return hookrecorder
|
||||
|
||||
class ParsedCall:
|
||||
def __init__(self, name, locals):
|
||||
|
@ -28,7 +27,7 @@ class ParsedCall:
|
|||
del d['_name']
|
||||
return "<ParsedCall %r(**%r)>" %(self._name, d)
|
||||
|
||||
class CallRecorder:
|
||||
class HookRecorder:
|
||||
def __init__(self, comregistry):
|
||||
self._comregistry = comregistry
|
||||
self.calls = []
|
||||
|
@ -40,23 +39,18 @@ class CallRecorder:
|
|||
_recorder = self
|
||||
for name, method in vars(hookspecs).items():
|
||||
if name[0] != "_":
|
||||
setattr(RecordCalls, name, self._getcallparser(method))
|
||||
setattr(RecordCalls, name, self._makecallparser(method))
|
||||
recorder = RecordCalls()
|
||||
self._recorders[hookspecs] = recorder
|
||||
self._comregistry.register(recorder)
|
||||
self.hook = py._com.Hooks(hookspecs, registry=self._comregistry)
|
||||
|
||||
def finalize(self):
|
||||
def finish_recording(self):
|
||||
for recorder in self._recorders.values():
|
||||
self._comregistry.unregister(recorder)
|
||||
self._recorders.clear()
|
||||
|
||||
def recordsmethod(self, name):
|
||||
for hookspecs in self._recorders:
|
||||
if hasattr(hookspecs, name):
|
||||
return True
|
||||
|
||||
def _getcallparser(self, method):
|
||||
def _makecallparser(self, method):
|
||||
name = method.__name__
|
||||
args, varargs, varkw, default = py.std.inspect.getargspec(method)
|
||||
assert args[0] == "self"
|
||||
|
@ -72,13 +66,6 @@ class CallRecorder:
|
|||
""" % locals())
|
||||
return locals()[name]
|
||||
|
||||
def popcall(self, name):
|
||||
for i, call in py.builtin.enumerate(self.calls):
|
||||
if call._name == name:
|
||||
del self.calls[i]
|
||||
return call
|
||||
raise ValueError("could not find call %r in %r" %(name, self.calls))
|
||||
|
||||
def getcalls(self, names):
|
||||
if isinstance(names, str):
|
||||
names = names.split()
|
||||
|
@ -95,12 +82,25 @@ class CallRecorder:
|
|||
l.append(call)
|
||||
return l
|
||||
|
||||
def popcall(self, name):
|
||||
for i, call in py.builtin.enumerate(self.calls):
|
||||
if call._name == name:
|
||||
del self.calls[i]
|
||||
return call
|
||||
raise ValueError("could not find call %r in %r" %(name, self.calls))
|
||||
|
||||
def getcall(self, name):
|
||||
l = self.getcalls(name)
|
||||
assert len(l) == 1, (name, l)
|
||||
return l[0]
|
||||
|
||||
|
||||
def test_generic(plugintester):
|
||||
plugintester.hookcheck()
|
||||
|
||||
def test_callrecorder_basic():
|
||||
def test_hookrecorder_basic():
|
||||
comregistry = py._com.Registry()
|
||||
rec = CallRecorder(comregistry)
|
||||
rec = HookRecorder(comregistry)
|
||||
class ApiClass:
|
||||
def xyz(self, arg):
|
||||
pass
|
||||
|
@ -118,7 +118,7 @@ def test_functional(testdir, linecomp):
|
|||
def test_func(_pytest):
|
||||
class ApiClass:
|
||||
def xyz(self, arg): pass
|
||||
rec = _pytest.getcallrecorder(ApiClass)
|
||||
rec = _pytest.gethookrecorder(ApiClass)
|
||||
class Plugin:
|
||||
def xyz(self, arg):
|
||||
return arg + 1
|
||||
|
|
|
@ -93,7 +93,7 @@ class TestDoctests:
|
|||
def test_collect_module(self, testdir):
|
||||
path = testdir.makepyfile(whatever="#")
|
||||
for p in (path, testdir.tmpdir):
|
||||
items, evrec = testdir.inline_genitems(p, '--doctest-modules')
|
||||
items, reprec = testdir.inline_genitems(p, '--doctest-modules')
|
||||
assert len(items) == 1
|
||||
assert isinstance(items[0], DoctestModule)
|
||||
|
||||
|
|
|
@ -30,20 +30,20 @@ def test_generic(plugintester):
|
|||
|
||||
class TestCapture:
|
||||
def test_std_functional(self, testdir):
|
||||
evrec = testdir.inline_runsource("""
|
||||
reprec = testdir.inline_runsource("""
|
||||
def test_hello(stdcapture):
|
||||
print 42
|
||||
out, err = stdcapture.reset()
|
||||
assert out.startswith("42")
|
||||
""")
|
||||
evrec.assertoutcome(passed=1)
|
||||
reprec.assertoutcome(passed=1)
|
||||
|
||||
def test_stdfd_functional(self, testdir):
|
||||
evrec = testdir.inline_runsource("""
|
||||
reprec = testdir.inline_runsource("""
|
||||
def test_hello(stdcapturefd):
|
||||
import os
|
||||
os.write(1, "42")
|
||||
out, err = stdcapturefd.reset()
|
||||
assert out.startswith("42")
|
||||
""")
|
||||
evrec.assertoutcome(passed=1)
|
||||
reprec.assertoutcome(passed=1)
|
||||
|
|
|
@ -57,10 +57,10 @@ def test_toproxy(testdir, monkeypatch):
|
|||
def test_skip():
|
||||
py.test.skip("")
|
||||
""")
|
||||
evrec = testdir.inline_run(testpath, "-P")
|
||||
reprec = testdir.inline_run(testpath, "-P")
|
||||
assert len(l) == 1
|
||||
assert l[0][0] == "python"
|
||||
s = l[0][1]
|
||||
assert s.find("def test_fail") != -1
|
||||
assert evrec.countoutcomes() == [1,1,1]
|
||||
assert reprec.countoutcomes() == [1,1,1]
|
||||
|
||||
|
|
|
@ -7,9 +7,10 @@ import os
|
|||
import inspect
|
||||
from py.__.test import runner
|
||||
from py.__.test.config import Config as pytestConfig
|
||||
from pytest__pytest import CallRecorder
|
||||
from pytest__pytest import HookRecorder
|
||||
import api
|
||||
|
||||
|
||||
def pytest_funcarg__linecomp(request):
|
||||
return LineComp()
|
||||
|
||||
|
@ -20,10 +21,10 @@ def pytest_funcarg__testdir(request):
|
|||
tmptestdir = TmpTestdir(request)
|
||||
return tmptestdir
|
||||
|
||||
def pytest_funcarg__eventrecorder(request):
|
||||
evrec = EventRecorder(py._com.comregistry)
|
||||
request.addfinalizer(lambda: evrec.comregistry.unregister(evrec))
|
||||
return evrec
|
||||
def pytest_funcarg__reportrecorder(request):
|
||||
reprec = ReportRecorder(py._com.comregistry)
|
||||
request.addfinalizer(lambda: reprec.comregistry.unregister(reprec))
|
||||
return reprec
|
||||
|
||||
def test_generic(plugintester):
|
||||
plugintester.hookcheck()
|
||||
|
@ -72,12 +73,12 @@ class TmpTestdir:
|
|||
if hasattr(self, '_olddir'):
|
||||
self._olddir.chdir()
|
||||
|
||||
def geteventrecorder(self, registry):
|
||||
sorter = EventRecorder(registry)
|
||||
sorter.callrecorder = CallRecorder(registry)
|
||||
sorter.callrecorder.start_recording(api.PluginHooks)
|
||||
sorter.hook = sorter.callrecorder.hook
|
||||
self.request.addfinalizer(sorter.callrecorder.finalize)
|
||||
def getreportrecorder(self, registry):
|
||||
sorter = ReportRecorder(registry)
|
||||
sorter.hookrecorder = HookRecorder(registry)
|
||||
sorter.hookrecorder.start_recording(api.PluginHooks)
|
||||
sorter.hook = sorter.hookrecorder.hook
|
||||
self.request.addfinalizer(sorter.hookrecorder.finish_recording)
|
||||
return sorter
|
||||
|
||||
def chdir(self):
|
||||
|
@ -129,7 +130,7 @@ class TmpTestdir:
|
|||
#config = self.parseconfig(*args)
|
||||
config = self.parseconfig(*args)
|
||||
session = config.initsession()
|
||||
rec = self.geteventrecorder(config.pluginmanager)
|
||||
rec = self.getreportrecorder(config.pluginmanager)
|
||||
colitems = [config.getfsnode(arg) for arg in config.args]
|
||||
items = list(session.genitems(colitems))
|
||||
return items, rec
|
||||
|
@ -151,7 +152,7 @@ class TmpTestdir:
|
|||
config = self.parseconfig(*args)
|
||||
config.pluginmanager.do_configure(config)
|
||||
session = config.initsession()
|
||||
sorter = self.geteventrecorder(config.pluginmanager)
|
||||
sorter = self.getreportrecorder(config.pluginmanager)
|
||||
session.main()
|
||||
config.pluginmanager.do_unconfigure(config)
|
||||
return sorter
|
||||
|
@ -161,10 +162,12 @@ class TmpTestdir:
|
|||
for plugin in self.plugins:
|
||||
if isinstance(plugin, str):
|
||||
config.pluginmanager.import_plugin(plugin)
|
||||
elif plugin:
|
||||
else:
|
||||
if isinstance(plugin, dict):
|
||||
plugin = PseudoPlugin(plugin)
|
||||
if not config.pluginmanager.isregistered(plugin):
|
||||
config.pluginmanager.register(plugin)
|
||||
#print "config.pluginmanager.impname2plugin", config.pluginmanager.impname2plugin
|
||||
return config
|
||||
|
||||
def parseconfig(self, *args):
|
||||
|
@ -284,55 +287,24 @@ class PseudoPlugin:
|
|||
def __init__(self, vars):
|
||||
self.__dict__.update(vars)
|
||||
|
||||
|
||||
class Event:
|
||||
def __init__(self, name, args, kwargs):
|
||||
self.name = name
|
||||
self.args = args
|
||||
self.kwargs = kwargs
|
||||
def __repr__(self):
|
||||
return "<Event %r %r>" %(self.name, self.args)
|
||||
|
||||
class ParsedCall:
|
||||
def __init__(self, locals):
|
||||
self.__dict__ = locals.copy()
|
||||
|
||||
def __repr__(self):
|
||||
return "<ParsedCall %r>" %(self.__dict__,)
|
||||
|
||||
class EventRecorder(object):
|
||||
def __init__(self, comregistry, debug=False): # True):
|
||||
class ReportRecorder(object):
|
||||
def __init__(self, comregistry):
|
||||
self.comregistry = comregistry
|
||||
self.debug = debug
|
||||
comregistry.register(self)
|
||||
|
||||
def getcall(self, name):
|
||||
l = self.getcalls(name)
|
||||
assert len(l) == 1, (name, l)
|
||||
return l[0]
|
||||
return self.hookrecorder.getcall(name)
|
||||
|
||||
def getcalls(self, *names):
|
||||
def getcalls(self, names):
|
||||
""" return list of ParsedCall instances matching the given eventname. """
|
||||
if len(names) == 1 and isinstance(names, str):
|
||||
names = names.split()
|
||||
l = []
|
||||
for name in names:
|
||||
if self.callrecorder.recordsmethod("pytest_" + name):
|
||||
name = "pytest_" + name
|
||||
if self.callrecorder.recordsmethod(name):
|
||||
l.extend(self.callrecorder.getcalls(name))
|
||||
return l
|
||||
return self.hookrecorder.getcalls(names)
|
||||
|
||||
# functionality for test reports
|
||||
|
||||
def getreports(self, names="itemtestreport collectreport"):
|
||||
names = [("pytest_" + x) for x in names.split()]
|
||||
l = []
|
||||
for call in self.getcalls(*names):
|
||||
l.append(call.rep)
|
||||
return l
|
||||
def getreports(self, names="pytest_itemtestreport pytest_collectreport"):
|
||||
return [x.rep for x in self.getcalls(names)]
|
||||
|
||||
def matchreport(self, inamepart="", names="itemtestreport collectreport"):
|
||||
def matchreport(self, inamepart="", names="pytest_itemtestreport pytest_collectreport"):
|
||||
""" return a testreport whose dotted import path matches """
|
||||
l = []
|
||||
for rep in self.getreports(names=names):
|
||||
|
@ -346,21 +318,17 @@ class EventRecorder(object):
|
|||
inamepart, l))
|
||||
return l[0]
|
||||
|
||||
def getfailures(self, names='itemtestreport collectreport'):
|
||||
l = []
|
||||
for call in self.getcalls(*names.split()):
|
||||
if call.rep.failed:
|
||||
l.append(call.rep)
|
||||
return l
|
||||
def getfailures(self, names='pytest_itemtestreport pytest_collectreport'):
|
||||
return [rep for rep in self.getreports(names) if rep.failed]
|
||||
|
||||
def getfailedcollections(self):
|
||||
return self.getfailures('collectreport')
|
||||
return self.getfailures('pytest_collectreport')
|
||||
|
||||
def listoutcomes(self):
|
||||
passed = []
|
||||
skipped = []
|
||||
failed = []
|
||||
for rep in self.getreports("itemtestreport"):
|
||||
for rep in self.getreports("pytest_itemtestreport"):
|
||||
if rep.passed:
|
||||
passed.append(rep)
|
||||
elif rep.skipped:
|
||||
|
@ -379,15 +347,15 @@ class EventRecorder(object):
|
|||
assert failed == len(realfailed)
|
||||
|
||||
def clear(self):
|
||||
self.callrecorder.calls[:] = []
|
||||
self.hookrecorder.calls[:] = []
|
||||
|
||||
def unregister(self):
|
||||
self.comregistry.unregister(self)
|
||||
self.callrecorder.finalize()
|
||||
self.hookrecorder.finish_recording()
|
||||
|
||||
def test_eventrecorder(testdir):
|
||||
def test_reportrecorder(testdir):
|
||||
registry = py._com.Registry()
|
||||
recorder = testdir.geteventrecorder(registry)
|
||||
recorder = testdir.getreportrecorder(registry)
|
||||
assert not recorder.getfailures()
|
||||
rep = runner.ItemTestReport(None, None)
|
||||
rep.passed = False
|
||||
|
@ -406,7 +374,7 @@ def test_eventrecorder(testdir):
|
|||
rep = runner.CollectReport(None, None)
|
||||
rep.passed = False
|
||||
rep.failed = True
|
||||
recorder.hook.pytest_itemtestreport(rep=rep)
|
||||
recorder.hook.pytest_collectreport(rep=rep)
|
||||
|
||||
passed, skipped, failed = recorder.listoutcomes()
|
||||
assert not passed and skipped and failed
|
||||
|
@ -414,13 +382,13 @@ def test_eventrecorder(testdir):
|
|||
numpassed, numskipped, numfailed = recorder.countoutcomes()
|
||||
assert numpassed == 0
|
||||
assert numskipped == 1
|
||||
assert numfailed == 2
|
||||
assert numfailed == 1
|
||||
assert len(recorder.getfailedcollections()) == 1
|
||||
|
||||
recorder.unregister()
|
||||
recorder.clear()
|
||||
assert not recorder.getfailures()
|
||||
recorder.hook.pytest_itemtestreport(rep=rep)
|
||||
assert not recorder.getfailures()
|
||||
py.test.raises(ValueError, "recorder.getfailures()")
|
||||
|
||||
class LineComp:
|
||||
def __init__(self):
|
||||
|
|
|
@ -208,7 +208,7 @@ class TestRunnerPlugin:
|
|||
item = testdir.getitem("""def test_func(): pass""")
|
||||
plugin = RunnerPlugin()
|
||||
plugin.pytest_configure(item.config)
|
||||
sorter = testdir.geteventrecorder(item.config.pluginmanager)
|
||||
sorter = testdir.getreportrecorder(item.config.pluginmanager)
|
||||
plugin.pytest_item_setup_and_runtest(item)
|
||||
rep = sorter.getcall("pytest_itemtestreport").rep
|
||||
assert rep.passed
|
||||
|
@ -248,7 +248,7 @@ class TestSetupEvents:
|
|||
print "13"
|
||||
raise ValueError(25)
|
||||
""")
|
||||
rep = evrec.popcall(pytest_itemsetupreport).rep
|
||||
rep = reprec.popcall(pytest_itemsetupreport).rep
|
||||
assert rep.failed
|
||||
assert rep.item == item
|
||||
assert not rep.passed
|
||||
|
|
|
@ -20,10 +20,18 @@ class PluginManager(object):
|
|||
hookspecs=api.PluginHooks,
|
||||
registry=self.comregistry)
|
||||
|
||||
def register(self, plugin, name=None):
|
||||
def _getpluginname(self, plugin, name):
|
||||
if name is None:
|
||||
name = getattr(plugin, '__name__', id(plugin))
|
||||
if name not in self.impname2plugin:
|
||||
if hasattr(plugin, '__name__'):
|
||||
name = plugin.__name__.split(".")[-1]
|
||||
else:
|
||||
name = id(plugin)
|
||||
return name
|
||||
|
||||
def register(self, plugin, name=None):
|
||||
assert not self.isregistered(plugin)
|
||||
name = self._getpluginname(plugin, name)
|
||||
assert name not in self.impname2plugin
|
||||
self.impname2plugin[name] = plugin
|
||||
self.hook.pytest_plugin_registered(plugin=plugin)
|
||||
self.comregistry.register(plugin)
|
||||
|
@ -36,8 +44,8 @@ class PluginManager(object):
|
|||
if value == plugin:
|
||||
del self.impname2plugin[name]
|
||||
|
||||
def isregistered(self, plugin):
|
||||
return self.comregistry.isregistered(plugin)
|
||||
def isregistered(self, plugin, name=None):
|
||||
return self._getpluginname(plugin, name) in self.impname2plugin
|
||||
|
||||
def getplugins(self):
|
||||
return list(self.comregistry)
|
||||
|
|
|
@ -175,7 +175,7 @@ class TestCollectPluginHooks:
|
|||
assert "hello" in wascalled
|
||||
assert "world" in wascalled
|
||||
# make sure the directories do not get double-appended
|
||||
colreports = sorter.getreports("collectreport")
|
||||
colreports = sorter.getreports("pytest_collectreport")
|
||||
names = [rep.colitem.name for rep in colreports]
|
||||
assert names.count("hello") == 1
|
||||
|
||||
|
@ -214,8 +214,8 @@ class TestCustomConftests:
|
|||
""")
|
||||
testdir.mkdir("hello")
|
||||
sorter = testdir.inline_run(testdir.tmpdir)
|
||||
names = [rep.colitem.name for rep in sorter.getreports("collectreport")]
|
||||
names = [rep.colitem.name for rep in sorter.getreports("pytest_collectreport")]
|
||||
assert 'hello' not in names
|
||||
evrec = testdir.inline_run(testdir.tmpdir, "--XX")
|
||||
names = [rep.colitem.name for rep in evrec.getreports("collectreport")]
|
||||
reprec = testdir.inline_run(testdir.tmpdir, "--XX")
|
||||
names = [rep.colitem.name for rep in reprec.getreports("pytest_collectreport")]
|
||||
assert 'hello' in names
|
||||
|
|
|
@ -74,7 +74,7 @@ class TestKeywordSelection:
|
|||
passed, skipped, failed = sorter.listoutcomes()
|
||||
assert len(failed) == 1
|
||||
assert failed[0].colitem.name == name
|
||||
assert len(sorter.getcalls('deselected')) == 1
|
||||
assert len(sorter.getcalls('pytest_deselected')) == 1
|
||||
|
||||
for keyword in ['test_one', 'est_on']:
|
||||
#yield check, keyword, 'test_one'
|
||||
|
|
|
@ -74,7 +74,7 @@ class TestBootstrapping:
|
|||
mod.pytest_plugins = "pytest_a"
|
||||
aplugin = testdir.makepyfile(pytest_a="#")
|
||||
pluginmanager = PluginManager()
|
||||
sorter = testdir.geteventrecorder(pluginmanager)
|
||||
sorter = testdir.getreportrecorder(pluginmanager)
|
||||
#syspath.prepend(aplugin.dirpath())
|
||||
py.std.sys.path.insert(0, str(aplugin.dirpath()))
|
||||
pluginmanager.consider_module(mod)
|
||||
|
@ -83,7 +83,7 @@ class TestBootstrapping:
|
|||
|
||||
# check that it is not registered twice
|
||||
pluginmanager.consider_module(mod)
|
||||
l = sorter.getcalls("plugin_registered")
|
||||
l = sorter.getcalls("pytest_plugin_registered")
|
||||
assert len(l) == 1
|
||||
|
||||
def test_consider_conftest_deprecated(self, testdir):
|
||||
|
@ -113,6 +113,19 @@ class TestBootstrapping:
|
|||
pp.unregister(a2)
|
||||
assert not pp.isregistered(a2)
|
||||
|
||||
def test_register_imported_modules(self):
|
||||
pp = PluginManager()
|
||||
mod = py.std.new.module("x.y.pytest_hello")
|
||||
pp.register(mod)
|
||||
assert pp.isregistered(mod)
|
||||
assert pp.getplugins() == [mod]
|
||||
py.test.raises(AssertionError, "pp.register(mod)")
|
||||
mod2 = py.std.new.module("pytest_hello")
|
||||
#pp.register(mod2) # double registry
|
||||
py.test.raises(AssertionError, "pp.register(mod)")
|
||||
#assert not pp.isregistered(mod2)
|
||||
assert pp.getplugins() == [mod] # does not actually modify plugins
|
||||
|
||||
def test_canonical_importname(self):
|
||||
for name in 'xyz', 'pytest_xyz', 'pytest_Xyz', 'Xyz':
|
||||
impname = canonical_importname(name)
|
||||
|
|
|
@ -19,7 +19,7 @@ class TestSetupStateFunctional:
|
|||
def test_func():
|
||||
pass
|
||||
""")
|
||||
evrec = testdir.geteventrecorder(item.config)
|
||||
reprec = testdir.getreportrecorder(item.config)
|
||||
setup = SetupState()
|
||||
res = setup.do_setup(item)
|
||||
assert res
|
||||
|
@ -32,11 +32,11 @@ class TestSetupStateFunctional:
|
|||
def test_func():
|
||||
pass
|
||||
""")
|
||||
evrec = testdir.geteventrecorder(item.config)
|
||||
reprec = testdir.getreportrecorder(item.config)
|
||||
setup = SetupState()
|
||||
res = setup.do_setup(item)
|
||||
assert not res
|
||||
rep = evrec.popcall(pytest_itemsetupreport).rep
|
||||
rep = reprec.popcall(pytest_itemsetupreport).rep
|
||||
assert rep.failed
|
||||
assert not rep.skipped
|
||||
assert rep.excrepr
|
||||
|
@ -51,14 +51,14 @@ class TestSetupStateFunctional:
|
|||
print "13"
|
||||
raise ValueError(25)
|
||||
""")
|
||||
evrec = testdir.geteventrecorder(item.config)
|
||||
reprec = testdir.getreportrecorder(item.config)
|
||||
setup = SetupState()
|
||||
res = setup.do_setup(item)
|
||||
assert res
|
||||
rep = evrec.popcall(pytest_itemsetupreport).rep
|
||||
rep = reprec.popcall(pytest_itemsetupreport).rep
|
||||
assert rep.passed
|
||||
setup.do_teardown(item)
|
||||
rep = evrec.popcall(pytest_itemsetupreport).rep
|
||||
rep = reprec.popcall(pytest_itemsetupreport).rep
|
||||
assert rep.item == item
|
||||
assert rep.failed
|
||||
assert not rep.passed
|
||||
|
@ -73,10 +73,10 @@ class TestSetupStateFunctional:
|
|||
def test_func():
|
||||
pass
|
||||
""")
|
||||
evrec = testdir.geteventrecorder(item.config)
|
||||
reprec = testdir.getreportrecorder(item.config)
|
||||
setup = SetupState()
|
||||
setup.do_setup(item)
|
||||
rep = evrec.popcall(pytest_itemsetupreport).rep
|
||||
rep = reprec.popcall(pytest_itemsetupreport).rep
|
||||
assert not rep.failed
|
||||
assert rep.skipped
|
||||
assert rep.excrepr
|
||||
|
@ -84,18 +84,18 @@ class TestSetupStateFunctional:
|
|||
|
||||
def test_runtest_ok(self, testdir):
|
||||
item = testdir.getitem("def test_func(): pass")
|
||||
evrec = testdir.geteventrecorder(item.config)
|
||||
reprec = testdir.getreportrecorder(item.config)
|
||||
setup = SetupState()
|
||||
setup.do_fixture_and_runtest(item)
|
||||
rep = evrec.popcall(pytest_itemtestreport).rep
|
||||
rep = reprec.popcall(pytest_itemtestreport).rep
|
||||
assert rep.passed
|
||||
|
||||
def test_runtest_fails(self, testdir):
|
||||
item = testdir.getitem("def test_func(): assert 0")
|
||||
evrec = testdir.geteventrecorder(item.config)
|
||||
reprec = testdir.getreportrecorder(item.config)
|
||||
setup = SetupState()
|
||||
setup.do_fixture_and_runtest(item)
|
||||
event = evrec.popcall(pytest_item_runtest_finished)
|
||||
event = reprec.popcall(pytest_item_runtest_finished)
|
||||
assert event.excinfo
|
||||
|
||||
|
||||
|
|
|
@ -25,9 +25,9 @@ class SessionTests:
|
|||
assert failed[0].colitem.name == "test_one_one"
|
||||
assert failed[1].colitem.name == "test_other"
|
||||
assert failed[2].colitem.name == "test_two"
|
||||
itemstarted = sorter.getcalls("itemstart")
|
||||
itemstarted = sorter.getcalls("pytest_itemstart")
|
||||
assert len(itemstarted) == 4
|
||||
colstarted = sorter.getcalls("collectstart")
|
||||
colstarted = sorter.getcalls("pytest_collectstart")
|
||||
assert len(colstarted) == 1
|
||||
col = colstarted[0].collector
|
||||
assert isinstance(col, py.test.collect.Module)
|
||||
|
@ -130,7 +130,7 @@ class SessionTests:
|
|||
def test_one(): pass
|
||||
""")
|
||||
sorter = testdir.inline_run(testdir.tmpdir)
|
||||
reports = sorter.getreports("collectreport")
|
||||
reports = sorter.getreports("pytest_collectreport")
|
||||
assert len(reports) == 1
|
||||
assert reports[0].skipped
|
||||
|
||||
|
@ -201,9 +201,9 @@ class TestNewSession(SessionTests):
|
|||
|
||||
itemstarted = sorter.getcalls("pytest_itemstart")
|
||||
assert len(itemstarted) == 3
|
||||
assert not sorter.getreports("itemtestreport")
|
||||
assert not sorter.getreports("pytest_itemtestreport")
|
||||
started = sorter.getcalls("pytest_collectstart")
|
||||
finished = sorter.getreports("collectreport")
|
||||
finished = sorter.getreports("pytest_collectreport")
|
||||
assert len(started) == len(finished)
|
||||
assert len(started) == 8
|
||||
colfail = [x for x in finished if x.failed]
|
||||
|
@ -215,7 +215,7 @@ class TestNewSession(SessionTests):
|
|||
testdir.makepyfile(__init__="")
|
||||
testdir.makepyfile(test_one="xxxx", test_two="yyyy")
|
||||
sorter = testdir.inline_run("-x", testdir.tmpdir)
|
||||
finished = sorter.getreports("collectreport")
|
||||
finished = sorter.getreports("pytest_collectreport")
|
||||
colfail = [x for x in finished if x.failed]
|
||||
assert len(colfail) == 1
|
||||
|
||||
|
|
|
@ -118,7 +118,7 @@ def test_func_generator_setup(testdir):
|
|||
yield check
|
||||
assert x == [1]
|
||||
""")
|
||||
rep = sorter.matchreport("test_one", names="itemtestreport")
|
||||
rep = sorter.matchreport("test_one", names="pytest_itemtestreport")
|
||||
assert rep.passed
|
||||
|
||||
def test_method_setup_uses_fresh_instances(testdir):
|
||||
|
|
Loading…
Reference in New Issue