Giter VIP home page Giter VIP logo

pytest-fail-slow's Introduction

Project Status: Active — The project has reached a stable, usable
state and is being actively developed. CI Status coverage pyversions Conda Version MIT License

GitHub | PyPI | Issues | Changelog

pytest-fail-slow is a pytest plugin for treating tests as failed if they took too long to run. It adds markers for failing tests if they or their setup stages run for longer than a given duration, along with command-line options for applying the same cutoff to all tests.

Note that slow tests will still be run to completion; if you want them to instead be stopped early, use pytest-timeout.

Installation

pytest-fail-slow requires Python 3.8 or higher and pytest 7.0 or higher. Just use pip for Python 3 (You have pip, right?) to install it:

python3 -m pip install pytest-fail-slow

Usage

Failing Slow Tests

To cause a specific test to fail if it takes too long to run, apply the fail_slow marker to it, with the desired cutoff time as the argument:

import pytest

@pytest.mark.fail_slow("5s")
def test_something_sluggish():
    ...

In addition, the --fail-slow DURATION option can be passed to the pytest command to affect all tests in that run. If --fail-slow is given and a test has the fail_slow marker, the duration given by the marker takes precedence for that test.

If a test fails due to being slow, pytest's output will include the test's duration and the duration threshold, like so:

________________________________ test_func ________________________________
Test passed but took too long to run: Duration 123.0s > 5.0s

Note: This feature only takes the durations for tests themselves into consideration. If a test passes in less than the specified duration, but one or more fixture setups/teardowns take longer than the duration, the test will still be marked as passing. To fail a test if the setup takes too long, see below.

Failing Slow Setups

New in version 0.4.0

To cause a specific test to fail if the setup steps for all of its fixtures combined take too long to run, apply the fail_slow_setup marker to it, with the desired cutoff time as the argument:

import pytest

@pytest.mark.fail_slow_setup("5s")
def test_costly_resource(slow_to_create):
    ...

Do not apply the marker to the test's fixtures; markers have no effect on fixtures.

In addition, the --fail-slow-setup DURATION option can be passed to the pytest command to affect all tests in that run. If --fail-slow-setup is given and a test has the fail_slow_setup marker, the duration given by the marker takes precedence for that test.

If the setup for a test takes too long to run, the test will be marked as "errored," the test itself will not be run, and pytest's output will include the setup stage's duration and the duration threshold, like so:

_______________________ ERROR at setup of test_func _______________________
Setup passed but took too long to run: Duration 123.0s > 5.0s

Note: If a test depends on multiple fixtures and just one of them exceeds the given duration on its own, the remaining fixtures will still have their setup steps run. Also, all fixture teardowns will still be run after the test would have run.

Specifying Durations

A duration passed to a marker or command-line option can be either a bare number of seconds or else a floating-point number followed by one of the following units (case insensitive):

  • h, hour, hours
  • m, min, mins, minute, minutes
  • s, sec, secs, second, seconds
  • ms, milli, millisec, milliseconds
  • us, μs, micro, microsec, microseconds

pytest-fail-slow's People

Contributors

dependabot[bot] avatar jwodder avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

saumzzz

pytest-fail-slow's Issues

Debian pkg

again -- for datalad. I guess it should be me who would do it. meanwhile filed RFP but might later just do myself

consider supporting also setup time?

this plugin is not useful if you want to keep setup time under control.
I have fast tests, but with slow setup time.
Would you consider adding support for setup as well? maybe with a parameter to control the behavior

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.