[py-svn] r63209 - in py/trunk/py/test: . dist dist/testing plugin testing
hpk at codespeak.net
hpk at codespeak.net
Sun Mar 22 18:41:38 CET 2009
Author: hpk
Date: Sun Mar 22 18:41:36 2009
New Revision: 63209
Removed:
py/trunk/py/test/dist/testing/test_functional_dsession.py
Modified:
py/trunk/py/test/config.py
py/trunk/py/test/defaultconftest.py
py/trunk/py/test/dist/dsession.py
py/trunk/py/test/dist/nodemanage.py
py/trunk/py/test/dist/testing/test_dsession.py
py/trunk/py/test/dist/txnode.py
py/trunk/py/test/plugin/pytest_default.py
py/trunk/py/test/plugin/pytest_pytester.py
py/trunk/py/test/plugin/pytest_restdoc.py
py/trunk/py/test/testing/acceptance_test.py
py/trunk/py/test/testing/test_config.py
py/trunk/py/test/testing/test_pickling.py
Log:
polish command line options for distributed testing.
Modified: py/trunk/py/test/config.py
==============================================================================
--- py/trunk/py/test/config.py (original)
+++ py/trunk/py/test/config.py Sun Mar 22 18:41:36 2009
@@ -253,21 +253,17 @@
raise self.Error("unknown io capturing: " + iocapture)
def getxspecs(self):
- config = self
- if config.option.numprocesses:
- xspeclist = ['popen'] * config.option.numprocesses
- else:
- xspeclist = []
- for xspec in config.getvalue("tx"):
- i = xspec.find("*")
- try:
- num = int(xspec[:i])
- except ValueError:
- xspeclist.append(xspec)
- else:
- xspeclist.extend([xspec[i+1:]] * num)
+ xspeclist = []
+ for xspec in self.getvalue("tx"):
+ i = xspec.find("*")
+ try:
+ num = int(xspec[:i])
+ except ValueError:
+ xspeclist.append(xspec)
+ else:
+ xspeclist.extend([xspec[i+1:]] * num)
if not xspeclist:
- raise config.Error("MISSING test execution (tx) nodes: please specify --tx")
+ raise self.Error("MISSING test execution (tx) nodes: please specify --tx")
return [py.execnet.XSpec(x) for x in xspeclist]
def getrsyncdirs(self):
Modified: py/trunk/py/test/defaultconftest.py
==============================================================================
--- py/trunk/py/test/defaultconftest.py (original)
+++ py/trunk/py/test/defaultconftest.py Sun Mar 22 18:41:36 2009
@@ -1,21 +1,14 @@
import py
Module = py.test.collect.Module
-#DoctestFile = py.test.collect.DoctestFile
Directory = py.test.collect.Directory
+File = py.test.collect.File
+
+# python collectors
Class = py.test.collect.Class
Generator = py.test.collect.Generator
Function = py.test.collect.Function
Instance = py.test.collect.Instance
-
pytest_plugins = "default terminal xfail tmpdir execnetcleanup monkeypatch".split()
-# ===================================================
-# settings in conftest only (for now) - for distribution
-
-if hasattr(py.std.os, 'nice'):
- dist_nicelevel = py.std.os.nice(0) # nice py.test works
-else:
- dist_nicelevel = 0
-
Modified: py/trunk/py/test/dist/dsession.py
==============================================================================
--- py/trunk/py/test/dist/dsession.py (original)
+++ py/trunk/py/test/dist/dsession.py Sun Mar 22 18:41:36 2009
@@ -62,19 +62,14 @@
self.item2nodes = {}
super(DSession, self).__init__(config=config)
- def pytest_configure(self, config):
- if self.config.getvalue("usepdb"):
- raise self.config.Error("--pdb does not work for distributed tests (yet).")
+ def pytest_configure(self, __call__, config):
+ __call__.execute()
try:
- self.config.getxspecs()
- except self.config.Error:
- print "Please specify test environments for distribution of tests:"
- print "py.test --tx ssh=user at somehost --tx popen//python=python2.5"
- print "conftest.py: pytest_option_tx=['ssh=user at somehost','popen']"
- print "environment: PYTEST_OPTION_TX=ssh=@somehost,popen"
- print
- #print "see also: http://codespeak.net/py/current/doc/test.html#automated-distributed-testing"
- raise SystemExit
+ config.getxspecs()
+ except config.Error:
+ print
+ raise config.Error("dist mode %r needs test execution environments, "
+ "none found." %(config.option.dist))
def main(self, colitems=None):
colitems = self.getinitialitems(colitems)
@@ -126,6 +121,7 @@
loopstate.exitstatus = outcome.EXIT_TESTSFAILED
else:
loopstate.exitstatus = outcome.EXIT_OK
+ #self.config.bus.unregister(loopstate)
def _initloopstate(self, colitems):
loopstate = LoopState(self, colitems)
Modified: py/trunk/py/test/dist/nodemanage.py
==============================================================================
--- py/trunk/py/test/dist/nodemanage.py (original)
+++ py/trunk/py/test/dist/nodemanage.py Sun Mar 22 18:41:36 2009
@@ -65,26 +65,12 @@
def setup_nodes(self, putevent):
self.rsync_roots()
- nice = self.config.getvalue("dist_nicelevel")
- if nice != 0:
- self.gwmanager.multi_exec("""
- import os
- if hasattr(os, 'nice'):
- os.nice(%r)
- """ % nice).waitclose()
-
self.trace_nodestatus()
- multigw = self.gwmanager.getgateways(inplacelocal=False, remote=True)
- multigw.remote_exec("""
- import os, sys
- sys.path.insert(0, os.getcwd())
- """).waitclose()
-
for gateway in self.gwmanager.gateways:
node = MasterNode(gateway, self.config, putevent)
self.nodes.append(node)
def teardown_nodes(self):
- # XXX teardown nodes?
+ # XXX do teardown nodes?
self.gwmanager.exit()
Modified: py/trunk/py/test/dist/testing/test_dsession.py
==============================================================================
--- py/trunk/py/test/dist/testing/test_dsession.py (original)
+++ py/trunk/py/test/dist/testing/test_dsession.py Sun Mar 22 18:41:36 2009
@@ -356,3 +356,30 @@
session.loop_once(loopstate)
assert loopstate.colitems == colreport.result
assert loopstate.exitstatus is None, "loop did not care for colitems"
+
+ def test_dist_some_tests(self, testdir):
+ from py.__.test.dist.testing.test_txnode import EventQueue
+ p1 = testdir.makepyfile(test_one="""
+ def test_1():
+ pass
+ def test_x():
+ import py
+ py.test.skip("aaa")
+ def test_fail():
+ assert 0
+ """)
+ config = testdir.parseconfig('-d', p1, '--tx=popen')
+ dsession = DSession(config)
+ eq = EventQueue(config.bus)
+ dsession.main([config.getfsnode(p1)])
+ ev, = eq.geteventargs("itemtestreport")
+ assert ev.passed
+ ev, = eq.geteventargs("itemtestreport")
+ assert ev.skipped
+ ev, = eq.geteventargs("itemtestreport")
+ assert ev.failed
+ # see that the node is really down
+ node, error = eq.geteventargs("testnodedown")
+ assert node.gateway.spec.popen
+ eq.geteventargs("testrunfinish")
+
Deleted: /py/trunk/py/test/dist/testing/test_functional_dsession.py
==============================================================================
--- /py/trunk/py/test/dist/testing/test_functional_dsession.py Sun Mar 22 18:41:36 2009
+++ (empty file)
@@ -1,94 +0,0 @@
-import py
-from py.__.test.dist.dsession import DSession
-from test_txnode import EventQueue
-
-class TestAsyncFunctional:
- def test_conftest_options(self, testdir):
- p1 = testdir.tmpdir.ensure("dir", 'p1.py')
- p1.dirpath("__init__.py").write("")
- p1.dirpath("conftest.py").write(py.code.Source("""
- print "importing conftest", __file__
- import py
- Option = py.test.config.Option
- option = py.test.config.addoptions("someopt",
- Option('--someopt', action="store_true", dest="someopt", default=False))
- dist_rsync_roots = ['../dir']
- print "added options", option
- print "config file seen from conftest", py.test.config
- """))
- p1.write(py.code.Source("""
- import py, conftest
- def test_1():
- print "config from test_1", py.test.config
- print "conftest from test_1", conftest.__file__
- print "test_1: py.test.config.option.someopt", py.test.config.option.someopt
- print "test_1: conftest", conftest
- print "test_1: conftest.option.someopt", conftest.option.someopt
- assert conftest.option.someopt
- """))
- result = testdir.runpytest('-d', '--tx=popen', p1, '--someopt')
- assert result.ret == 0
- extra = result.stdout.fnmatch_lines([
- "*1 passed*",
- ])
-
- def test_dist_some_tests(self, testdir):
- p1 = testdir.makepyfile(test_one="""
- def test_1():
- pass
- def test_x():
- import py
- py.test.skip("aaa")
- def test_fail():
- assert 0
- """)
- config = testdir.parseconfig('-d', p1, '--tx=popen')
- dsession = DSession(config)
- eq = EventQueue(config.bus)
- dsession.main([config.getfsnode(p1)])
- ev, = eq.geteventargs("itemtestreport")
- assert ev.passed
- ev, = eq.geteventargs("itemtestreport")
- assert ev.skipped
- ev, = eq.geteventargs("itemtestreport")
- assert ev.failed
- # see that the node is really down
- node, error = eq.geteventargs("testnodedown")
- assert node.gateway.spec.popen
- eq.geteventargs("testrunfinish")
-
- def test_distribution_rsyncdirs_example(self, testdir):
- source = testdir.mkdir("source")
- dest = testdir.mkdir("dest")
- subdir = source.mkdir("example_pkg")
- subdir.ensure("__init__.py")
- p = subdir.join("test_one.py")
- p.write("def test_5(): assert not __file__.startswith(%r)" % str(p))
- result = testdir.runpytest("-d", "--rsyncdir=%(subdir)s" % locals(),
- "--tx=popen//chdir=%(dest)s" % locals(), p)
- assert result.ret == 0
- result.stdout.fnmatch_lines([
- "*1* *popen*platform*",
- #"RSyncStart: [G1]",
- #"RSyncFinished: [G1]",
- "*1 passed*"
- ])
- assert dest.join(subdir.basename).check(dir=1)
-
- def test_nice_level(self, testdir):
- """ Tests if nice level behaviour is ok """
- import os
- if not hasattr(os, 'nice'):
- py.test.skip("no os.nice() available")
- testdir.makepyfile(conftest="""
- dist_nicelevel = 10
- """)
- p1 = testdir.makepyfile("""
- def test_nice():
- import os
- assert os.nice(0) == 10
- """)
- evrec = testdir.inline_run('-d', p1, '--tx=popen')
- ev = evrec.getfirstnamed('itemtestreport')
- assert ev.passed
-
Modified: py/trunk/py/test/dist/txnode.py
==============================================================================
--- py/trunk/py/test/dist/txnode.py (original)
+++ py/trunk/py/test/dist/txnode.py Sun Mar 22 18:41:36 2009
@@ -70,6 +70,8 @@
# setting up slave code
def install_slave(gateway, config):
channel = gateway.remote_exec(source="""
+ import os, sys
+ sys.path.insert(0, os.getcwd())
from py.__.test.dist.mypickle import PickleChannel
from py.__.test.dist.txnode import SlaveNode
channel = PickleChannel(channel)
Modified: py/trunk/py/test/plugin/pytest_default.py
==============================================================================
--- py/trunk/py/test/plugin/pytest_default.py (original)
+++ py/trunk/py/test/plugin/pytest_default.py Sun Mar 22 18:41:36 2009
@@ -70,7 +70,7 @@
"and instantiate 'HelloPlugin' from the module."))
group._addoption('-f', '--looponfail',
action="store_true", dest="looponfail", default=False,
- help="run tests, loop on failing test set, until all pass. repeat forever.")
+ help="run tests, re-run failing test set until all pass.")
group = parser.addgroup("test process debugging")
group.addoption('--collectonly',
@@ -94,33 +94,43 @@
action="store_true", dest="debug", default=False,
help="generate and show debugging information.")
- group = parser.addgroup("xplatform", "distributed/cross platform testing")
- group._addoption('-d', '--dist',
- action="store_true", dest="dist", default=False,
- help="ad-hoc distribute tests across machines (requires conftest settings)")
- group._addoption('-n', dest="numprocesses", default=0, metavar="numprocesses",
+ group = parser.addgroup("dist", "distributed testing") # see http://pytest.org/help/dist")
+ group._addoption('--dist', metavar="distmode",
+ action="store", choices=['load', 'each', 'no'],
+ type="choice", dest="dist", default="no",
+ help=("set mode for distributing tests to exec environments.\n\n"
+ "each: send each test to each available environment.\n\n"
+ "load: send each test to available environment.\n\n"
+ "(default) no: run tests inprocess, don't distribute."))
+ group._addoption('--tx', dest="tx", action="append", default=[], metavar="xspec",
+ help=("add a test execution environment. some examples: "
+ "--tx popen//python=python2.5 --tx socket=192.168.1.102:8888 "
+ "--tx ssh=user at codespeak.net//chdir=testcache"))
+ group._addoption('-d',
+ action="store_true", dest="distload", default=False,
+ help="load-balance tests. shortcut for '--dist=load'")
+ group._addoption('-n', dest="numprocesses", metavar="numprocesses",
action="store", type="int",
- help="number of local test processes. conflicts with --dist.")
+ help="shortcut for '--dist=load --tx=NUM*popen'")
group.addoption('--rsyncdir', action="append", default=[], metavar="dir1",
- help="add local directory for rsync to remote test nodes.")
- group._addoption('--tx', dest="tx", action="append", default=[],
- help=("add a test environment, specified in XSpec syntax. examples: "
- "--tx popen//python=python2.5 --tx socket=192.168.1.102"))
- #group._addoption('--rest',
- # action='store_true', dest="restreport", default=False,
- # help="restructured text output reporting."),
+ help="add directory for rsyncing to remote tx nodes.")
def pytest_configure(self, config):
+ self.fixoptions(config)
self.setsession(config)
self.loadplugins(config)
- self.fixoptions(config)
def fixoptions(self, config):
+ if config.option.numprocesses:
+ config.option.dist = "load"
+ config.option.tx = ['popen'] * int(config.option.numprocesses)
+ if config.option.distload:
+ config.option.dist = "load"
if config.getvalue("usepdb"):
if config.getvalue("looponfail"):
raise config.Error("--pdb incompatible with --looponfail.")
- if config.getvalue("dist"):
- raise config.Error("--pdb incomptaible with distributed testing.")
+ if config.option.dist != "no":
+ raise config.Error("--pdb incomptaible with distributing tests.")
def loadplugins(self, config):
for name in config.getvalue("plugin"):
@@ -136,7 +146,7 @@
if val("looponfail"):
from py.__.test.looponfail.remote import LooponfailingSession
config.setsessionclass(LooponfailingSession)
- elif val("numprocesses") or val("dist"):
+ elif val("dist") != "no":
from py.__.test.dist.dsession import DSession
config.setsessionclass(DSession)
@@ -153,10 +163,10 @@
return Exception
return getattr(config._sessionclass, '__name__', None)
assert x() == None
- assert x('--dist') == 'DSession'
+ assert x('-d') == 'DSession'
+ assert x('--dist=each') == 'DSession'
assert x('-n3') == 'DSession'
assert x('-f') == 'LooponfailingSession'
- assert x('--dist', '--collectonly') == 'Session'
def test_generic(plugintester):
plugintester.apicheck(DefaultPlugin)
@@ -173,16 +183,48 @@
assert config.option.plugin == ['default']
config.pytestplugins.do_configure(config)
-def test_conflict_options():
- def check_conflict_option(opts):
- print "testing if options conflict:", " ".join(opts)
- config = py.test.config._reparse(opts)
- py.test.raises(config.Error,
- "config.pytestplugins.do_configure(config)")
- conflict_options = (
- '--looponfail --pdb',
- '--dist --pdb',
- )
- for spec in conflict_options:
- opts = spec.split()
- yield check_conflict_option, opts
+
+class TestDistOptions:
+ def test_getxspecs(self, testdir):
+ config = testdir.parseconfigure("--tx=popen", "--tx", "ssh=xyz")
+ xspecs = config.getxspecs()
+ assert len(xspecs) == 2
+ print xspecs
+ assert xspecs[0].popen
+ assert xspecs[1].ssh == "xyz"
+
+ def test_xspecs_multiplied(self, testdir):
+ xspecs = testdir.parseconfigure("--tx=3*popen",).getxspecs()
+ assert len(xspecs) == 3
+ assert xspecs[1].popen
+
+ def test_getrsyncdirs(self, testdir):
+ config = testdir.parseconfigure('--rsyncdir=' + str(testdir.tmpdir))
+ roots = config.getrsyncdirs()
+ assert len(roots) == 1 + 1
+ assert testdir.tmpdir in roots
+
+ def test_getrsyncdirs_with_conftest(self, testdir):
+ p = py.path.local()
+ for bn in 'x y z'.split():
+ p.mkdir(bn)
+ testdir.makeconftest("""
+ rsyncdirs= 'x',
+ """)
+ config = testdir.parseconfigure(testdir.tmpdir, '--rsyncdir=y', '--rsyncdir=z')
+ roots = config.getrsyncdirs()
+ assert len(roots) == 3 + 1
+ assert py.path.local('y') in roots
+ assert py.path.local('z') in roots
+ assert testdir.tmpdir.join('x') in roots
+
+def test_dist_options(testdir):
+ py.test.raises(Exception, "testdir.parseconfigure('--pdb', '--looponfail')")
+ py.test.raises(Exception, "testdir.parseconfigure('--pdb', '-n 3')")
+ py.test.raises(Exception, "testdir.parseconfigure('--pdb', '-d')")
+ config = testdir.parseconfigure("-n 2")
+ assert config.option.dist == "load"
+ assert config.option.tx == ['popen'] * 2
+
+ config = testdir.parseconfigure("-d")
+ assert config.option.dist == "load"
Modified: py/trunk/py/test/plugin/pytest_pytester.py
==============================================================================
--- py/trunk/py/test/plugin/pytest_pytester.py (original)
+++ py/trunk/py/test/plugin/pytest_pytester.py Sun Mar 22 18:41:36 2009
@@ -55,6 +55,7 @@
self.tmpdir = tmpdir.mkdir(name)
self.plugins = []
self._syspathremove = []
+ self.chdir() # always chdir
def Config(self, pyplugins=None, topdir=None):
if topdir is None:
@@ -163,6 +164,11 @@
config.parse(args)
return config
+ def parseconfigure(self, *args):
+ config = self.parseconfig(*args)
+ config.pytestplugins.do_configure(config)
+ return config
+
def getitem(self, source, funcname="test_func"):
modcol = self.getmodulecol(source)
item = modcol.join(funcname)
Modified: py/trunk/py/test/plugin/pytest_restdoc.py
==============================================================================
--- py/trunk/py/test/plugin/pytest_restdoc.py (original)
+++ py/trunk/py/test/plugin/pytest_restdoc.py Sun Mar 22 18:41:36 2009
@@ -6,12 +6,12 @@
group.addoption('-R', '--urlcheck',
action="store_true", dest="urlcheck", default=False,
help="urlopen() remote links found in ReST text files.")
- group.addoption('--urlcheck-timeout', action="store",
+ group.addoption('--urltimeout', action="store", metavar="secs",
type="int", dest="urlcheck_timeout", default=5,
- help="timeout in seconds for urlcheck")
+ help="timeout in seconds for remote urlchecks")
group.addoption('--forcegen',
action="store_true", dest="forcegen", default=False,
- help="force generation of html files even if they appear up-to-date")
+ help="force generation of html files.")
def pytest_collect_file(self, path, parent):
if path.ext == ".txt":
Modified: py/trunk/py/test/testing/acceptance_test.py
==============================================================================
--- py/trunk/py/test/testing/acceptance_test.py (original)
+++ py/trunk/py/test/testing/acceptance_test.py Sun Mar 22 18:41:36 2009
@@ -4,7 +4,7 @@
pytestpath = pydir.join("bin", "py.test")
EXPECTTIMEOUT=10.0
-class TestPyTest:
+class TestGeneralUsage:
def test_config_error(self, testdir):
testdir.makeconftest("""
class ConftestPlugin:
@@ -251,8 +251,61 @@
"y* = 'xxxxxx*"
])
+ def test_verbose_reporting(self, testdir):
+ p1 = testdir.makepyfile("""
+ import py
+ def test_fail():
+ raise ValueError()
+ def test_pass():
+ pass
+ class TestClass:
+ def test_skip(self):
+ py.test.skip("hello")
+ def test_gen():
+ def check(x):
+ assert x == 1
+ yield check, 0
+ """)
+ result = testdir.runpytest(p1, '-v')
+ result.stdout.fnmatch_lines([
+ "*FAIL*test_verbose_reporting.py:2: test_fail*",
+ "*PASS*test_verbose_reporting.py:4: test_pass*",
+ "*SKIP*test_verbose_reporting.py:7: TestClass.test_skip*",
+ "*FAIL*test_verbose_reporting.py:10: test_gen*",
+ ])
+ assert result.ret == 1
+
+class TestDistribution:
+ def test_dist_conftest_options(self, testdir):
+ p1 = testdir.tmpdir.ensure("dir", 'p1.py')
+ p1.dirpath("__init__.py").write("")
+ p1.dirpath("conftest.py").write(py.code.Source("""
+ print "importing conftest", __file__
+ import py
+ Option = py.test.config.Option
+ option = py.test.config.addoptions("someopt",
+ Option('--someopt', action="store_true", dest="someopt", default=False))
+ dist_rsync_roots = ['../dir']
+ print "added options", option
+ print "config file seen from conftest", py.test.config
+ """))
+ p1.write(py.code.Source("""
+ import py, conftest
+ def test_1():
+ print "config from test_1", py.test.config
+ print "conftest from test_1", conftest.__file__
+ print "test_1: py.test.config.option.someopt", py.test.config.option.someopt
+ print "test_1: conftest", conftest
+ print "test_1: conftest.option.someopt", conftest.option.someopt
+ assert conftest.option.someopt
+ """))
+ result = testdir.runpytest('-d', '--tx=popen', p1, '--someopt')
+ assert result.ret == 0
+ extra = result.stdout.fnmatch_lines([
+ "*1 passed*",
+ ])
- def test_dist_testing(self, testdir):
+ def test_manytests_to_one_popen(self, testdir):
p1 = testdir.makepyfile("""
import py
def test_fail0():
@@ -273,7 +326,7 @@
])
assert result.ret == 1
- def test_dist_testing_conftest_specified(self, testdir):
+ def test_dist_conftest_specified(self, testdir):
p1 = testdir.makepyfile("""
import py
def test_fail0():
@@ -329,44 +382,24 @@
])
assert result.ret == 1
- def test_keyboard_interrupt(self, testdir):
- p1 = testdir.makepyfile("""
- import py
- def test_fail():
- raise ValueError()
- def test_inter():
- raise KeyboardInterrupt()
- """)
- result = testdir.runpytest(p1)
+ def test_distribution_rsyncdirs_example(self, testdir):
+ source = testdir.mkdir("source")
+ dest = testdir.mkdir("dest")
+ subdir = source.mkdir("example_pkg")
+ subdir.ensure("__init__.py")
+ p = subdir.join("test_one.py")
+ p.write("def test_5(): assert not __file__.startswith(%r)" % str(p))
+ result = testdir.runpytest("-d", "--rsyncdir=%(subdir)s" % locals(),
+ "--tx=popen//chdir=%(dest)s" % locals(), p)
+ assert result.ret == 0
result.stdout.fnmatch_lines([
- #"*test_inter() INTERRUPTED",
- "*KEYBOARD INTERRUPT*",
- "*1 failed*",
+ "*1* *popen*platform*",
+ #"RSyncStart: [G1]",
+ #"RSyncFinished: [G1]",
+ "*1 passed*"
])
+ assert dest.join(subdir.basename).check(dir=1)
- def test_verbose_reporting(self, testdir):
- p1 = testdir.makepyfile("""
- import py
- def test_fail():
- raise ValueError()
- def test_pass():
- pass
- class TestClass:
- def test_skip(self):
- py.test.skip("hello")
- def test_gen():
- def check(x):
- assert x == 1
- yield check, 0
- """)
- result = testdir.runpytest(p1, '-v')
- result.stdout.fnmatch_lines([
- "*FAIL*test_verbose_reporting.py:2: test_fail*",
- "*PASS*test_verbose_reporting.py:4: test_pass*",
- "*SKIP*test_verbose_reporting.py:7: TestClass.test_skip*",
- "*FAIL*test_verbose_reporting.py:10: test_gen*",
- ])
- assert result.ret == 1
class TestInteractive:
def getspawn(self, tmpdir):
@@ -443,4 +476,20 @@
"*popen-python2.4*FAIL*",
"*2 failed*"
])
-
+
+class TestKeyboardInterrupt:
+ def test_raised_in_testfunction(self, testdir):
+ p1 = testdir.makepyfile("""
+ import py
+ def test_fail():
+ raise ValueError()
+ def test_inter():
+ raise KeyboardInterrupt()
+ """)
+ result = testdir.runpytest(p1)
+ result.stdout.fnmatch_lines([
+ #"*test_inter() INTERRUPTED",
+ "*KEYBOARD INTERRUPT*",
+ "*1 failed*",
+ ])
+
Modified: py/trunk/py/test/testing/test_config.py
==============================================================================
--- py/trunk/py/test/testing/test_config.py (original)
+++ py/trunk/py/test/testing/test_config.py Sun Mar 22 18:41:36 2009
@@ -218,57 +218,13 @@
assert col.config is config
-class TestOptionsAndConfiguration:
- def test_getxspecs_numprocesses(self, testdir):
- config = testdir.parseconfig("-n3")
- xspecs = config.getxspecs()
- assert len(xspecs) == 3
-
- def test_getxspecs(self, testdir):
- testdir.chdir()
- config = testdir.parseconfig("--tx=popen", "--tx", "ssh=xyz")
- xspecs = config.getxspecs()
- assert len(xspecs) == 2
- print xspecs
- assert xspecs[0].popen
- assert xspecs[1].ssh == "xyz"
-
- def test_xspecs_multiplied(self, testdir):
- testdir.chdir()
- xspecs = testdir.parseconfig("--tx=3*popen",).getxspecs()
- assert len(xspecs) == 3
- assert xspecs[1].popen
-
- def test_getrsyncdirs(self, testdir):
- config = testdir.parseconfig('--rsyncdir=' + str(testdir.tmpdir))
- roots = config.getrsyncdirs()
- assert len(roots) == 1 + 1
- assert testdir.tmpdir in roots
-
- def test_getrsyncdirs_with_conftest(self, testdir):
- testdir.chdir()
- p = py.path.local()
- for bn in 'x y z'.split():
- p.mkdir(bn)
- testdir.makeconftest("""
- rsyncdirs= 'x',
- """)
- config = testdir.parseconfig(testdir.tmpdir, '--rsyncdir=y', '--rsyncdir=z')
- roots = config.getrsyncdirs()
- assert len(roots) == 3 + 1
- assert py.path.local('y') in roots
- assert py.path.local('z') in roots
- assert testdir.tmpdir.join('x') in roots
-
-
-
class TestOptionEffects:
def test_boxed_option_default(self, testdir):
tmpdir = testdir.tmpdir.ensure("subdir", dir=1)
config = py.test.config._reparse([tmpdir])
config.initsession()
assert not config.option.boxed
- config = py.test.config._reparse(['--dist', tmpdir])
+ config = py.test.config._reparse(['-d', tmpdir])
config.initsession()
assert not config.option.boxed
Modified: py/trunk/py/test/testing/test_pickling.py
==============================================================================
--- py/trunk/py/test/testing/test_pickling.py (original)
+++ py/trunk/py/test/testing/test_pickling.py Sun Mar 22 18:41:36 2009
@@ -87,9 +87,7 @@
assert getattr(config2.option, name) == value
assert config2.getvalue("x") == 1
- def test_config_rconfig(self, testdir):
- tmp = testdir.tmpdir
- tmp.ensure("__init__.py")
+ def test_config_pickling_customoption(self, testdir):
testdir.makeconftest("""
class ConftestPlugin:
def pytest_addoption(self, parser):
@@ -97,6 +95,27 @@
group.addoption('-G', '--glong', action="store", default=42,
type="int", dest="gdest", help="g value.")
""")
+ config = testdir.parseconfig("-G", "11")
+ assert config.option.gdest == 11
+ repr = config.__getstate__()
+
+ config = testdir.Config()
+ py.test.raises(AttributeError, "config.option.gdest")
+
+ config2 = testdir.Config()
+ config2.__setstate__(repr)
+ assert config2.option.gdest == 11
+
+ def test_config_pickling_and_conftest_deprecated(self, testdir):
+ tmp = testdir.tmpdir.ensure("w1", "w2", dir=1)
+ tmp.ensure("__init__.py")
+ tmp.join("conftest.py").write(py.code.Source("""
+ class ConftestPlugin:
+ def pytest_addoption(self, parser):
+ group = parser.addgroup("testing group")
+ group.addoption('-G', '--glong', action="store", default=42,
+ type="int", dest="gdest", help="g value.")
+ """))
config = testdir.parseconfig(tmp, "-G", "11")
assert config.option.gdest == 11
repr = config.__getstate__()
@@ -106,10 +125,11 @@
config2 = testdir.Config()
config2.__setstate__(repr)
+ assert config2.option.gdest == 11
+
option = config2.addoptions("testing group",
config2.Option('-G', '--glong', action="store", default=42,
type="int", dest="gdest", help="g value."))
- assert config2.option.gdest == 11
assert option.gdest == 11
def test_config_picklability(self, testdir):
More information about the pytest-commit
mailing list