[py-svn] pytest commit 6a5bbc78bad9: probably the last major internal cleanup action: rename collection to
commits-noreply at bitbucket.org
commits-noreply at bitbucket.org
Sun Nov 7 10:23:55 CET 2010
# HG changeset patch -- Bitbucket.org
# Project pytest
# URL http://bitbucket.org/hpk42/pytest/overview
# User holger krekel <holger at merlinux.eu>
# Date 1289121598 -3600
# Node ID 6a5bbc78bad973e969317db8b86f151e6539c42e
# Parent 2bffb78b3c42f40f963bc62f5095f01b75465b68
probably the last major internal cleanup action: rename collection to
session which now is the root collection node. This means that
session, collection and config objects have a more defined
relationship (previously there was no way to get from a collection
node or even from a runtest hook to the session object which
was strange).
--- a/pytest/__init__.py
+++ b/pytest/__init__.py
@@ -5,7 +5,7 @@ see http://pytest.org for documentation
(c) Holger Krekel and others, 2004-2010
"""
-__version__ = '2.0.0.dev22'
+__version__ = '2.0.0.dev23'
__all__ = ['config', 'cmdline']
--- a/doc/example/builtin.txt
+++ b/doc/example/builtin.txt
@@ -27,10 +27,10 @@ Let's run our little function::
F
================================= FAILURES =================================
______________________________ test_something ______________________________
-
+
def test_something():
> checkconfig(42)
E Failed: not configured: 42
-
+
test_checkconfig.py:8: Failed
1 failed in 0.02 seconds
--- a/doc/funcargs.txt
+++ b/doc/funcargs.txt
@@ -34,7 +34,7 @@ Running the test looks like this::
$ py.test test_simplefactory.py
=========================== test session starts ============================
- platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev19
+ platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev22
test path 1: test_simplefactory.py
test_simplefactory.py F
@@ -136,7 +136,7 @@ Running this::
$ py.test test_example.py
=========================== test session starts ============================
- platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev19
+ platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev22
test path 1: test_example.py
test_example.py .........F
@@ -158,7 +158,6 @@ the test collection phase which is separ
Let's just look at what is collected::
$ py.test --collectonly test_example.py
- <Collection 'doc-exec-403'><Module 'test_example.py'><Function 'test_func[0]'><Function 'test_func[1]'>
@@ -175,7 +174,7 @@ If you want to select only the run with
$ py.test -v -k 7 test_example.py # or -k test_func[7]
=========================== test session starts ============================
- platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev19 -- /home/hpk/venv/0/bin/python
+ platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev22 -- /home/hpk/venv/0/bin/python
test path 1: test_example.py
test_example.py <- test_example.py:6: test_func[7] PASSED
--- a/doc/mark.txt
+++ b/doc/mark.txt
@@ -88,20 +88,20 @@ You can use the ``-k`` command line opti
$ py.test -k webtest # running with the above defined examples yields
=========================== test session starts ============================
- platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev19
- test path 1: /tmp/doc-exec-407
+ platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev22
+ test path 1: /tmp/doc-exec-527
test_mark.py ..
test_mark_classlevel.py ..
- ========================= 4 passed in 0.01 seconds =========================
+ ========================= 4 passed in 0.02 seconds =========================
And you can also run all tests except the ones that match the keyword::
$ py.test -k-webtest
=========================== test session starts ============================
- platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev19
- test path 1: /tmp/doc-exec-407
+ platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev22
+ test path 1: /tmp/doc-exec-527
===================== 4 tests deselected by '-webtest' =====================
======================= 4 deselected in 0.01 seconds =======================
@@ -110,8 +110,8 @@ Or to only select the class::
$ py.test -kTestClass
=========================== test session starts ============================
- platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev19
- test path 1: /tmp/doc-exec-407
+ platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev22
+ test path 1: /tmp/doc-exec-527
test_mark_classlevel.py ..
--- a/doc/unittest.txt
+++ b/doc/unittest.txt
@@ -24,7 +24,7 @@ Running it yields::
$ py.test test_unittest.py
=========================== test session starts ============================
- platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev19
+ platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev22
test path 1: test_unittest.py
test_unittest.py F
@@ -56,7 +56,7 @@ Running it yields::
/usr/lib/python2.6/unittest.py:350: AssertionError
----------------------------- Captured stdout ------------------------------
hello
- ========================= 1 failed in 0.02 seconds =========================
+ ========================= 1 failed in 0.12 seconds =========================
.. _`unittest.py style`: http://docs.python.org/library/unittest.html
--- a/doc/tmpdir.txt
+++ b/doc/tmpdir.txt
@@ -28,7 +28,7 @@ Running this would result in a passed te
$ py.test test_tmpdir.py
=========================== test session starts ============================
- platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev19
+ platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev22
test path 1: test_tmpdir.py
test_tmpdir.py F
@@ -36,7 +36,7 @@ Running this would result in a passed te
================================= FAILURES =================================
_____________________________ test_create_file _____________________________
- tmpdir = local('/tmp/pytest-243/test_create_file0')
+ tmpdir = local('/tmp/pytest-447/test_create_file0')
def test_create_file(tmpdir):
p = tmpdir.mkdir("sub").join("hello.txt")
@@ -47,7 +47,7 @@ Running this would result in a passed te
E assert 0
test_tmpdir.py:7: AssertionError
- ========================= 1 failed in 0.04 seconds =========================
+ ========================= 1 failed in 0.15 seconds =========================
.. _`base temporary directory`:
--- a/testing/plugin/test_runner.py
+++ b/testing/plugin/test_runner.py
@@ -244,7 +244,7 @@ class TestExecutionForked(BaseFunctional
assert rep.failed
assert rep.when == "???"
-class TestCollectionReports:
+class TestSessionReports:
def test_collect_result(self, testdir):
col = testdir.getmodulecol("""
def test_func1():
--- a/testing/plugin/test_terminal.py
+++ b/testing/plugin/test_terminal.py
@@ -516,7 +516,7 @@ def test_traceconfig(testdir, monkeypatc
def test_debug(testdir, monkeypatch):
result = testdir.runpytest("--debug")
result.stderr.fnmatch_lines([
- "*registered*session*",
+ "*pytest_sessionstart*session*",
])
assert result.ret == 0
--- a/doc/example/simple.txt
+++ b/doc/example/simple.txt
@@ -130,7 +130,7 @@ let's run the full monty::
E assert 4 < 4
test_compute.py:3: AssertionError
- 1 failed, 4 passed in 0.02 seconds
+ 1 failed, 4 passed in 0.03 seconds
As expected when running the full range of ``param1`` values
we'll get an error on the last one.
--- a/doc/doctest.txt
+++ b/doc/doctest.txt
@@ -44,7 +44,7 @@ then you can just invoke ``py.test`` wit
$ py.test
=========================== test session starts ============================
- platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev19
- test path 1: /tmp/doc-exec-400
+ platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev22
+ test path 1: /tmp/doc-exec-519
============================= in 0.00 seconds =============================
--- a/doc/example/mysetup.txt
+++ b/doc/example/mysetup.txt
@@ -49,7 +49,7 @@ You can now run the test::
$ py.test test_sample.py
=========================== test session starts ============================
- platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev19
+ platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev22
test path 1: test_sample.py
test_sample.py F
@@ -57,7 +57,7 @@ You can now run the test::
================================= FAILURES =================================
_______________________________ test_answer ________________________________
- mysetup = <conftest.MySetup instance at 0x1cf6b90>
+ mysetup = <conftest.MySetup instance at 0x1ca5cf8>
def test_answer(mysetup):
app = mysetup.myapp()
@@ -122,14 +122,14 @@ Running it yields::
$ py.test test_ssh.py -rs
=========================== test session starts ============================
- platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev19
+ platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev22
test path 1: test_ssh.py
test_ssh.py s
========================= short test summary info ==========================
- SKIP [1] /tmp/doc-exec-438/conftest.py:22: specify ssh host with --ssh
+ SKIP [1] /tmp/doc-exec-560/conftest.py:22: specify ssh host with --ssh
- ======================== 1 skipped in 0.02 seconds =========================
+ ======================== 1 skipped in 0.03 seconds =========================
If you specify a command line option like ``py.test --ssh=python.org`` the test will execute as expected.
--- a/doc/plugins.txt
+++ b/doc/plugins.txt
@@ -16,7 +16,7 @@ conftest.py: local per-directory plugins
--------------------------------------------------------------
local ``conftest.py`` plugins contain directory-specific hook
-implementations. Collection and test running activities will
+implementations. Session and test running activities will
invoke all hooks defined in "higher up" ``conftest.py`` files.
Example: Assume the following layout and content of files::
@@ -268,7 +268,7 @@ you can use the following hook:
reporting hooks
------------------------------
-Collection related reporting hooks:
+Session related reporting hooks:
.. autofunction: pytest_collectstart
.. autofunction: pytest_itemcollected
--- a/setup.py
+++ b/setup.py
@@ -22,7 +22,7 @@ def main():
name='pytest',
description='py.test: simple powerful testing with Python',
long_description = long_description,
- version='2.0.0.dev22',
+ version='2.0.0.dev23',
url='http://pytest.org',
license='MIT license',
platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'],
--- a/doc/monkeypatch.txt
+++ b/doc/monkeypatch.txt
@@ -39,8 +39,8 @@ will be undone.
.. background check:
$ py.test
=========================== test session starts ============================
- platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev19
- test path 1: /tmp/doc-exec-408
+ platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev22
+ test path 1: /tmp/doc-exec-528
============================= in 0.00 seconds =============================
--- a/doc/faq.txt
+++ b/doc/faq.txt
@@ -12,11 +12,11 @@ On naming, nosetests, licensing and magi
Why a ``py.test`` instead of a ``pytest`` command?
++++++++++++++++++++++++++++++++++++++++++++++++++
-Some historic, some practical reasons: ``py.test`` used to be part of
+Some historic, some practical reasons: ``py.test`` used to be part of
the ``py`` package which provided several developer utitilities,
all starting with ``py.<TAB>``, providing nice TAB-completion. If
you install ``pip install pycmd`` you get these tools from a separate
-package. These days the command line tool could be ``pytest``
+package. These days the command line tool could be ``pytest``
but then many people have gotten used to the old name and there
also is another tool with this same which would lead to some clashes.
@@ -37,11 +37,11 @@ What's this "magic" with py.test?
Around 2007 (version ``0.8``) some several people claimed that py.test
was using too much "magic". It has been refactored a lot. It is today
-probably one of the smallest, most universally runnable and most
-customizable testing frameworks for Python. It remains true
-that ``py.test`` uses metaprogramming techniques, i.e. it views
-test code similar to how compilers view programs, using a
-somewhat abstract internal model.
+probably one of the smallest, most universally runnable and most
+customizable testing frameworks for Python. It remains true
+that ``py.test`` uses metaprogramming techniques, i.e. it views
+test code similar to how compilers view programs, using a
+somewhat abstract internal model.
It's also true that the no-boilerplate testing is implemented by making
use of the Python assert statement through "re-interpretation":
@@ -64,7 +64,7 @@ function arguments, parametrized tests a
Is using funcarg- versus xUnit setup a style question?
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-For simple applications and for people experienced with nose_ or
+For simple applications and for people experienced with nose_ or
unittest-style test setup using `xUnit style setup`_
feels natural. For larger test suites, parametrized testing
or setup of complex test resources using funcargs_ is recommended.
--- a/doc/getting-started.txt
+++ b/doc/getting-started.txt
@@ -14,7 +14,7 @@ Installation options::
To check your installation has installed the correct version::
$ py.test --version
- This is py.test version 2.0.0.dev19, imported from /home/hpk/p/pytest/pytest
+ This is py.test version 2.0.0.dev22, imported from /home/hpk/p/pytest/pytest
If you get an error checkout :ref:`installation issues`.
@@ -34,8 +34,8 @@ That's it. You can execute the test func
$ py.test
=========================== test session starts ============================
- platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev19
- test path 1: /tmp/doc-exec-404
+ platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev22
+ test path 1: /tmp/doc-exec-523
test_sample.py F
@@ -121,7 +121,7 @@ run the module by passing its filename::
================================= FAILURES =================================
____________________________ TestClass.test_two ____________________________
- self = <test_class.TestClass instance at 0x2c2c560>
+ self = <test_class.TestClass instance at 0x254f6c8>
def test_two(self):
x = "hello"
@@ -129,7 +129,7 @@ run the module by passing its filename::
E assert hasattr('hello', 'check')
test_class.py:8: AssertionError
- 1 failed, 1 passed in 0.02 seconds
+ 1 failed, 1 passed in 0.03 seconds
The first test passed, the second failed. Again we can easily see
the intermediate values used in the assertion, helping us to
@@ -157,7 +157,7 @@ before performing the test function call
================================= FAILURES =================================
_____________________________ test_needsfiles ______________________________
- tmpdir = local('/tmp/pytest-240/test_needsfiles0')
+ tmpdir = local('/tmp/pytest-446/test_needsfiles0')
def test_needsfiles(tmpdir):
print tmpdir
@@ -166,8 +166,8 @@ before performing the test function call
test_tmpdir.py:3: AssertionError
----------------------------- Captured stdout ------------------------------
- /tmp/pytest-240/test_needsfiles0
- 1 failed in 0.04 seconds
+ /tmp/pytest-446/test_needsfiles0
+ 1 failed in 0.07 seconds
Before the test runs, a unique-per-test-invocation temporary directory
was created. More info at :ref:`tmpdir handling`.
--- a/pytest/plugin/session.py
+++ b/pytest/plugin/session.py
@@ -1,4 +1,4 @@
-""" core implementation of testing process: init, collection, runtest loop. """
+""" core implementation of testing process: init, session, runtest loop. """
import py
import pytest
@@ -54,7 +54,7 @@ def pytest_configure(config):
config.option.maxfail = 1
def pytest_cmdline_main(config):
- """ default command line protocol for initialization, collection,
+ """ default command line protocol for initialization, session,
running tests and reporting. """
session = Session(config)
session.exitstatus = EXIT_OK
@@ -83,20 +83,17 @@ def pytest_cmdline_main(config):
return session.exitstatus
def pytest_collection(session):
- collection = session.collection
- assert not hasattr(collection, 'items')
-
- collection.perform_collect()
+ session.perform_collect()
hook = session.config.hook
- items = collection.items
- hook.pytest_collection_modifyitems(config=session.config, items=items)
- hook.pytest_collection_finish(collection=collection)
+ hook.pytest_collection_modifyitems(session=session,
+ config=session.config, items=session.items)
+ hook.pytest_collection_finish(session=session)
return True
def pytest_runtestloop(session):
if session.config.option.collectonly:
return True
- for item in session.collection.items:
+ for item in session.session.items:
item.config.hook.pytest_runtest_protocol(item=item)
if session.shouldstop:
raise session.Interrupted(session.shouldstop)
@@ -121,7 +118,7 @@ class Session(object):
self.config.pluginmanager.register(self, name="session", prepend=True)
self._testsfailed = 0
self.shouldstop = False
- self.collection = Collection(config) # XXX move elswehre
+ self.session = Session(config) # XXX move elswehre
def pytest_collectstart(self):
if self.shouldstop:
@@ -154,7 +151,7 @@ def compatproperty(name):
def fget(self):
#print "retrieving %r property from %s" %(name, self.fspath)
py.log._apiwarn("2.0", "use py.test.collect.%s for "
- "Collection classes" % name)
+ "Session classes" % name)
return getattr(pytest.collect, name)
return property(fget)
@@ -162,7 +159,7 @@ class Node(object):
""" base class for all Nodes in the collection tree.
Collector subclasses have children, Items are terminal nodes."""
- def __init__(self, name, parent=None, config=None, collection=None):
+ def __init__(self, name, parent=None, config=None, session=None):
#: a unique name with the scope of the parent
self.name = name
@@ -173,11 +170,11 @@ class Node(object):
self.config = config or parent.config
#: the collection this node is part of
- self.collection = collection or parent.collection
+ self.session = session or parent.session
#: filesystem path where this node was collected from
self.fspath = getattr(parent, 'fspath', None)
- self.ihook = self.collection.gethookproxy(self.fspath)
+ self.ihook = self.session.gethookproxy(self.fspath)
self.keywords = {self.name: True}
Module = compatproperty("Module")
@@ -312,16 +309,16 @@ class Collector(Node):
excinfo.traceback = ntraceback.filter()
class FSCollector(Collector):
- def __init__(self, fspath, parent=None, config=None, collection=None):
+ def __init__(self, fspath, parent=None, config=None, session=None):
fspath = py.path.local(fspath) # xxx only for test_resultlog.py?
name = parent and fspath.relto(parent.fspath) or fspath.basename
- super(FSCollector, self).__init__(name, parent, config, collection)
+ super(FSCollector, self).__init__(name, parent, config, session)
self.fspath = fspath
def _makeid(self):
- if self == self.collection:
+ if self == self.session:
return "."
- relpath = self.collection.fspath.bestrelpath(self.fspath)
+ relpath = self.session.fspath.bestrelpath(self.fspath)
if os.sep != "/":
relpath = relpath.replace(os.sep, "/")
return relpath
@@ -346,13 +343,33 @@ class Item(Node):
self._location = location
return location
-class Collection(FSCollector):
+class Session(FSCollector):
+ class Interrupted(KeyboardInterrupt):
+ """ signals an interrupted test run. """
+ __module__ = 'builtins' # for py3
+
def __init__(self, config):
- super(Collection, self).__init__(py.path.local(), parent=None,
- config=config, collection=self)
+ super(Session, self).__init__(py.path.local(), parent=None,
+ config=config, session=self)
+ self.config.pluginmanager.register(self, name="session", prepend=True)
+ self._testsfailed = 0
+ self.shouldstop = False
self.trace = config.trace.root.get("collection")
self._norecursepatterns = config.getini("norecursedirs")
+ def pytest_collectstart(self):
+ if self.shouldstop:
+ raise self.Interrupted(self.shouldstop)
+
+ def pytest_runtest_logreport(self, report):
+ if report.failed and 'xfail' not in getattr(report, 'keywords', []):
+ self._testsfailed += 1
+ maxfail = self.config.getvalue("maxfail")
+ if maxfail and self._testsfailed >= maxfail:
+ self.shouldstop = "stopping after %d failures" % (
+ self._testsfailed)
+ pytest_collectreport = pytest_runtest_logreport
+
def isinitpath(self, path):
return path in self._initialpaths
@@ -509,3 +526,4 @@ class Collection(FSCollector):
yield x
node.ihook.pytest_collectreport(report=rep)
+Session = Session
--- a/doc/usage.txt
+++ b/doc/usage.txt
@@ -175,5 +175,4 @@ Running it will exit quickly::
$ python myinvoke.py
ERROR: hi from our plugin
-
.. include:: links.inc
--- a/pytest/plugin/pytester.py
+++ b/pytest/plugin/pytester.py
@@ -6,7 +6,7 @@ import re
import inspect
import time
from fnmatch import fnmatch
-from pytest.plugin.session import Collection
+from pytest.plugin.session import Session
from py.builtin import print_
from pytest.main import HookRelay
@@ -273,34 +273,34 @@ class TmpTestdir:
p.ensure("__init__.py")
return p
- Collection = Collection
+ Session = Session
def getnode(self, config, arg):
- collection = Collection(config)
+ session = Session(config)
assert '::' not in str(arg)
p = py.path.local(arg)
- x = collection.fspath.bestrelpath(p)
- return collection.perform_collect([x], genitems=False)[0]
+ x = session.fspath.bestrelpath(p)
+ return session.perform_collect([x], genitems=False)[0]
def getpathnode(self, path):
config = self.parseconfig(path)
- collection = Collection(config)
- x = collection.fspath.bestrelpath(path)
- return collection.perform_collect([x], genitems=False)[0]
+ session = Session(config)
+ x = session.fspath.bestrelpath(path)
+ return session.perform_collect([x], genitems=False)[0]
def genitems(self, colitems):
- collection = colitems[0].collection
+ session = colitems[0].session
result = []
for colitem in colitems:
- result.extend(collection.genitems(colitem))
+ result.extend(session.genitems(colitem))
return result
def inline_genitems(self, *args):
#config = self.parseconfig(*args)
config = self.parseconfigure(*args)
rec = self.getreportrecorder(config)
- collection = Collection(config)
- collection.perform_collect()
- return collection.items, rec
+ session = Session(config)
+ session.perform_collect()
+ return session.items, rec
def runitem(self, source):
# used from runner functional tests
--- a/pytest/plugin/terminal.py
+++ b/pytest/plugin/terminal.py
@@ -376,8 +376,9 @@ class CollectonlyReporter:
self._tw.line("INTERNALERROR> " + line)
def pytest_collectstart(self, collector):
- self.outindent(collector)
- self.indent += self.INDENT
+ if collector.session != collector:
+ self.outindent(collector)
+ self.indent += self.INDENT
def pytest_itemcollected(self, item):
self.outindent(item)
--- a/testing/plugin/test_resultlog.py
+++ b/testing/plugin/test_resultlog.py
@@ -5,10 +5,10 @@ from pytest.plugin.resultlog import gene
from pytest.plugin.session import Node, Item, FSCollector
def test_generic_path(testdir):
- from pytest.plugin.session import Collection
+ from pytest.plugin.session import Session
config = testdir.parseconfig()
- collection = Collection(config)
- p1 = Node('a', config=config, collection=collection)
+ session = Session(config)
+ p1 = Node('a', config=config, session=session)
#assert p1.fspath is None
p2 = Node('B', parent=p1)
p3 = Node('()', parent = p2)
@@ -17,7 +17,7 @@ def test_generic_path(testdir):
res = generic_path(item)
assert res == 'a.B().c'
- p0 = FSCollector('proj/test', config=config, collection=collection)
+ p0 = FSCollector('proj/test', config=config, session=session)
p1 = FSCollector('proj/test/a', parent=p0)
p2 = Node('B', parent=p1)
p3 = Node('()', parent = p2)
--- a/testing/plugin/test_python.py
+++ b/testing/plugin/test_python.py
@@ -205,15 +205,15 @@ class TestFunction:
def test_function_equality(self, testdir, tmpdir):
config = testdir.reparseconfig()
- collection = testdir.Collection(config)
+ session = testdir.Session(config)
f1 = py.test.collect.Function(name="name", config=config,
- args=(1,), callobj=isinstance, collection=collection)
+ args=(1,), callobj=isinstance, session=session)
f2 = py.test.collect.Function(name="name",config=config,
- args=(1,), callobj=py.builtin.callable, collection=collection)
+ args=(1,), callobj=py.builtin.callable, session=session)
assert not f1 == f2
assert f1 != f2
f3 = py.test.collect.Function(name="name", config=config,
- args=(1,2), callobj=py.builtin.callable, collection=collection)
+ args=(1,2), callobj=py.builtin.callable, session=session)
assert not f3 == f2
assert f3 != f2
@@ -221,7 +221,7 @@ class TestFunction:
assert f3 != f1
f1_b = py.test.collect.Function(name="name", config=config,
- args=(1,), callobj=isinstance, collection=collection)
+ args=(1,), callobj=isinstance, session=session)
assert f1 == f1_b
assert not f1 != f1_b
@@ -235,11 +235,11 @@ class TestFunction:
param = 1
funcargs = {}
id = "world"
- collection = testdir.Collection(config)
+ session = testdir.Session(config)
f5 = py.test.collect.Function(name="name", config=config,
- callspec=callspec1, callobj=isinstance, collection=collection)
+ callspec=callspec1, callobj=isinstance, session=session)
f5b = py.test.collect.Function(name="name", config=config,
- callspec=callspec2, callobj=isinstance, collection=collection)
+ callspec=callspec2, callobj=isinstance, session=session)
assert f5 != f5b
assert not (f5 == f5b)
@@ -396,7 +396,7 @@ def test_generate_tests_only_done_in_sub
def test_modulecol_roundtrip(testdir):
modcol = testdir.getmodulecol("pass", withinit=True)
trail = modcol.nodeid
- newcol = modcol.collection.perform_collect([trail], genitems=0)[0]
+ newcol = modcol.session.perform_collect([trail], genitems=0)[0]
assert modcol.name == newcol.name
--- a/pytest/plugin/python.py
+++ b/pytest/plugin/python.py
@@ -47,7 +47,7 @@ def pytest_collect_file(path, parent):
ext = path.ext
pb = path.purebasename
if ext == ".py" and (pb.startswith("test_") or pb.endswith("_test") or
- parent.collection.isinitpath(path)):
+ parent.session.isinitpath(path)):
return parent.ihook.pytest_pycollect_makemodule(
path=path, parent=parent)
@@ -393,9 +393,9 @@ class Function(FunctionMixin, pytest.col
"""
_genid = None
def __init__(self, name, parent=None, args=None, config=None,
- callspec=None, callobj=_dummy, keywords=None, collection=None):
+ callspec=None, callobj=_dummy, keywords=None, session=None):
super(Function, self).__init__(name, parent,
- config=config, collection=collection)
+ config=config, session=session)
self._args = args
if self._isyieldedfunction():
assert not callspec, (
@@ -711,13 +711,13 @@ class FuncargRequest:
raise self.LookupError(msg)
def showfuncargs(config):
- from pytest.plugin.session import Collection
- collection = Collection(config)
- collection.perform_collect()
- if collection.items:
- plugins = getplugins(collection.items[0])
+ from pytest.plugin.session import Session
+ session = Session(config)
+ session.perform_collect()
+ if session.items:
+ plugins = getplugins(session.items[0])
else:
- plugins = getplugins(collection)
+ plugins = getplugins(session)
curdir = py.path.local()
tw = py.io.TerminalWriter()
verbose = config.getvalue("verbose")
--- a/doc/example/pythoncollection.txt
+++ b/doc/example/pythoncollection.txt
@@ -31,7 +31,6 @@ finding out what is collected
You can always peek at the collection tree without running tests like this::
. $ py.test --collectonly collectonly.py
- <Collection 'example'><Module 'collectonly.py'><Function 'test_function'><Class 'TestClass'>
--- a/doc/example/controlskip.txt
+++ b/doc/example/controlskip.txt
@@ -36,12 +36,12 @@ and when running it will see a skipped "
$ py.test test_module.py -rs # "-rs" means report on the little 's'
=========================== test session starts ============================
- platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev19
+ platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev22
test path 1: test_module.py
test_module.py .s
========================= short test summary info ==========================
- SKIP [1] /tmp/doc-exec-435/conftest.py:9: need --runslow option to run
+ SKIP [1] /tmp/doc-exec-557/conftest.py:9: need --runslow option to run
=================== 1 passed, 1 skipped in 0.02 seconds ====================
@@ -49,7 +49,7 @@ Or run it including the ``slow`` marked
$ py.test test_module.py --runslow
=========================== test session starts ============================
- platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev19
+ platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev22
test path 1: test_module.py
test_module.py ..
--- a/pytest/hookspec.py
+++ b/pytest/hookspec.py
@@ -38,7 +38,8 @@ def pytest_unconfigure(config):
""" called before test process is exited. """
def pytest_runtestloop(session):
- """ called for performing the main runtest loop (after collection. """
+ """ called for performing the main runtest loop
+ (after collection finished). """
pytest_runtestloop.firstresult = True
# -------------------------------------------------------------------------
@@ -49,11 +50,11 @@ def pytest_collection(session):
""" perform the collection protocol for the given session. """
pytest_collection.firstresult = True
-def pytest_collection_modifyitems(config, items):
+def pytest_collection_modifyitems(session, config, items):
""" called after collection has been performed, may filter or re-order
the items in-place."""
-def pytest_collection_finish(collection):
+def pytest_collection_finish(session):
""" called after collection has been performed and modified. """
def pytest_ignore_collect(path, config):
@@ -64,8 +65,7 @@ def pytest_ignore_collect(path, config):
pytest_ignore_collect.firstresult = True
def pytest_collect_directory(path, parent):
- """ return collection Node or None for the given path. Any new node
- needs to have the specified ``parent`` as a parent."""
+ """ called before traversing a directory for collection files. """
pytest_collect_directory.firstresult = True
def pytest_collect_file(path, parent):
--- a/doc/assert.txt
+++ b/doc/assert.txt
@@ -21,7 +21,7 @@ assertion fails you will see the value o
$ py.test test_assert1.py
=========================== test session starts ============================
- platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev19
+ platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev22
test path 1: test_assert1.py
test_assert1.py F
@@ -35,7 +35,7 @@ assertion fails you will see the value o
E + where 3 = f()
test_assert1.py:5: AssertionError
- ========================= 1 failed in 0.02 seconds =========================
+ ========================= 1 failed in 0.05 seconds =========================
Reporting details about the failing assertion is achieved by re-evaluating
the assert expression and recording intermediate values.
@@ -101,7 +101,7 @@ if you run this module::
$ py.test test_assert2.py
=========================== test session starts ============================
- platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev19
+ platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev22
test path 1: test_assert2.py
test_assert2.py F
--- a/doc/example/nonpython.txt
+++ b/doc/example/nonpython.txt
@@ -27,17 +27,19 @@ now execute the test specification::
nonpython $ py.test test_simple.yml
=========================== test session starts ============================
- platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev19
+ platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev22
test path 1: test_simple.yml
-
+
test_simple.yml .F
-
+
================================= FAILURES =================================
______________________________ usecase: hello ______________________________
usecase execution failed
spec failed: 'some': 'other'
no further details known at this point.
- ==================== 1 failed, 1 passed in 0.42 seconds ====================
+ ========================= short test summary info ==========================
+ FAIL test_simple.yml::hello
+ ==================== 1 failed, 1 passed in 0.43 seconds ====================
You get one dot for the passing ``sub1: sub1`` check and one failure.
Obviously in the above ``conftest.py`` you'll want to implement a more
@@ -56,24 +58,25 @@ reporting in ``verbose`` mode::
nonpython $ py.test -v
=========================== test session starts ============================
- platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev19 -- /home/hpk/venv/0/bin/python
+ platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev22 -- /home/hpk/venv/0/bin/python
test path 1: /home/hpk/p/pytest/doc/example/nonpython
-
+
test_simple.yml <- test_simple.yml:1: usecase: ok PASSED
test_simple.yml <- test_simple.yml:1: usecase: hello FAILED
-
+
================================= FAILURES =================================
______________________________ usecase: hello ______________________________
usecase execution failed
spec failed: 'some': 'other'
no further details known at this point.
+ ========================= short test summary info ==========================
+ FAIL test_simple.yml::hello
==================== 1 failed, 1 passed in 0.07 seconds ====================
While developing your custom test collection and execution it's also
interesting to just look at the collection tree::
nonpython $ py.test --collectonly
- <Collection 'nonpython'><YamlFile 'test_simple.yml'><YamlItem 'ok'><YamlItem 'hello'>
--- a/testing/test_collection.py
+++ b/testing/test_collection.py
@@ -1,6 +1,6 @@
import py
-from pytest.plugin.session import Collection
+from pytest.plugin.session import Session
class TestCollector:
def test_collect_versus_item(self):
@@ -86,7 +86,7 @@ class TestCollector:
node = testdir.getpathnode(hello)
assert isinstance(node, py.test.collect.File)
assert node.name == "hello.xxx"
- nodes = node.collection.perform_collect([node.nodeid], genitems=False)
+ nodes = node.session.perform_collect([node.nodeid], genitems=False)
assert len(nodes) == 1
assert isinstance(nodes[0], py.test.collect.File)
@@ -292,7 +292,7 @@ class TestCustomConftests:
"*test_x*"
])
-class TestCollection:
+class TestSession:
def test_parsearg(self, testdir):
p = testdir.makepyfile("def test_func(): pass")
subdir = testdir.mkdir("sub")
@@ -302,7 +302,7 @@ class TestCollection:
testdir.chdir()
subdir.chdir()
config = testdir.parseconfig(p.basename)
- rcol = Collection(config=config)
+ rcol = Session(config=config)
assert rcol.fspath == subdir
parts = rcol._parsearg(p.basename)
@@ -318,7 +318,7 @@ class TestCollection:
id = "::".join([p.basename, "test_func"])
config = testdir.parseconfig(id)
topdir = testdir.tmpdir
- rcol = Collection(config)
+ rcol = Session(config)
assert topdir == rcol.fspath
rootid = rcol.nodeid
#root2 = rcol.perform_collect([rcol.nodeid], genitems=False)[0]
@@ -333,7 +333,7 @@ class TestCollection:
id = "::".join([p.basename, "test_func"])
config = testdir.parseconfig(id)
topdir = testdir.tmpdir
- rcol = Collection(config)
+ rcol = Session(config)
assert topdir == rcol.fspath
hookrec = testdir.getreportrecorder(config)
rcol.perform_collect()
@@ -367,7 +367,7 @@ class TestCollection:
normid,
]:
config = testdir.parseconfig(id)
- rcol = Collection(config=config)
+ rcol = Session(config=config)
rcol.perform_collect()
items = rcol.items
assert len(items) == 1
@@ -392,7 +392,7 @@ class TestCollection:
id = p.basename
config = testdir.parseconfig(id)
- rcol = Collection(config)
+ rcol = Session(config)
hookrec = testdir.getreportrecorder(config)
rcol.perform_collect()
items = rcol.items
@@ -400,7 +400,7 @@ class TestCollection:
assert len(items) == 2
hookrec.hookrecorder.contains([
("pytest_collectstart",
- "collector.fspath == collector.collection.fspath"),
+ "collector.fspath == collector.session.fspath"),
("pytest_collectstart",
"collector.__class__.__name__ == 'SpecialFile'"),
("pytest_collectstart",
@@ -417,7 +417,7 @@ class TestCollection:
test_aaa = aaa.join("test_aaa.py")
p.move(test_aaa)
config = testdir.parseconfig()
- rcol = Collection(config)
+ rcol = Session(config)
hookrec = testdir.getreportrecorder(config)
rcol.perform_collect()
items = rcol.items
@@ -441,7 +441,7 @@ class TestCollection:
id = "."
config = testdir.parseconfig(id)
- rcol = Collection(config)
+ rcol = Session(config)
hookrec = testdir.getreportrecorder(config)
rcol.perform_collect()
items = rcol.items
@@ -459,12 +459,13 @@ class TestCollection:
def test_serialization_byid(self, testdir):
p = testdir.makepyfile("def test_func(): pass")
config = testdir.parseconfig()
- rcol = Collection(config)
+ rcol = Session(config)
rcol.perform_collect()
items = rcol.items
assert len(items) == 1
item, = items
- newcol = Collection(config)
+ rcol.config.pluginmanager.unregister(name="session")
+ newcol = Session(config)
item2, = newcol.perform_collect([item.nodeid], genitems=False)
assert item2.name == item.name
assert item2.fspath == item.fspath
More information about the pytest-commit
mailing list