diff --git a/_pytest/cacheprovider.py b/_pytest/cacheprovider.py index cff951fec..5c6bf2214 100755 --- a/_pytest/cacheprovider.py +++ b/_pytest/cacheprovider.py @@ -165,6 +165,7 @@ def pytest_cmdline_main(config): return wrap_session(config, showcache) + @pytest.hookimpl(tryfirst=True) def pytest_configure(config): config.cache = Cache(config) diff --git a/_pytest/main.py b/_pytest/main.py index 6b2ccb6b7..e9ac57d8f 100644 --- a/_pytest/main.py +++ b/_pytest/main.py @@ -87,7 +87,7 @@ def wrap_session(config, doit): initstate = 1 config.hook.pytest_sessionstart(session=session) initstate = 2 - doit(config, session) + session.exitstatus = doit(config, session) or 0 except pytest.UsageError: raise except KeyboardInterrupt: @@ -100,11 +100,7 @@ def wrap_session(config, doit): session.exitstatus = EXIT_INTERNALERROR if excinfo.errisinstance(SystemExit): sys.stderr.write("mainloop: caught Spurious SystemExit!\n") - else: - if session.testsfailed: - session.exitstatus = EXIT_TESTSFAILED - elif session.testscollected == 0: - session.exitstatus = EXIT_NOTESTSCOLLECTED + finally: excinfo = None # Explicitly break reference cycle. session.startdir.chdir() @@ -124,6 +120,11 @@ def _main(config, session): config.hook.pytest_collection(session=session) config.hook.pytest_runtestloop(session=session) + if session.testsfailed: + return EXIT_TESTSFAILED + elif session.testscollected == 0: + return EXIT_NOTESTSCOLLECTED + def pytest_collection(session): return session.perform_collect() diff --git a/testing/test_cache.py b/testing/test_cache.py index 9eedb7dc7..5a09bedad 100755 --- a/testing/test_cache.py +++ b/testing/test_cache.py @@ -78,7 +78,7 @@ def test_cache_show(testdir): dp.ensure("world") """) result = testdir.runpytest() - assert result.ret == 0 + assert result.ret == 5 # no tests executed result = testdir.runpytest("--show-cache") result.stdout.fnmatch_lines_random([ "*cachedir:*",