diff --git a/py/test/pycollect.py b/py/test/pycollect.py index 01469a7cd..a9dcc3f0d 100644 --- a/py/test/pycollect.py +++ b/py/test/pycollect.py @@ -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(".[", "[") diff --git a/py/test/report/base.py b/py/test/report/base.py index 59fa8b0fe..e50887435 100644 --- a/py/test/report/base.py +++ b/py/test/report/base.py @@ -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 diff --git a/py/test/report/terminal.py b/py/test/report/terminal.py index a6c73085d..5b77e23a3 100644 --- a/py/test/report/terminal.py +++ b/py/test/report/terminal.py @@ -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): diff --git a/py/test/report/testing/test_basereporter.py b/py/test/report/testing/test_basereporter.py index 4a455dce5..007f8069f 100644 --- a/py/test/report/testing/test_basereporter.py +++ b/py/test/report/testing/test_basereporter.py @@ -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: diff --git a/py/test/testing/setupdata.py b/py/test/testing/setupdata.py deleted file mode 100644 index 2fa199ce1..000000000 --- a/py/test/testing/setupdata.py +++ /dev/null @@ -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!!!!!! - ========= - """, - -} diff --git a/py/test/testing/suptest.py b/py/test/testing/suptest.py index 0202ce131..dcaf18659 100644 --- a/py/test/testing/suptest.py +++ b/py/test/testing/suptest.py @@ -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() diff --git a/py/test/testing/test_collect.py b/py/test/testing/test_collect.py index 54bc93261..de20a04a0 100644 --- a/py/test/testing/test_collect.py +++ b/py/test/testing/test_collect.py @@ -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") diff --git a/py/test/testing/test_config.py b/py/test/testing/test_config.py index ce1769d08..0c404a9ae 100644 --- a/py/test/testing/test_config.py +++ b/py/test/testing/test_config.py @@ -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__) diff --git a/py/test/testing/test_event.py b/py/test/testing/test_event.py index 741e0544c..a58748d1d 100644 --- a/py/test/testing/test_event.py +++ b/py/test/testing/test_event.py @@ -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") diff --git a/py/test/testing/test_repevent.py b/py/test/testing/test_repevent.py deleted file mode 100644 index 088b0b840..000000000 --- a/py/test/testing/test_repevent.py +++ /dev/null @@ -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") - - diff --git a/py/test/testing/test_session.py b/py/test/testing/test_session.py index 437826450..f0db62c49 100644 --- a/py/test/testing/test_session.py +++ b/py/test/testing/test_session.py @@ -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