{ "info": { "author": "Bruno Oliveira", "author_email": "foss@esss.co", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Framework :: Pytest", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Software Development :: Testing" ], "description": "=============\npytest-replay\n=============\n\n\n.. image:: http://img.shields.io/pypi/v/pytest-replay.svg\n :target: https://pypi.python.org/pypi/pytest-replay\n\n.. image:: https://anaconda.org/conda-forge/pytest-replay/badges/version.svg\n :target: https://anaconda.org/conda-forge/pytest-replay\n\n.. image:: https://travis-ci.org/ESSS/pytest-replay.svg?branch=master\n :target: https://travis-ci.org/ESSS/pytest-replay\n :alt: See Build Status on Travis CI\n\n.. image:: https://ci.appveyor.com/api/projects/status/github/ESSS/pytest-replay?branch=master\n :target: https://ci.appveyor.com/project/ESSS/pytest-replay/branch/master\n :alt: See Build Status on AppVeyor\n\n.. image:: https://img.shields.io/pypi/pyversions/pytest-replay.svg\n :target: https://pypi.python.org/pypi/pytest-replay\n\n.. image:: https://img.shields.io/badge/code%20style-black-000000.svg\n :target: https://github.com/psf/black\n\n\nSaves previous test runs and allow re-execute previous pytest runs to reproduce crashes or flaky tests\n\n----\n\nThis `Pytest`_ plugin was generated with `Cookiecutter`_ along with `@hackebrot`_'s `Cookiecutter-pytest-plugin`_ template.\n\n\nFeatures\n--------\n\nThis plugin helps to reproduce random or flaky behavior when running tests with xdist. ``pytest-xdist`` executes tests\nin a non-predictable order, making it hard to reproduce a behavior seen in CI locally because there's no convenient way\nto track which test executed in which worker.\n\nThis plugin records the executed node ids by each worker in the directory given by ``--replay-record-dir=`` flag,\nand a ``--replay=`` can be used to re-run the tests from a previous run. For example::\n\n $ pytest -n auto --replay-record-dir=build/tests/replay\n\nThis will generate files with the node id of each test executed by each worker, for example worker ``gw1`` will generate\na file ``.pytest-replay-gw1.txt`` with contents like this::\n\n test_foo.py::test[1]\n test_foo.py::test[3]\n test_foo.py::test[5]\n test_foo.py::test[7]\n test_foo.py::test[8]\n\nIf there is a crash or a flaky failure in the tests of the worker ``gw1``, one can take that file from the CI server and\nexecute the tests in the same order with::\n\n $ pytest --replay=.pytest-replay-gw1.txt\n\nHopefully this will make it easier to reproduce the problem and fix it.\n\n\nFAQ\n~~~\n\n1. ``pytest`` has its own `cache `_, why use a different mechanism?\n\n The internal cache saves its data using ``json``, which is not suitable in the advent of a crash because the file\n will not be readable.\n\n2. Shouldn't the ability of selecting tests from a file be part of the ``pytest`` core?\n\n Sure, but let's try to use this a bit as a separate plugin before proposing\n its inclusion into the core.\n\nInstallation\n------------\n\nYou can install ``pytest-replay`` via `pip`_ from `PyPI`_::\n\n $ pip install pytest-replay\n\nOr with conda::\n\n $ conda install -c conda-forge pytest-replay\n\n\nContributing\n------------\n\nContributions are very welcome.\n\nTests can be run with `tox`_ if you are using a native Python installation.\n\nTo run tests with `conda `_, first create a virtual environment and execute tests from there\n(conda with Python 3.5+ in the root environment)::\n\n $ python -m venv .env\n $ .env\\scripts\\activate\n $ pip install -e . pytest-xdist\n $ pytest tests\n\n\nReleases\n~~~~~~~~\n\nFollow these steps to make a new release:\n\n1. Create a new branch ``release-X.Y.Z`` from ``master``;\n2. Update ``CHANGELOG.rst``;\n3. Open a PR;\n4. After it is **green** and **approved**, push a new tag in the format ``X.Y.Z``;\n\nTravis will deploy to PyPI automatically.\n\nAfterwards, update the recipe in `conda-forge/pytest-replay-feedstock `_.\n\n\nLicense\n-------\n\nDistributed under the terms of the `MIT`_ license.\n\n\nIssues\n------\n\nIf you encounter any problems, please `file an issue`_ along with a detailed description.\n\n.. _`Cookiecutter`: https://github.com/audreyr/cookiecutter\n.. _`@hackebrot`: https://github.com/hackebrot\n.. _`MIT`: http://opensource.org/licenses/MIT\n.. _`BSD-3`: http://opensource.org/licenses/BSD-3-Clause\n.. _`GNU GPL v3.0`: http://www.gnu.org/licenses/gpl-3.0.txt\n.. _`Apache Software License 2.0`: http://www.apache.org/licenses/LICENSE-2.0\n.. _`cookiecutter-pytest-plugin`: https://github.com/pytest-dev/cookiecutter-pytest-plugin\n.. _`file an issue`: https://github.com/ESSS/pytest-replay/issues\n.. _`pytest`: https://github.com/pytest-dev/pytest\n.. _`tox`: https://tox.readthedocs.io/en/latest/\n.. _`pip`: https://pypi.python.org/pypi/pip/\n.. _`PyPI`: https://pypi.python.org/pypi\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/ESSS/pytest-replay", "keywords": "", "license": "MIT", "maintainer": "Bruno Oliveira", "maintainer_email": "bruno@esss.com.br", "name": "pytest-replay", "package_url": "https://pypi.org/project/pytest-replay/", "platform": "", "project_url": "https://pypi.org/project/pytest-replay/", "project_urls": { "Homepage": "https://github.com/ESSS/pytest-replay" }, "release_url": "https://pypi.org/project/pytest-replay/1.0.0/", "requires_dist": [ "pytest (>=3.0.0)" ], "requires_python": ">=3.6", "summary": "Saves previous test runs and allow re-execute previous pytest runs to reproduce crashes or flaky tests", "version": "1.0.0" }, "last_serial": 5810834, "releases": { "0.0.0": [ { "comment_text": "", "digests": { "md5": "849b82be70c510ce87fad19f5ff01e4b", "sha256": "d9dd6ba3fa7fbd7d941a9a81a366cc6d105ba212dae4fd841195789846147275" }, "downloads": -1, "filename": "pytest_replay-0.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "849b82be70c510ce87fad19f5ff01e4b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 2624, "upload_time": "2018-02-22T18:24:44", "url": "https://files.pythonhosted.org/packages/dd/91/58792a1d91ade5dc57ef296a1c29098af229708f3704fff1ef4d02664b6e/pytest_replay-0.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9745c837c264b7711c088b765a12d66a", "sha256": "723b5629d37eddb83da1f47aa3a7fdadaa2d0eea44e2450b1356e1ed7020f025" }, "downloads": -1, "filename": "pytest-replay-0.0.0.tar.gz", "has_sig": false, "md5_digest": "9745c837c264b7711c088b765a12d66a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3359, "upload_time": "2018-02-22T18:24:45", "url": "https://files.pythonhosted.org/packages/06/e5/da5548c47a02f4773af20d73a1c3606f863220b8f4bb4e76c5c5677b1282/pytest-replay-0.0.0.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "d98fe9c777bcc47b63ec4020a9b2f943", "sha256": "53ef2c6936bca9574f8e4a752a640b295968d6ba463e111df1ab7ffe8be224db" }, "downloads": -1, "filename": "pytest_replay-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d98fe9c777bcc47b63ec4020a9b2f943", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6817, "upload_time": "2018-02-22T19:17:52", "url": "https://files.pythonhosted.org/packages/d3/07/f2a13d4d802aeae6db16dd8d7f0a7922b904f5bf8042f80dd5ff7f235aeb/pytest_replay-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "62e9b2998d2cb7899dc076088da6e37f", "sha256": "9bd32a373a3b25956a7d58d2df035319556d9576224789f1ee7f2f6cdd7f3a6c" }, "downloads": -1, "filename": "pytest-replay-0.1.0.tar.gz", "has_sig": false, "md5_digest": "62e9b2998d2cb7899dc076088da6e37f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8068, "upload_time": "2018-02-22T19:17:55", "url": "https://files.pythonhosted.org/packages/16/3d/bd023ffc7ba000a39e225f6fe5890ce5618bcc37e54d053ace5dd39929b2/pytest-replay-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "48f326fd69d51af9ad36056967f068a5", "sha256": "66fd98d11a4c6f9b5c1e034ea629aef649e6d52054efa0f65f1c4c1f0ed76e87" }, "downloads": -1, "filename": "pytest_replay-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "48f326fd69d51af9ad36056967f068a5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6826, "upload_time": "2018-02-22T19:58:30", "url": "https://files.pythonhosted.org/packages/9f/6c/42642ff61c88b31b1b2af68dec70b03b483dd3007471a1d03ed4e81218bb/pytest_replay-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b45baa93232ff7c3947b372009cddd42", "sha256": "7f6e201300d203c73079107e49155a52fdd262131b17b4061c2ed6e2ae75b83f" }, "downloads": -1, "filename": "pytest-replay-0.1.1.tar.gz", "has_sig": false, "md5_digest": "b45baa93232ff7c3947b372009cddd42", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8143, "upload_time": "2018-02-22T19:58:31", "url": "https://files.pythonhosted.org/packages/2d/cf/c7f258655956c95c43044c98508e09a5177be29fcc034d9fb78b4c83b40c/pytest-replay-0.1.1.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "8e3b769b08c24fac27b34290b2da8e0e", "sha256": "5c2e35bef034792d213ea660cf67e021d46ddaf7b63d0340b020fdd32dfe97cf" }, "downloads": -1, "filename": "pytest_replay-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "8e3b769b08c24fac27b34290b2da8e0e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7223, "upload_time": "2018-02-23T12:18:37", "url": "https://files.pythonhosted.org/packages/2b/9d/1989b59eaa1c24aecc7e1a52805b4044ef5ea8ac2747ee2e1a8984acace2/pytest_replay-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b23c4985eba8e0df08fa70fb94441776", "sha256": "8258417a96605b1de21f369a1c595c9239c1f0b1af594659f38f180dc969945f" }, "downloads": -1, "filename": "pytest-replay-0.2.0.tar.gz", "has_sig": false, "md5_digest": "b23c4985eba8e0df08fa70fb94441776", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8342, "upload_time": "2018-02-23T12:18:37", "url": "https://files.pythonhosted.org/packages/3f/ac/ae441311f201cc54fd5b5f59367cd8ed4f7b38eebdaeb2c8202fd097bf38/pytest-replay-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "3e195ae60183dbb97371aaf88c3ab1ab", "sha256": "7cdc71a4a7ab4dcb6cabf5706ed09e30da70cb6eb5e7300ad46089ed23abfec8" }, "downloads": -1, "filename": "pytest_replay-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "3e195ae60183dbb97371aaf88c3ab1ab", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7348, "upload_time": "2018-03-01T19:04:11", "url": "https://files.pythonhosted.org/packages/40/af/1c9d1bbbfe0e6cb9a2a18efe59a044b20680169f012c4210e6aa9bcec2f0/pytest_replay-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "522778f2b707eb176c5107e4b4b232a0", "sha256": "7c08cba713c9335f2149f0ef9587b92467d60365d10546837a1952042377601d" }, "downloads": -1, "filename": "pytest-replay-0.2.1.tar.gz", "has_sig": false, "md5_digest": "522778f2b707eb176c5107e4b4b232a0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8603, "upload_time": "2018-03-01T19:04:12", "url": "https://files.pythonhosted.org/packages/c7/25/701240118924bd989900ed59aa9e4b2c82a1f22968dd3dcfc4b97be49f83/pytest-replay-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "8d6fac23929b9306922c5fc6bb60f27f", "sha256": "d2aa0818f26627409a3008b6d7e9f67bf5b769cd3ccfd49407a0cfb8683b0eb1" }, "downloads": -1, "filename": "pytest_replay-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "8d6fac23929b9306922c5fc6bb60f27f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7408, "upload_time": "2018-03-02T12:25:58", "url": "https://files.pythonhosted.org/packages/8c/8d/cc6c995749be595ac2fcb638de48ae84637d1dded0e7c040f9156a5d290c/pytest_replay-0.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "eb91999f398a5967e5362564ca98fbc4", "sha256": "ab3e089b3dec0c37dc39d88935cccaa5f6d763ec6d782224378beae51b6dd944" }, "downloads": -1, "filename": "pytest-replay-0.2.2.tar.gz", "has_sig": false, "md5_digest": "eb91999f398a5967e5362564ca98fbc4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8883, "upload_time": "2018-03-02T12:25:59", "url": "https://files.pythonhosted.org/packages/56/11/fbeabe42b06d297567cf39eb1b318c7c64dc6a166c2ee820726d81a7eb60/pytest-replay-0.2.2.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "94164c2fca4334816f1e3e27a04dfc0f", "sha256": "3d74aff8b7ccf636aa646f6f49e0a3561598194959b8af5adb4f010e6417cc44" }, "downloads": -1, "filename": "pytest_replay-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "94164c2fca4334816f1e3e27a04dfc0f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 5442, "upload_time": "2019-09-10T19:22:43", "url": "https://files.pythonhosted.org/packages/dc/2c/1f95958f7993767d7e56eda8155e5a395de56ea2ec2711bda306c48ebb52/pytest_replay-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e6cbc8fa9a6db052fb7224e586a4a25f", "sha256": "21e9e26857cd4d386109176dea32983af963af30c5a1a8944a1a59bd2b3e7c68" }, "downloads": -1, "filename": "pytest-replay-1.0.0.tar.gz", "has_sig": false, "md5_digest": "e6cbc8fa9a6db052fb7224e586a4a25f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 8815, "upload_time": "2019-09-10T19:22:44", "url": "https://files.pythonhosted.org/packages/f4/62/34bb1417fe7991f41ebff093bb6535fd1c1e79a4cd311267a623a9846c03/pytest-replay-1.0.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "94164c2fca4334816f1e3e27a04dfc0f", "sha256": "3d74aff8b7ccf636aa646f6f49e0a3561598194959b8af5adb4f010e6417cc44" }, "downloads": -1, "filename": "pytest_replay-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "94164c2fca4334816f1e3e27a04dfc0f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 5442, "upload_time": "2019-09-10T19:22:43", "url": "https://files.pythonhosted.org/packages/dc/2c/1f95958f7993767d7e56eda8155e5a395de56ea2ec2711bda306c48ebb52/pytest_replay-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e6cbc8fa9a6db052fb7224e586a4a25f", "sha256": "21e9e26857cd4d386109176dea32983af963af30c5a1a8944a1a59bd2b3e7c68" }, "downloads": -1, "filename": "pytest-replay-1.0.0.tar.gz", "has_sig": false, "md5_digest": "e6cbc8fa9a6db052fb7224e586a4a25f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 8815, "upload_time": "2019-09-10T19:22:44", "url": "https://files.pythonhosted.org/packages/f4/62/34bb1417fe7991f41ebff093bb6535fd1c1e79a4cd311267a623a9846c03/pytest-replay-1.0.0.tar.gz" } ] }