diff --git a/pytest/hookspec.py b/pytest/hookspec.py index 4ef5bcb96..236023d56 100644 --- a/pytest/hookspec.py +++ b/pytest/hookspec.py @@ -37,17 +37,17 @@ def pytest_configure(config): def pytest_unconfigure(config): """ called before test process is exited. """ -def pytest_runtest_mainloop(session): +def pytest_runtestloop(session): """ called for performing the main runtest loop (after collection. """ -pytest_runtest_mainloop.firstresult = True +pytest_runtestloop.firstresult = True # ------------------------------------------------------------------------- # collection hooks # ------------------------------------------------------------------------- -def pytest_collection_perform(session): +def pytest_collection(session): """ perform the collection protocol for the given session. """ -pytest_collection_perform.firstresult = True +pytest_collection.firstresult = True def pytest_collection_modifyitems(config, items): """ called after collection has been performed, may filter or re-order diff --git a/pytest/plugin/session.py b/pytest/plugin/session.py index cbab454ec..8ed9f6205 100644 --- a/pytest/plugin/session.py +++ b/pytest/plugin/session.py @@ -8,6 +8,13 @@ import py import pytest import os, sys +# exitcodes for the command line +EXIT_OK = 0 +EXIT_TESTSFAILED = 1 +EXIT_INTERRUPTED = 2 +EXIT_INTERNALERROR = 3 +EXIT_NOHOSTS = 4 + def pytest_addoption(parser): group = parser.getgroup("general", "running and selection options") @@ -44,9 +51,35 @@ def pytest_configure(config): config.option.maxfail = 1 def pytest_cmdline_main(config): - return Session(config).main() + """ default command line protocol for initialization, collection, + running tests and reporting. """ + session = Session(config) + session.exitstatus = EXIT_OK + try: + config.pluginmanager.do_configure(config) + config.hook.pytest_sessionstart(session=session) + config.hook.pytest_collection(session=session) + config.hook.pytest_runtestloop(session=session) + except pytest.UsageError: + raise + except KeyboardInterrupt: + excinfo = py.code.ExceptionInfo() + config.hook.pytest_keyboard_interrupt(excinfo=excinfo) + session.exitstatus = EXIT_INTERRUPTED + except: + excinfo = py.code.ExceptionInfo() + config.pluginmanager.notify_exception(excinfo) + session.exitstatus = EXIT_INTERNALERROR + if excinfo.errisinstance(SystemExit): + sys.stderr.write("mainloop: caught Spurious SystemExit!\n") + if not session.exitstatus and session._testsfailed: + session.exitstatus = EXIT_TESTSFAILED + config.hook.pytest_sessionfinish(session=session, + exitstatus=session.exitstatus) + config.pluginmanager.do_unconfigure(config) + return session.exitstatus -def pytest_collection_perform(session): +def pytest_collection(session): collection = session.collection assert not hasattr(collection, 'items') hook = session.config.hook @@ -55,7 +88,7 @@ def pytest_collection_perform(session): hook.pytest_collection_finish(collection=collection) return True -def pytest_runtest_mainloop(session): +def pytest_runtestloop(session): if session.config.option.collectonly: return True for item in session.collection.items: @@ -86,16 +119,7 @@ def pytest_collect_directory(path, parent): def pytest_report_iteminfo(item): return item.reportinfo() - -# exitcodes for the command line -EXIT_OK = 0 -EXIT_TESTSFAILED = 1 -EXIT_INTERRUPTED = 2 -EXIT_INTERNALERROR = 3 -EXIT_NOHOSTS = 4 - class Session(object): - nodeid = "" class Interrupted(KeyboardInterrupt): """ signals an interrupted test run. """ __module__ = 'builtins' # for py3 @@ -120,37 +144,6 @@ class Session(object): self._testsfailed) pytest_collectreport = pytest_runtest_logreport - def main(self): - """ main loop for running tests. """ - self.shouldstop = False - self.exitstatus = EXIT_OK - config = self.config - try: - config.pluginmanager.do_configure(config) - config.hook.pytest_sessionstart(session=self) - config.hook.pytest_collection_perform(session=self) - config.hook.pytest_runtest_mainloop(session=self) - except pytest.UsageError: - raise - except KeyboardInterrupt: - excinfo = py.code.ExceptionInfo() - self.config.hook.pytest_keyboard_interrupt(excinfo=excinfo) - self.exitstatus = EXIT_INTERRUPTED - except: - excinfo = py.code.ExceptionInfo() - self.config.pluginmanager.notify_exception(excinfo) - self.exitstatus = EXIT_INTERNALERROR - if excinfo.errisinstance(SystemExit): - sys.stderr.write("mainloop: caught Spurious SystemExit!\n") - - if not self.exitstatus and self._testsfailed: - self.exitstatus = EXIT_TESTSFAILED - self.config.hook.pytest_sessionfinish( - session=self, exitstatus=self.exitstatus, - ) - config.pluginmanager.do_unconfigure(config) - return self.exitstatus - class Collection: def __init__(self, config): self.config = config