@@ -157,18 +157,11 @@ def __init__(self, config):
157157 self .active = any (config .getoption (key ) for key in active_keys )
158158 self .lastfailed = config .cache .get ("cache/lastfailed" , {})
159159 self ._previously_failed_count = None
160- self ._no_failures_behavior = self . config . getoption ( "last_failed_no_failures" )
160+ self ._report_status = None
161161
162162 def pytest_report_collectionfinish (self ):
163163 if self .active and self .config .getoption ("verbose" ) >= 0 :
164- if not self ._previously_failed_count :
165- return None
166- noun = "failure" if self ._previously_failed_count == 1 else "failures"
167- suffix = " first" if self .config .getoption ("failedfirst" ) else ""
168- mode = "rerun previous {count} {noun}{suffix}" .format (
169- count = self ._previously_failed_count , suffix = suffix , noun = noun
170- )
171- return "run-last-failure: %s" % mode
164+ return "run-last-failure: %s" % self ._report_status
172165
173166 def pytest_runtest_logreport (self , report ):
174167 if (report .when == "call" and report .passed ) or report .skipped :
@@ -196,18 +189,35 @@ def pytest_collection_modifyitems(self, session, config, items):
196189 else :
197190 previously_passed .append (item )
198191 self ._previously_failed_count = len (previously_failed )
192+
199193 if not previously_failed :
200- # running a subset of all tests with recorded failures outside
201- # of the set of tests currently executing
202- return
203- if self .config .getoption ("lf" ):
204- items [:] = previously_failed
205- config .hook .pytest_deselected (items = previously_passed )
194+ # Running a subset of all tests with recorded failures
195+ # only outside of it.
196+ self ._report_status = "%d known failures not in selected tests" % (
197+ len (self .lastfailed ),
198+ )
199+ else :
200+ if self .config .getoption ("lf" ):
201+ items [:] = previously_failed
202+ config .hook .pytest_deselected (items = previously_passed )
203+ else : # --failedfirst
204+ items [:] = previously_failed + previously_passed
205+
206+ noun = (
207+ "failure" if self ._previously_failed_count == 1 else "failures"
208+ )
209+ suffix = " first" if self .config .getoption ("failedfirst" ) else ""
210+ self ._report_status = "rerun previous {count} {noun}{suffix}" .format (
211+ count = self ._previously_failed_count , suffix = suffix , noun = noun
212+ )
213+ else :
214+ self ._report_status = "no previously failed tests, "
215+ if self .config .getoption ("last_failed_no_failures" ) == "none" :
216+ self ._report_status += "deselecting all items."
217+ config .hook .pytest_deselected (items = items )
218+ items [:] = []
206219 else :
207- items [:] = previously_failed + previously_passed
208- elif self ._no_failures_behavior == "none" :
209- config .hook .pytest_deselected (items = items )
210- items [:] = []
220+ self ._report_status += "not deselecting items."
211221
212222 def pytest_sessionfinish (self , session ):
213223 config = self .config
@@ -303,8 +313,7 @@ def pytest_addoption(parser):
303313 dest = "last_failed_no_failures" ,
304314 choices = ("all" , "none" ),
305315 default = "all" ,
306- help = "change the behavior when no test failed in the last run or no "
307- "information about the last failures was found in the cache" ,
316+ help = "which tests to run with no previously (known) failures." ,
308317 )
309318
310319
0 commit comments