From ceb4f3f701e330221f13a7ee66a2199b9b5e82e6 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Wed, 29 May 2019 23:12:45 +0200 Subject: [PATCH] fixup! Fix regression with --lf and non-selected failures --- changelog/5333.bugfix.rst | 1 + src/_pytest/cacheprovider.py | 19 ++++++++----------- testing/test_cacheprovider.py | 24 +++++++++++++++++++++++- 3 files changed, 32 insertions(+), 12 deletions(-) create mode 100644 changelog/5333.bugfix.rst diff --git a/changelog/5333.bugfix.rst b/changelog/5333.bugfix.rst new file mode 100644 index 000000000..ac1d79585 --- /dev/null +++ b/changelog/5333.bugfix.rst @@ -0,0 +1 @@ +Fix regression with ``--lf`` not re-running all tests with known failures from non-selected tests. diff --git a/src/_pytest/cacheprovider.py b/src/_pytest/cacheprovider.py index b194f80b0..b13f5e819 100755 --- a/src/_pytest/cacheprovider.py +++ b/src/_pytest/cacheprovider.py @@ -168,6 +168,7 @@ class LFPlugin(object): if result is None: rootpath = Path(self.config.rootdir) result = {rootpath / nodeid.split("::")[0] for nodeid in self.lastfailed} + result = {x for x in result if x.exists()} self._last_failed_paths = result return result @@ -176,17 +177,13 @@ class LFPlugin(object): Ignore this file path if we are in --lf mode and it is not in the list of previously failed files. """ - if ( - self.active - and self._previously_failed_count - and self.config.getoption("lf") - and path.isfile() - and self.lastfailed - ): - skip_it = Path(path) not in self.last_failed_paths() - if skip_it: - self._skipped_files += 1 - return skip_it + if self.active and self.config.getoption("lf") and path.isfile(): + last_failed_paths = self.last_failed_paths() + if last_failed_paths: + skip_it = Path(path) not in self.last_failed_paths() + if skip_it: + self._skipped_files += 1 + return skip_it def pytest_report_collectionfinish(self): if self.active and self.config.getoption("verbose") >= 0: diff --git a/testing/test_cacheprovider.py b/testing/test_cacheprovider.py index da6a3da49..ed205d0f8 100644 --- a/testing/test_cacheprovider.py +++ b/testing/test_cacheprovider.py @@ -832,7 +832,7 @@ class TestLastFailed(object): ] ) - def test_lastfailed_with_unknown_failure(self, testdir): + def test_lastfailed_with_known_failures_not_being_selected(self, testdir): testdir.makepyfile( **{ "pkg1/test_1.py": """def test_1(): assert 0""", @@ -852,6 +852,28 @@ class TestLastFailed(object): ] ) + # Recreate file with known failure. + testdir.makepyfile(**{"pkg1/test_1.py": """def test_1(): assert 0"""}) + result = testdir.runpytest("--lf") + result.stdout.fnmatch_lines( + [ + "collected 1 item", + "run-last-failure: rerun previous 1 failure (skipped 1 file)", + "* 1 failed in *", + ] + ) + + # Remove/rename test. + testdir.makepyfile(**{"pkg1/test_1.py": """def test_renamed(): assert 0"""}) + result = testdir.runpytest("--lf") + result.stdout.fnmatch_lines( + [ + "collected 1 item", + "run-last-failure: 1 known failures not in selected tests", + "* 1 failed in *", + ] + ) + class TestNewFirst(object): def test_newfirst_usecase(self, testdir):