[svn r57762] * settle on using suptest for supporting test runs
* fix a bug in getmodpath * remove redundant functions/files --HG-- branch : trunk
This commit is contained in:
parent
7518dcabc2
commit
9eb1d55380
|
@ -43,9 +43,13 @@ class PyobjMixin(object):
|
|||
for node in chain:
|
||||
if isinstance(node, Instance):
|
||||
continue
|
||||
if stopatmodule and isinstance(node, Module):
|
||||
break
|
||||
parts.append(node.name)
|
||||
name = node.name
|
||||
if isinstance(node, Module):
|
||||
if stopatmodule:
|
||||
break
|
||||
assert name.endswith(".py")
|
||||
name = name[:-3]
|
||||
parts.append(name)
|
||||
parts.reverse()
|
||||
s = ".".join(parts)
|
||||
return s.replace(".[", "[")
|
||||
|
|
|
@ -64,22 +64,6 @@ class BaseReporter(object):
|
|||
l.append((len(events),) + key)
|
||||
return l
|
||||
|
||||
|
||||
def getmodpath(pycolitem):
|
||||
""" return dotted module path for the given colitem. """
|
||||
colitems = pycolitem.listchain()
|
||||
while colitems:
|
||||
colitem = colitems.pop(0)
|
||||
if isinstance(colitem, colitem.Module):
|
||||
parts = [colitem.obj.__name__]
|
||||
for colitem in colitems:
|
||||
if colitem.name[0] in '([':
|
||||
parts[-1] += colitem.name
|
||||
else:
|
||||
parts.append(colitem.name)
|
||||
return ".".join(parts)
|
||||
return colitem.name
|
||||
|
||||
def repr_pythonversion(v=None):
|
||||
if v is None:
|
||||
v = sys.version_info
|
||||
|
|
|
@ -2,7 +2,7 @@ import py
|
|||
import sys
|
||||
from py.__.test import event
|
||||
from py.__.test.report.base import BaseReporter
|
||||
from py.__.test.report.base import getrelpath, repr_pythonversion, getmodpath
|
||||
from py.__.test.report.base import getrelpath, repr_pythonversion
|
||||
|
||||
class TerminalReporter(BaseReporter):
|
||||
def __init__(self, config, file=None, bus=None):
|
||||
|
|
|
@ -3,8 +3,7 @@ from py.__.test.report.base import BaseReporter
|
|||
from py.__.test.event import EventBus
|
||||
from py.__.test import event
|
||||
from py.__.test.runner import OutcomeRepr
|
||||
from py.__.test.report.base import getrelpath, getmodpath, repr_pythonversion
|
||||
from py.__.test.testing import setupdata
|
||||
from py.__.test.report.base import getrelpath, repr_pythonversion
|
||||
import sys
|
||||
|
||||
class TestBaseReporter:
|
||||
|
@ -73,29 +72,6 @@ class TestBaseReporter:
|
|||
assert lineno == longrepr.lineno
|
||||
assert reason == longrepr.message
|
||||
|
||||
def test_getmodpath_cases():
|
||||
tmpdir = py.test.ensuretemp("test_getmodpath_cases")
|
||||
pkgdir = tmpdir.join("test_getmodpath")
|
||||
pkgdir.ensure("__init__.py")
|
||||
nopkgdir = tmpdir.ensure("nopkg", dir=1)
|
||||
def checkpkg(names, expected):
|
||||
fcol = setupdata.getexamplecollector(names, tmpdir=pkgdir)
|
||||
assert getmodpath(fcol) == pkgdir.basename + "." + expected
|
||||
def checknopkg(names, expected):
|
||||
fcol = setupdata.getexamplecollector(names, tmpdir=nopkgdir)
|
||||
assert getmodpath(fcol) == expected
|
||||
|
||||
for names in (
|
||||
'test_mod.py test_f1 test_mod.test_f1',
|
||||
'test_mod.py TestA () test_m1 test_mod.TestA().test_m1',
|
||||
'test_mod.py test_g1 test_mod.test_g1',
|
||||
'test_mod.py test_g1 [0] test_mod.test_g1[0]',
|
||||
):
|
||||
names = names.split()
|
||||
expected = names.pop()
|
||||
yield checkpkg, names, expected
|
||||
yield checknopkg, names, expected
|
||||
|
||||
def test_repr_python_version():
|
||||
py.magic.patch(sys, 'version_info', (2, 5, 1, 'final', 0))
|
||||
try:
|
||||
|
|
|
@ -1,173 +0,0 @@
|
|||
import py
|
||||
|
||||
#def setup_module(mod):
|
||||
# mod.datadir = setupdatadir()
|
||||
# mod.tmpdir = py.test.ensuretemp(mod.__name__)
|
||||
|
||||
#def setupdatadir():
|
||||
# datadir = py.test.ensuretemp("datadir")
|
||||
# for name in namecontent:
|
||||
# getexamplefile(name)
|
||||
# return datadir
|
||||
|
||||
def getexamplefile(basename, tmpdir=None):
|
||||
if tmpdir is None:
|
||||
tmpdir = py.test.ensuretemp("example")
|
||||
tmpdir.ensure("__init__.py")
|
||||
path = tmpdir.join(basename)
|
||||
if not path.check():
|
||||
path.write(py.code.Source(namecontent[basename]))
|
||||
print "creating testfile", path
|
||||
return path
|
||||
|
||||
def getexamplecollector(names, tmpdir=None):
|
||||
fn = getexamplefile(names[0], tmpdir=tmpdir)
|
||||
config = py.test.config._reparse([fn.dirpath()])
|
||||
col = config.getfsnode(fn)
|
||||
return col._getitembynames(names[1:])
|
||||
|
||||
namecontent = {
|
||||
'syntax_error.py': "this is really not python\n",
|
||||
|
||||
'disabled_module.py': '''
|
||||
disabled = True
|
||||
|
||||
def setup_module(mod):
|
||||
raise ValueError
|
||||
|
||||
class TestClassOne:
|
||||
def test_func(self):
|
||||
raise ValueError
|
||||
|
||||
class TestClassTwo:
|
||||
def setup_class(cls):
|
||||
raise ValueError
|
||||
def test_func(self):
|
||||
raise ValueError
|
||||
''',
|
||||
|
||||
'brokenrepr.py': '''
|
||||
import py
|
||||
|
||||
class BrokenRepr1:
|
||||
"""A broken class with lots of broken methods. Let's try to make the test framework
|
||||
immune to these."""
|
||||
foo=0
|
||||
def __repr__(self):
|
||||
raise Exception("Ha Ha fooled you, I'm a broken repr().")
|
||||
|
||||
class BrokenRepr2:
|
||||
"""A broken class with lots of broken methods. Let's try to make the test framework
|
||||
immune to these."""
|
||||
foo=0
|
||||
def __repr__(self):
|
||||
raise "Ha Ha fooled you, I'm a broken repr()."
|
||||
|
||||
|
||||
class TestBrokenClass:
|
||||
|
||||
def test_explicit_bad_repr(self):
|
||||
t = BrokenRepr1()
|
||||
py.test.raises(Exception, 'repr(t)')
|
||||
|
||||
def test_implicit_bad_repr1(self):
|
||||
t = BrokenRepr1()
|
||||
assert t.foo == 1
|
||||
|
||||
def test_implicit_bad_repr2(self):
|
||||
t = BrokenRepr2()
|
||||
assert t.foo == 1
|
||||
''',
|
||||
|
||||
'failingimport.py': "import gruetzelmuetzel\n",
|
||||
|
||||
'test_mod.py': """
|
||||
class TestA:
|
||||
def test_m1(self):
|
||||
pass
|
||||
def test_f1():
|
||||
pass
|
||||
def test_g1():
|
||||
yield lambda x: None, 42
|
||||
""",
|
||||
|
||||
'file_test.py': """
|
||||
def test_one():
|
||||
assert 42 == 43
|
||||
|
||||
class TestClass(object):
|
||||
def test_method_one(self):
|
||||
assert 42 == 43
|
||||
|
||||
""",
|
||||
|
||||
'test_threepass.py': """
|
||||
def test_one():
|
||||
assert 1
|
||||
|
||||
def test_two():
|
||||
assert 1
|
||||
|
||||
def test_three():
|
||||
assert 1
|
||||
""",
|
||||
|
||||
'testspecial_importerror.py': """
|
||||
|
||||
import asdasd
|
||||
|
||||
""",
|
||||
|
||||
'disabled.py': """
|
||||
class TestDisabled:
|
||||
disabled = True
|
||||
def test_method(self):
|
||||
pass
|
||||
""",
|
||||
|
||||
'test_funcexamples.py': """
|
||||
import py
|
||||
import time
|
||||
def test_funcpassed():
|
||||
pass
|
||||
|
||||
def test_funcfailed():
|
||||
raise AssertionError("hello world")
|
||||
|
||||
def test_funcskipped():
|
||||
py.test.skip("skipped")
|
||||
|
||||
def test_funcprint():
|
||||
print "samfing"
|
||||
|
||||
def test_funcprinterr():
|
||||
print >>py.std.sys.stderr, "samfing"
|
||||
|
||||
def test_funcprintfail():
|
||||
print "samfing elz"
|
||||
asddsa
|
||||
|
||||
def test_funcexplicitfail():
|
||||
py.test.fail("3")
|
||||
|
||||
def test_funcraisesfails():
|
||||
py.test.raises(ValueError, lambda: 123)
|
||||
|
||||
def test_funcoptioncustom():
|
||||
assert py.test.config.getvalue("custom")
|
||||
|
||||
def test_funchang():
|
||||
import time
|
||||
time.sleep(1000)
|
||||
|
||||
def test_funckill15():
|
||||
import os
|
||||
os.kill(os.getpid(), 15)
|
||||
""",
|
||||
|
||||
'docexample.txt': """
|
||||
Aha!!!!!!
|
||||
=========
|
||||
""",
|
||||
|
||||
}
|
|
@ -6,8 +6,6 @@
|
|||
for analyzing events an EventSorter instance is returned for both of:
|
||||
* events_from_cmdline(args): inprocess-run of cmdline invocation
|
||||
* events_from_session(session): inprocess-run of given session
|
||||
* events_run_example(examplename, *args):in-process-run of
|
||||
given example test file
|
||||
|
||||
eventappender(config): for getting all events in a list:
|
||||
"""
|
||||
|
@ -49,11 +47,6 @@ def events_from_session(session):
|
|||
session.main(getcolitems(session.config))
|
||||
return sorter
|
||||
|
||||
def events_run_example(examplename, *args):
|
||||
from setupdata import getexamplefile
|
||||
p = getexamplefile(examplename)
|
||||
return events_from_cmdline([p] + list(args))
|
||||
|
||||
class EventSorter(object):
|
||||
def __init__(self, config, session=None):
|
||||
self.config = config
|
||||
|
@ -217,6 +210,13 @@ class InlineCollection(FileCreation):
|
|||
runner = self.getrunner()
|
||||
return runner(item, **runnerargs)
|
||||
|
||||
class InlineSession(InlineCollection):
|
||||
def parse_and_run(self, *args):
|
||||
config = self.parseconfig(*args)
|
||||
session = config.initsession()
|
||||
sorter = EventSorter(config, session)
|
||||
session.main()
|
||||
return sorter
|
||||
|
||||
def popvalue(stringio):
|
||||
value = stringio.getvalue().rstrip()
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from __future__ import generators
|
||||
import py
|
||||
from py.__.test import event, outcome
|
||||
import setupdata, suptest
|
||||
from py.__.test.testing import suptest
|
||||
from py.__.test.conftesthandle import Conftest
|
||||
from py.__.test.collect import SetupState
|
||||
from test_config import getcolitems
|
||||
|
@ -376,7 +376,6 @@ def test_function_equality():
|
|||
assert f1 == f1_b
|
||||
assert not f1 != f1_b
|
||||
|
||||
|
||||
class Testgenitems:
|
||||
def setup_class(cls):
|
||||
cls.classtemp = py.test.ensuretemp(cls.__name__)
|
||||
|
@ -462,6 +461,15 @@ class Testgenitems:
|
|||
assert items[1].name == 'test_method_one'
|
||||
assert items[2].name == 'test_method_one'
|
||||
|
||||
# let's also test getmodpath here
|
||||
assert items[0].getmodpath() == "test_one"
|
||||
assert items[1].getmodpath() == "TestX.test_method_one"
|
||||
assert items[2].getmodpath() == "TestY.test_method_one"
|
||||
|
||||
s = items[0].getmodpath(stopatmodule=False)
|
||||
assert s == "test_example_items1.test_example.test_one"
|
||||
print s
|
||||
|
||||
def test_collect_doctest_files_with_test_prefix(self):
|
||||
self.tmp.ensure("whatever.txt")
|
||||
checkfile = self.tmp.ensure("test_something.txt")
|
||||
|
|
|
@ -2,7 +2,7 @@ from __future__ import generators
|
|||
import py
|
||||
|
||||
from py.__.test.config import gettopdir
|
||||
import suptest, setupdata
|
||||
from py.__.test.testing import suptest
|
||||
from py.__.test import event
|
||||
|
||||
def getcolitems(config):
|
||||
|
@ -38,6 +38,8 @@ def test_config_cmdline_options():
|
|||
|
||||
def test_config_cmdline_options_only_lowercase():
|
||||
o = py.test.ensuretemp('test_config_cmdline_options_only_lowercase')
|
||||
o = o.mkdir("onemore") # neccessary because collection of o.dirpath()
|
||||
# could see our conftest.py
|
||||
o.ensure("conftest.py").write(py.code.Source("""
|
||||
import py
|
||||
Option = py.test.config.Option
|
||||
|
@ -159,12 +161,16 @@ def test_config_rconfig():
|
|||
assert config.option.gdest == 11
|
||||
assert option.gdest == 11
|
||||
|
||||
class TestSessionAndOptions:
|
||||
def setup_class(cls):
|
||||
cls.tmproot = py.test.ensuretemp(cls.__name__)
|
||||
class TestSessionAndOptions(suptest.FileCreation):
|
||||
def exampletestfile(self):
|
||||
return self.makepyfile(file_test="""
|
||||
def test_one():
|
||||
assert 42 == 43
|
||||
|
||||
def setup_method(self, method):
|
||||
self.tmpdir = self.tmproot.ensure(method.__name__, dir=1)
|
||||
class TestClass(object):
|
||||
def test_method_one(self):
|
||||
assert 42 == 43
|
||||
""")
|
||||
|
||||
def test_session_eventlog(self):
|
||||
eventlog = self.tmpdir.join("test_session_eventlog")
|
||||
|
@ -312,7 +318,7 @@ class TestSessionAndOptions:
|
|||
def test_conflict_options(self):
|
||||
def check_conflict_option(opts):
|
||||
print "testing if options conflict:", " ".join(opts)
|
||||
path = setupdata.getexamplefile("file_test.py")
|
||||
path = self.exampletestfile()
|
||||
config = py.test.config._reparse(opts + [path])
|
||||
py.test.raises((ValueError, SystemExit), """
|
||||
config.initsession()
|
||||
|
@ -329,7 +335,7 @@ class TestSessionAndOptions:
|
|||
|
||||
def test_implied_options(self):
|
||||
def check_implied_option(opts, expr):
|
||||
path = setupdata.getexamplefile("file_test.py")
|
||||
path = self.exampletestfile()
|
||||
config = py.test.config._reparse(opts + [path])
|
||||
session = config.initsession()
|
||||
assert eval(expr, session.config.option.__dict__)
|
||||
|
@ -348,19 +354,19 @@ class TestSessionAndOptions:
|
|||
passed, skipped, failed = sorter.countoutcomes()
|
||||
assert failed == 2
|
||||
assert skipped == passed == 0
|
||||
path = setupdata.getexamplefile("file_test.py")
|
||||
path = self.exampletestfile()
|
||||
for opts in ([], ['-l'], ['-s'], ['--tb=no'], ['--tb=short'],
|
||||
['--tb=long'], ['--fulltrace'], ['--nomagic'],
|
||||
['--traceconfig'], ['-v'], ['-v', '-v']):
|
||||
yield runfiletest, opts + [path]
|
||||
|
||||
def test_is_not_boxed_by_default(self):
|
||||
path = setupdata.getexamplefile("file_test.py")
|
||||
path = self.exampletestfile()
|
||||
config = py.test.config._reparse([path])
|
||||
assert not config.option.boxed
|
||||
|
||||
|
||||
class TestConfigColitems:
|
||||
class TestConfigColitems(suptest.FileCreation):
|
||||
def setup_class(cls):
|
||||
cls.tmproot = py.test.ensuretemp(cls.__name__)
|
||||
|
||||
|
|
|
@ -36,9 +36,12 @@ class TestEventBus:
|
|||
assert l == [1]
|
||||
|
||||
|
||||
class TestItemTestReport(object):
|
||||
class TestItemTestReport(suptest.InlineCollection):
|
||||
def test_toterminal(self):
|
||||
sorter = suptest.events_run_example("file_test.py")
|
||||
sorter = suptest.events_from_runsource("""
|
||||
def test_one():
|
||||
assert 42 == 43
|
||||
""")
|
||||
reports = sorter.get(event.ItemTestReport)
|
||||
ev = reports[0]
|
||||
assert ev.failed
|
||||
|
@ -54,5 +57,5 @@ class TestItemTestReport(object):
|
|||
##assert ev.repr_run.find("AssertionError") != -1
|
||||
filepath = ev.colitem.fspath
|
||||
#filepath , modpath = ev.itemrepr_path
|
||||
assert str(filepath).endswith("file_test.py")
|
||||
assert str(filepath).endswith(".py")
|
||||
#assert modpath.endswith("file_test.test_one")
|
||||
|
|
|
@ -1,30 +0,0 @@
|
|||
|
||||
from py.__.test import event
|
||||
import setupdata, suptest
|
||||
from py.__.code.testing.test_excinfo import TWMock
|
||||
|
||||
|
||||
|
||||
class TestItemTestReport(object):
|
||||
|
||||
def test_toterminal(self):
|
||||
sorter = suptest.events_run_example("file_test.py")
|
||||
reports = sorter.get(event.ItemTestReport)
|
||||
ev = reports[0]
|
||||
assert ev.failed
|
||||
twmock = TWMock()
|
||||
ev.toterminal(twmock)
|
||||
assert twmock.lines
|
||||
twmock = TWMock()
|
||||
ev.outcome.longrepr = "hello"
|
||||
ev.toterminal(twmock)
|
||||
assert twmock.lines[0] == "hello"
|
||||
assert not twmock.lines[1:]
|
||||
|
||||
##assert ev.repr_run.find("AssertionError") != -1
|
||||
filepath = ev.colitem.fspath
|
||||
#filepath , modpath = ev.itemrepr_path
|
||||
assert str(filepath).endswith("file_test.py")
|
||||
#assert modpath.endswith("file_test.test_one")
|
||||
|
||||
|
|
@ -1,15 +1,20 @@
|
|||
import py
|
||||
from py.__.test import event
|
||||
import suptest, setupdata
|
||||
from py.__.test.testing import suptest
|
||||
|
||||
def setup_module(mod):
|
||||
mod.tmpdir = py.test.ensuretemp(mod.__name__)
|
||||
|
||||
class TestKeywordSelection:
|
||||
class TestKeywordSelection(suptest.InlineSession):
|
||||
def test_select_simple(self):
|
||||
file_test = self.makepyfile(file_test="""
|
||||
def test_one(): assert 0
|
||||
class TestClass(object):
|
||||
def test_method_one(self):
|
||||
assert 42 == 43
|
||||
""")
|
||||
def check(keyword, name):
|
||||
sorter = suptest.events_run_example("file_test.py",
|
||||
'-s', '-k', keyword)
|
||||
sorter = self.parse_and_run("-s", "-k", keyword, file_test)
|
||||
passed, skipped, failed = sorter.listoutcomes()
|
||||
assert len(failed) == 1
|
||||
assert failed[0].colitem.name == name
|
||||
|
@ -20,7 +25,7 @@ class TestKeywordSelection:
|
|||
yield check, 'TestClass.test', 'test_method_one'
|
||||
|
||||
def test_select_extra_keywords(self):
|
||||
o = tmpdir.ensure('test_select_extra_keywords', dir=1)
|
||||
o = self.tmpdir
|
||||
tfile = o.join('test_select.py').write(py.code.Source("""
|
||||
def test_1():
|
||||
pass
|
||||
|
@ -46,8 +51,12 @@ class TestKeywordSelection:
|
|||
assert dlist[0].items[0].name == 'test_1'
|
||||
|
||||
def test_select_starton(self):
|
||||
sorter = suptest.events_run_example("test_threepass.py",
|
||||
'-k', "test_two:")
|
||||
threepass = self.makepyfile(test_threepass="""
|
||||
def test_one(): assert 1
|
||||
def test_two(): assert 1
|
||||
def test_three(): assert 1
|
||||
""")
|
||||
sorter = self.parse_and_run("-k", "test_two:", threepass)
|
||||
passed, skipped, failed = sorter.listoutcomes()
|
||||
assert len(passed) == 2
|
||||
assert not failed
|
||||
|
|
Loading…
Reference in New Issue