Improve summary stats when using '--collect-only' (#7875)
Co-authored-by: Bruno Oliveira <nicoddemus@gmail.com>
This commit is contained in:
@@ -1163,15 +1163,45 @@ class TerminalReporter:
|
||||
self._main_color = self._determine_main_color(bool(unknown_types))
|
||||
|
||||
def build_summary_stats_line(self) -> Tuple[List[Tuple[str, Dict[str, bool]]], str]:
|
||||
main_color, known_types = self._get_main_color()
|
||||
"""
|
||||
Build the parts used in the last summary stats line.
|
||||
|
||||
The summary stats line is the line shown at the end, "=== 12 passed, 2 errors in Xs===".
|
||||
|
||||
This function builds a list of the "parts" that make up for the text in that line, in
|
||||
the example above it would be:
|
||||
|
||||
[
|
||||
("12 passed", {"green": True}),
|
||||
("2 errors", {"red": True}
|
||||
]
|
||||
|
||||
That last dict for each line is a "markup dictionary", used by TerminalWriter to
|
||||
color output.
|
||||
|
||||
The final color of the line is also determined by this function, and is the second
|
||||
element of the returned tuple.
|
||||
"""
|
||||
if self.config.getoption("collectonly"):
|
||||
return self._build_collect_only_summary_stats_line()
|
||||
else:
|
||||
return self._build_normal_summary_stats_line()
|
||||
|
||||
def _get_reports_to_display(self, key: str) -> List[Any]:
|
||||
"""Get test/collection reports for the given status key, such as `passed` or `error`."""
|
||||
reports = self.stats.get(key, [])
|
||||
return [x for x in reports if getattr(x, "count_towards_summary", True)]
|
||||
|
||||
def _build_normal_summary_stats_line(
|
||||
self,
|
||||
) -> Tuple[List[Tuple[str, Dict[str, bool]]], str]:
|
||||
main_color, known_types = self._get_main_color()
|
||||
parts = []
|
||||
|
||||
for key in known_types:
|
||||
reports = self.stats.get(key, None)
|
||||
reports = self._get_reports_to_display(key)
|
||||
if reports:
|
||||
count = sum(
|
||||
1 for rep in reports if getattr(rep, "count_towards_summary", True)
|
||||
)
|
||||
count = len(reports)
|
||||
color = _color_for_type.get(key, _color_for_type_default)
|
||||
markup = {color: True, "bold": color == main_color}
|
||||
parts.append(("%d %s" % _make_plural(count, key), markup))
|
||||
@@ -1181,6 +1211,40 @@ class TerminalReporter:
|
||||
|
||||
return parts, main_color
|
||||
|
||||
def _build_collect_only_summary_stats_line(
|
||||
self,
|
||||
) -> Tuple[List[Tuple[str, Dict[str, bool]]], str]:
|
||||
deselected = len(self._get_reports_to_display("deselected"))
|
||||
errors = len(self._get_reports_to_display("error"))
|
||||
|
||||
if self._numcollected == 0:
|
||||
parts = [("no tests collected", {"yellow": True})]
|
||||
main_color = "yellow"
|
||||
|
||||
elif deselected == 0:
|
||||
main_color = "green"
|
||||
collected_output = "%d %s collected" % _make_plural(
|
||||
self._numcollected, "test"
|
||||
)
|
||||
parts = [(collected_output, {main_color: True})]
|
||||
else:
|
||||
all_tests_were_deselected = self._numcollected == deselected
|
||||
if all_tests_were_deselected:
|
||||
main_color = "yellow"
|
||||
collected_output = f"no tests collected ({deselected} deselected)"
|
||||
else:
|
||||
main_color = "green"
|
||||
selected = self._numcollected - deselected
|
||||
collected_output = f"{selected}/{self._numcollected} tests collected ({deselected} deselected)"
|
||||
|
||||
parts = [(collected_output, {main_color: True})]
|
||||
|
||||
if errors:
|
||||
main_color = _color_for_type["error"]
|
||||
parts += [("%d %s" % _make_plural(errors, "error"), {main_color: True})]
|
||||
|
||||
return parts, main_color
|
||||
|
||||
|
||||
def _get_pos(config: Config, rep: BaseReport):
|
||||
nodeid = config.cwd_relative_nodeid(rep.nodeid)
|
||||
@@ -1267,7 +1331,7 @@ _color_for_type_default = "yellow"
|
||||
|
||||
def _make_plural(count: int, noun: str) -> Tuple[int, str]:
|
||||
# No need to pluralize words such as `failed` or `passed`.
|
||||
if noun not in ["error", "warnings"]:
|
||||
if noun not in ["error", "warnings", "test"]:
|
||||
return count, noun
|
||||
|
||||
# The `warnings` key is plural. To avoid API breakage, we keep it that way but
|
||||
|
||||
Reference in New Issue
Block a user