pytest-timeout icon indicating copy to clipboard operation
pytest-timeout copied to clipboard

Make timeout duration unit self-documenting

Open l0b0 opened this issue 4 years ago • 2 comments

In a statement like @mark.timeout(50) there is nothing to say the duration is defined in seconds. This has a few disadvantages:

  • Many other timing mechanisms use milliseconds or minutes as their units, so we can't simply assume that it's seconds. A new or returning user has to read the documentation (or code) to ascertain this, wasting time and producing cognitive overhead.
  • Extreme timeouts like 1200 or 0.00005 have more cognitive overhead, since converting to the "natural" unit of minutes/microseconds etc isn't always trivial.

It would be nice if it instead were self-documenting. Some alternatives:

  • @mark.timeout(seconds=50) would make it pretty obvious, and would make it easy to support several units.
  • @mark.timeout(timedelta(minutes=5)) would make it more explicit, while supporting the widest possible range of units at no extra cost.
  • @mark.timeout(seconds=timedelta(minutes=5).total_seconds()) is a clunky workaround.

l0b0 avatar Jan 27 '21 00:01 l0b0

I think a PR allowing to use timedelta in there would be acceptable.

flub avatar Oct 08 '23 10:10 flub

Here's an idea...

marker = item.get_closest_marker(name="timeout")
if marker.args:
    # Old marker
    if len(marker.args) > 1:
        raise RuntimeError("The `timeout` marker only accepts one argument.")
    if marker.kwargs:
        raise RuntimeError("The `timeout` marker does not accept keyword arguments when arguments are passed.")
    timeout = timedelta(seconds=marker.args[0])
elif marker.kwargs:
    timeout = timedelta(**marker.kwargs)
else:
    raise RuntimeError("The `timeout` marker needs either argument or keyword arguments passed.")

s0undt3ch avatar Nov 21 '23 10:11 s0undt3ch