Skip to content

Commit 535436f

Browse files
authored
Merge pull request #13100 from JulianJvn/durations-min-precedence
Fix `-vv` overriding `--durations-min` (#12938)
2 parents 3214263 + 5865cbd commit 535436f

File tree

4 files changed

+44
-22
lines changed

4 files changed

+44
-22
lines changed

AUTHORS

+1
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ Joseph Hunkeler
225225
Joseph Sawaya
226226
Josh Karpel
227227
Joshua Bronson
228+
Julian Valentin
228229
Jurko Gospodnetić
229230
Justice Ndou
230231
Justyna Janczyszyn

changelog/12938.bugfix.rst

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fixed ``--durations-min`` argument not respected if ``-vv`` is used.

src/_pytest/runner.py

+10-6
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,10 @@ def pytest_addoption(parser: Parser) -> None:
6161
"--durations-min",
6262
action="store",
6363
type=float,
64-
default=0.005,
64+
default=None,
6565
metavar="N",
6666
help="Minimal duration in seconds for inclusion in slowest list. "
67-
"Default: 0.005.",
67+
"Default: 0.005 (or 0.0 if -vv is given).",
6868
)
6969

7070

@@ -74,6 +74,8 @@ def pytest_terminal_summary(terminalreporter: TerminalReporter) -> None:
7474
verbose = terminalreporter.config.get_verbosity()
7575
if durations is None:
7676
return
77+
if durations_min is None:
78+
durations_min = 0.005 if verbose < 2 else 0.0
7779
tr = terminalreporter
7880
dlist = []
7981
for replist in tr.stats.values():
@@ -90,11 +92,13 @@ def pytest_terminal_summary(terminalreporter: TerminalReporter) -> None:
9092
dlist = dlist[:durations]
9193

9294
for i, rep in enumerate(dlist):
93-
if verbose < 2 and rep.duration < durations_min:
95+
if rep.duration < durations_min:
9496
tr.write_line("")
95-
tr.write_line(
96-
f"({len(dlist) - i} durations < {durations_min:g}s hidden. Use -vv to show these durations.)"
97-
)
97+
message = f"({len(dlist) - i} durations < {durations_min:g}s hidden."
98+
if terminalreporter.config.option.durations_min is None:
99+
message += " Use -vv to show these durations."
100+
message += ")"
101+
tr.write_line(message)
98102
break
99103
tr.write_line(f"{rep.duration:02.2f}s {rep.when:<8} {rep.nodeid}")
100104

testing/acceptance_test.py

+32-16
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# mypy: allow-untyped-defs
22
from __future__ import annotations
33

4+
from collections.abc import Sequence
45
import dataclasses
56
import importlib.metadata
67
import os
@@ -970,28 +971,43 @@ def test_calls_showall(self, pytester: Pytester, mock_timing) -> None:
970971
pytester.makepyfile(self.source)
971972
result = pytester.runpytest_inprocess("--durations=0")
972973
assert result.ret == 0
973-
974-
tested = "3"
975-
for x in tested:
976-
for y in ("call",): # 'setup', 'call', 'teardown':
977-
for line in result.stdout.lines:
978-
if (f"test_{x}") in line and y in line:
979-
break
980-
else:
981-
raise AssertionError(f"not found {x} {y}")
974+
TestDurations.check_tests_in_output(result.stdout.lines, 2, 3)
982975

983976
def test_calls_showall_verbose(self, pytester: Pytester, mock_timing) -> None:
984977
pytester.makepyfile(self.source)
985978
result = pytester.runpytest_inprocess("--durations=0", "-vv")
986979
assert result.ret == 0
980+
TestDurations.check_tests_in_output(result.stdout.lines, 1, 2, 3)
981+
982+
def test_calls_showall_durationsmin(self, pytester: Pytester, mock_timing) -> None:
983+
pytester.makepyfile(self.source)
984+
result = pytester.runpytest_inprocess("--durations=0", "--durations-min=0.015")
985+
assert result.ret == 0
986+
TestDurations.check_tests_in_output(result.stdout.lines, 3)
987+
988+
def test_calls_showall_durationsmin_verbose(
989+
self, pytester: Pytester, mock_timing
990+
) -> None:
991+
pytester.makepyfile(self.source)
992+
result = pytester.runpytest_inprocess(
993+
"--durations=0", "--durations-min=0.015", "-vv"
994+
)
995+
assert result.ret == 0
996+
TestDurations.check_tests_in_output(result.stdout.lines, 3)
987997

988-
for x in "123":
989-
for y in ("call",): # 'setup', 'call', 'teardown':
990-
for line in result.stdout.lines:
991-
if (f"test_{x}") in line and y in line:
992-
break
993-
else:
994-
raise AssertionError(f"not found {x} {y}")
998+
@staticmethod
999+
def check_tests_in_output(
1000+
lines: Sequence[str], *expected_test_numbers: int, number_of_tests: int = 3
1001+
) -> None:
1002+
found_test_numbers = set(
1003+
test_number
1004+
for test_number in range(1, number_of_tests + 1)
1005+
if any(
1006+
line.endswith(f"test_{test_number}") and " call " in line
1007+
for line in lines
1008+
)
1009+
)
1010+
assert found_test_numbers == set(expected_test_numbers)
9951011

9961012
def test_with_deselected(self, pytester: Pytester, mock_timing) -> None:
9971013
pytester.makepyfile(self.source)

0 commit comments

Comments
 (0)