Skip to main content

Plugin for nose or py.test that automatically reruns flaky tests.

Project description

http://opensource.box.com/badges/active.svg https://travis-ci.org/box/flaky.png?branch=master https://img.shields.io/pypi/v/flaky.svg https://img.shields.io/pypi/dm/flaky.svg

About

Flaky is a plugin for nose or py.test that automatically reruns flaky tests.

Ideally, tests reliably pass or fail, but sometimes test fixtures must rely on components that aren’t 100% reliable. With flaky, instead of removing those tests or marking them to @skip, they can be automatically retried.

For more information about flaky, see this presentation.

Marking tests flaky

To mark a test as flaky, simply import flaky and decorate the test with @flaky:

from flaky import flaky
@flaky
def test_something_that_usually_passes(self):
    value_to_double = 21
    result = get_result_from_flaky_doubler(value_to_double)
    self.assertEqual(result, value_to_double * 2, 'Result doubled incorrectly.')

By default, flaky will retry a failing test once, but that behavior can be overridden by passing values to the flaky decorator. It accepts two parameters: max_runs, and min_passes; flaky will run tests up to max_runs times, until it has succeeded min_passes times. Once a test passes min_passes times, it’s considered a success; once it has been run max_runs times without passing min_passes times, it’s considered a failure.

@flaky(max_runs=3, min_passes=2)
def test_something_that_usually_passes(self):
    """This test must pass twice, and it can be run up to three times."""
    value_to_double = 21
    result = get_result_from_flaky_doubler(value_to_double)
    self.assertEqual(result, value_to_double * 2, 'Result doubled incorrectly.')

Marking a class flaky

In addition to marking a single test flaky, entire test cases can be marked flaky:

@flaky
class TestMultipliers(TestCase):
    def test_flaky_doubler(self):
        value_to_double = 21
        result = get_result_from_flaky_doubler(value_to_double)
        self.assertEqual(result, value_to_double * 2, 'Result doubled incorrectly.')

    @flaky(max_runs=3)
    def test_flaky_tripler(self):
        value_to_triple = 14
        result = get_result_from_flaky_tripler(value_to_triple)
        self.assertEqual(result, value_to_triple * 3, 'Result tripled incorrectly.')

The @flaky class decorator will mark test_flaky_doubler as flaky, but it won’t override the 3 max_runs for test_flaky_tripler (from the decorator on that test method).

Don’t rerun certain types of failures

Depending on your tests, some failures are obviously not due to flakiness. Instead of rerunning after those failures, you can specify a filter function that can tell flaky to fail the test right away.

def is_not_crash(err, *args):
    return not issubclass(err[0], ProductCrashedError)

@flaky
def test_something():
    raise ProductCrashedError

@flaky(rerun_filter=is_not_crash)
def test_something_else():
    raise ProductCrashedError

Flaky will run test_something twice, but will only run test_something_else once.

Activating the plugin

Like any nose plugin, flaky can be activated via the command line:

nosetests --with-flaky

With py.test, flaky will automatically run. It can, however be disabled via the command line:

py.test -p no:flaky

Command line arguments

No Flaky Report

Pass --no-flaky-report to suppress the report at the end of the run detailing flaky test results.

Shorter Flaky Report

Pass --no-success-flaky-report to suppress information about successful flaky tests.

Force Flaky

Pass --force-flaky to treat all tests as flaky.

Pass --max-runs=MAX_RUNS and/or --min-passes=MIN_PASSES to control the behavior of flaky if --force-flaky is specified. Flaky decorators on individual tests will override these defaults.

Additional usage examples are in the code - see test/test_example.py

Installation

To install, simply:

pip install flaky

Compatibility

Flaky is tested with the following test runners and options:

  • Nosetests. Doctests cannot be marked flaky.

  • Py.test. Works with pytest-xdist but not with the –boxed option. Doctests cannot be marked flaky.

Contributing

See CONTRIBUTING.rst.

Setup

Create a virtual environment and install packages -

mkvirtualenv flaky
pip install -r requirements-dev.txt

Testing

Run all tests using -

tox

The tox tests include code style checks via pep8 and pylint.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

flaky-2.4.0.tar.gz (27.2 kB view details)

Uploaded Source

Built Distribution

flaky-2.4.0-py2-none-any.whl (40.2 kB view details)

Uploaded Python 2

File details

Details for the file flaky-2.4.0.tar.gz.

File metadata

  • Download URL: flaky-2.4.0.tar.gz
  • Upload date:
  • Size: 27.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for flaky-2.4.0.tar.gz
Algorithm Hash digest
SHA256 6446e186674db9d67be5e85857b6e98a68a6491d5d307447d9a1a6721aca9fad
MD5 b79d32c72a659d0f62451dfcbf054a92
BLAKE2b-256 1161af296890b663b0f46fa593eb8111484725137e43361c366c7fde03a68948

See more details on using hashes here.

File details

Details for the file flaky-2.4.0-py2-none-any.whl.

File metadata

File hashes

Hashes for flaky-2.4.0-py2-none-any.whl
Algorithm Hash digest
SHA256 58b79b9a10daf4627d12ca9d14e8410038ec2a3c1694a546a026709f1411bfc9
MD5 cc5eacca8f1f364cc04fbf558e0ac35e
BLAKE2b-256 af2460b9f09037a3e15b6c13d666cc90b1104294c131459c58549107e3213e12

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page