Automatically mock your HTTP interactions to simplify and speed up testing

Overview

VCR.py 📼

PyPI Python versions Build Status Code Coverage Status Join the chat at https://gitter.im/kevin1024/vcrpy Code Style: black


vcr.py logo

This is a Python version of Ruby's VCR library.

Source code
https://github.com/kevin1024/vcrpy
Documentation
https://vcrpy.readthedocs.io/

Rationale

VCR.py simplifies and speeds up tests that make HTTP requests. The first time you run code that is inside a VCR.py context manager or decorated function, VCR.py records all HTTP interactions that take place through the libraries it supports and serializes and writes them to a flat file (in yaml format by default). This flat file is called a cassette. When the relevant piece of code is executed again, VCR.py will read the serialized requests and responses from the aforementioned cassette file, and intercept any HTTP requests that it recognizes from the original test run and return the responses that corresponded to those requests. This means that the requests will not actually result in HTTP traffic, which confers several benefits including:

  • The ability to work offline
  • Completely deterministic tests
  • Increased test execution speed

If the server you are testing against ever changes its API, all you need to do is delete your existing cassette files, and run your tests again. VCR.py will detect the absence of a cassette file and once again record all HTTP interactions, which will update them to correspond to the new API.

Usage with Pytest

There is a library to provide some pytest fixtures called pytest-recording https://github.com/kiwicom/pytest-recording

License

This library uses the MIT license. See LICENSE.txt for more details

Comments
  • Feature/new matchers

    Feature/new matchers

    Hi,

    I did the update for the #71 as promised. This merge request introduces backward incompatibility with old cassettes, but I think it's worth it.

    Improvements which I think should be done:

    1. url matcher could be removed on on favor of uri . (I left just for backward compatibility)
    2. ~~More integration and unit test should be added (I will do this after discussion of this pull request)~~ done.

    Looking forward for review. Max

    enhancement in progress 
    opened by mshytikov 47
  • Drop support for EOL Python 2.6 and 3.3

    Drop support for EOL Python 2.6 and 3.3

    Fixes #338.

    Also removes redundant code that was required to maintain support for Python 2.6.

    Here's the pip installs for vcrpy-unittest from PyPI for the last month (via pypinfo --percent --pip vcrpy-unittest pyversion) showing nothing for Python 2.6 or 3.3.

    | python_version | percent | download_count | | -------------- | ------: | -------------: | | 2.7 | 47.5% | 699 | | 3.6 | 43.7% | 643 | | 3.5 | 4.8% | 70 | | 3.4 | 4.0% | 59 |

    Also includes @samuelfekete's CI fixes from 36b5162 to (mostly) get the CI green! Thanks! (I would have cherry-picked that commit but git couldn't find it.)

    opened by hugovk 38
  • vcrpy doesn't work under django?

    vcrpy doesn't work under django?

    I'm trying to use vcrpy to accelerate the execution of my django application test suite. I'm using django 1.7 on Mac, with Python 2.7.

    I added the following couple of lines to one of my tests:

         import vcr
         with vcr.use_cassette('recording.yaml'):
    

    The result is an import error:

        import vcr
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/vcr/__init__.py", line 2, in <module>
        from .config import VCR
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/vcr/config.py", line 6, in <module>
        from .cassette import Cassette
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/vcr/cassette.py", line 12, in <module>
        from .patch import CassettePatcherBuilder
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/vcr/patch.py", line 8, in <module>
        from .stubs import VCRHTTPConnection, VCRHTTPSConnection
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/vcr/stubs/__init__.py", line 9, in <module>
        from six.moves.http_client import (
    ImportError: No module named http_client
    

    The problematic code in stubs/init.py is :

    import six
    from six.moves.http_client import (
        HTTPConnection,
        HTTPSConnection,
        HTTPMessage,
        HTTPResponse,
    )
    

    This code seems to run fine when I'm just running it from a plain python console, but it results in the above ImportError under django.

    ready 
    opened by roy2006 34
  • Adding support for boto3

    Adding support for boto3

    boto3 bundles the requests library, so this basically is a copy and paste of the requests stubbing.

    I'm a little lost in the testing of this, with some guidance and/or help I could complete this.

    opened by dedsm 27
  • add httpx support

    add httpx support

    This PR adds support for httpx.

    The stub and tests are heavily based in the aiohttp implementation. You won't see any synchronous implementation because it was not necessary.

    Not sure if I edited the tox file correctly. (:

    opened by herdigiorgi 22
  • Upgrading to 1.6.0 seems conditional extra_require are not working on setup

    Upgrading to 1.6.0 seems conditional extra_require are not working on setup

    I receive this error when i upgraded to 1.6.0:

    Traceback (most recent call last):
      File "run_tests.py", line 14, in <module>
        from tests.app_login_tests import MainSiteTest  # noqa
      File "/my_app/tests/app_login_tests.py", line 7, in <module>
        from vcr_setup import vcrlib
      File "/my_app/tests/vcr_setup.py", line 1, in <module>
        import vcr
      File "/usr/local/lib/python2.7/dist-packages/vcr/__init__.py", line 2, in <module>
        from .config import VCR
      File "/usr/local/lib/python2.7/dist-packages/vcr/config.py", line 8, in <module>
        from .compat import collections
      File "/usr/local/lib/python2.7/dist-packages/vcr/compat.py", line 4, in <module>
        import mock
    ImportError: No module named mock
    

    Looking at the commits i think this new conditionals imports are not working https://github.com/kevin1024/vcrpy/commit/41949f7dc64a2ddb8a9c2cb845eac7bb8b94380b#diff-2eeaed663bd0d25b7e608891384b7298R36 i'm installing the package using pip im on python 2.7.

    opened by ialex 21
  • Handle PEP 479 with backward compat for python2.7

    Handle PEP 479 with backward compat for python2.7

    PEP479 renders the _handle_generator function of CassetteContextDecorator object erroneous in python3.7. Yet, we can't rely properly on yield from as python2.7 compat is still mandatory. Try to find a good balance between these two facts

    @graingert is it better for you?

    This would close #396

    bug need dev 
    opened by P-EB 20
  • use_cassette as decorator fails to pass unknown kwargs, pytest important

    use_cassette as decorator fails to pass unknown kwargs, pytest important

    usage requires edited conftest and execute with py.test --template FOO

    conftest.py

    import pytest
    @pytest.fixture
    def template(request):
        return request.config.getoption("--template")
    
    def pytest_addoption(parser):
        parser.addoption("--template", action="store",type='string',
                         help="set the name of the template to use in tests")
    

    test.py

    import vcr
    import pytest
    @vcr.use_cassette('test_vapp_find.yaml')
    def test_vapp_find(self, template):
            assert template == FOO
    

    usage:

    py.test -s test.py --template FOO

    suggested fix

    config.py

    # pass kwargs we dont know about merged_config = dict(kwargs.items() + merged_config.items())
    return Cassette.load(path, **merged_config)
    
    #cassette.py::Cassette.init
    **kwargs
    ):
    super(Cassette,self).init(**kwargs)
    
    opened by suederat 18
  • Error with body matcher for json, xmlrpc and form urlencoded

    Error with body matcher for json, xmlrpc and form urlencoded

    This is a tricky issue I encountered when using the body matcher on xmlrpc requests.

    Symptoms: Sometimes the request won't match, sometimes it will, and this only affects certain requests. This occurs on Python 3.4 and I believe other python 3 versions but not on 2.7

    Cause: An XMLRPC request has a body with XML inside which is generated from the parameters passed to the function call. Some parameters can be of dict type. xmlrpclib (or xmlrpc.client) will loop over items of the dict and generate the appropriate XML which will be the body of our POST request. Now items order is not guaranteed in dict and the behavior changed in python 3 such that the order of the same dict can change anytime and is not more or less constant on the same computer as in python 2. So the generated XML won't be necessarily the same as the one you recorded.

    Fix suggestion: A custom xmlrpc body matcher that takes that into account and will compare the struct XML elements in the correct order.

    The gzip compression didn't help me debuging this as I couldn't even read directly the cassettes...

    opened by Diaoul 17
  • Make request.headers always a CaseInsensitiveDict.

    Make request.headers always a CaseInsensitiveDict.

    Previously request.headers was a normal dict (albeit with the request.add_header interface) which meant that some code paths would do case-sensitive matching, for example remove_post_data_parameters which tests for 'Content-Type'. This change allows all code paths to get the same case-insensitive treatment.

    Additionally request.headers becomes a property to enforce upgrading it to a CaseInsensitiveDict even if assigned.

    opened by agriffis 16
  • Drop support for legacy Python 2.7

    Drop support for legacy Python 2.7

    Fixes #434.

    Python 2.7 reaches EOL on 2020-01-01. Many projects are pledging to drop support before or during 2020: https://python3statement.org/

    It's also relatively little used. Here's the pip installs for vcrpy from PyPI for May 2019:

    | category | percent | downloads | |----------|--------:|----------:| | 3.6 | 37.19% | 65,506 | | 3.7 | 26.36% | 46,432 | | 2.7 | 21.83% | 38,445 | | 3.5 | 11.53% | 20,303 | | 3.4 | 2.48% | 4,361 | | null | 0.31% | 553 | | 3.8 | 0.29% | 503 | | 3.3 | 0.01% | 14 | | Total | | 176,117 |

    Source: pypistats python_minor vcrpy --last-month # pip install pypistats

    There's one bit of six remaining in this PR, what's the best way to replace this?

        def test_case(self, predicate=None):
            predicate = predicate or self.is_test_method
            return six.with_metaclass(auto_decorate(self.use_cassette, predicate))
    
    opened by hugovk 15
  • build(deps): bump actions/checkout from 3.1.0 to 3.3.0

    build(deps): bump actions/checkout from 3.1.0 to 3.3.0

    Bumps actions/checkout from 3.1.0 to 3.3.0.

    Release notes

    Sourced from actions/checkout's releases.

    v3.3.0

    What's Changed

    New Contributors

    Full Changelog: https://github.com/actions/checkout/compare/v3.2.0...v3.3.0

    v3.2.0

    What's Changed

    New Contributors

    Full Changelog: https://github.com/actions/checkout/compare/v3.1.0...v3.2.0

    Changelog

    Sourced from actions/checkout's changelog.

    Changelog

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies github_actions 
    opened by dependabot[bot] 0
  • Add an option to remove unused requests from cassette

    Add an option to remove unused requests from cassette

    This PR adds an option to remove previously recorded interactions if they are not used. I believe this feature can address the issue discussed in #208. We don't need to focus on ignoring all requests in the cassette file, but instead, we can write to file only replayed interactions and new ones. If no previous request is used, VCR will save only new interactions.

    There is a similar feature (merged, but not released) in Ruby VCR.

    opened by danielnsilva 0
  • Route requests to different cassette files depending on host

    Route requests to different cassette files depending on host

    I have various hosts that I need to hit for a unit test. I'd like to be able to route the responses from each host to its own specific cassette file. The documentation does not appear to show an example of how to do this. Is there a recommended way of doing this?

    opened by Jasonca2 0
  • Improved message on CannotOverwriteExistingCassetteException with no failed matchers

    Improved message on CannotOverwriteExistingCassetteException with no failed matchers

    Context

    Per discussion here: Originally posted by @salomvary in https://github.com/kevin1024/vcrpy/issues/533#issuecomment-1269519939

    CannotOverwriteExistingCassetteException can be raised along with 'no matchers failed' as the message details.

    In many cases, setting vcr.allow_playback_repeats for the affected test will clear the issue.

    Proposal

    Update the error handler to recognize this corner case and emit a message encouraging developers to consider whether they need to set vcr.allow_playback_repeats

    opened by edthedev 0
  • Question! Using VCR mechanics to record queries to sql database.

    Question! Using VCR mechanics to record queries to sql database.

    Does anyone know if there are any libraries that would allow to record and play queries to sql database? I don't per-see any obstacles in implementation. The question is does it even makes sense in terms of test speed improvement?

    opened by igor-polynets 2
Releases(v4.2.1)
  • v4.2.1(Aug 31, 2022)

    • Fix a bug where the first request in a redirect chain was not being recorded with aiohttp
    • Various typos and small fixes, thanks @jairhenrique, @timgates42
    Source code(tar.gz)
    Source code(zip)
  • v4.2.0(Jun 29, 2022)

    • Drop support for python < 3.7, thanks @jairhenrique, @IvanMalison, @AthulMuralidhar
    • Various aiohttp bigfixes (thanks @pauloromeira and boechat107)
    • Bugfix: filter_post_data_parameters not working with aiohttp. Thank you @vprakashplanview, @scop, @jairhenrique, and @cinemascop89
    • Bugfix: Some random misspellings (thanks @scop)
    • Migrate the CI suite to Github Actions from Travis (thanks @jairhenrique and @cclauss)
    • Various documentation and code misspelling fixes (thanks @scop and @Justintime50)
    • Bugfix: httpx support (select between allow_redirects/follow_redirects) (thanks @immerrr)
    Source code(tar.gz)
    Source code(zip)
  • v4.1.1(Oct 9, 2020)

    • Fix HTTPX support for versions greater than 0.15 (thanks @jairhenrique)
    • Include a trailing newline on json cassettes (thanks @AaronRobson)
    Source code(tar.gz)
    Source code(zip)
  • v4.1.0(Jul 31, 2020)

    • 4.1.0
      • Add support for httpx!! (thanks @herdigiorgi)
      • Add the new allow_playback_repeats option (thanks @tysonholub)
      • Several aiohttp improvements (cookie support, multiple headers with same key) (Thanks @pauloromeira)
      • Use enums for record modes (thanks @aaronbannin)
      • Bugfix: Do not redirect on 304 in aiohttp (Thanks @royjs)
      • Bugfix: Fix test suite by switching to mockbin (thanks @jairhenrique)
    Source code(tar.gz)
    Source code(zip)
  • v4.0.2(Dec 20, 2019)

  • v4.0.1(Dec 20, 2019)

  • v4.0.0(Dec 20, 2019)

  • v3.0.0(Dec 14, 2019)

    v3.0.0

    • This release is a breaking change as it changes how aiohttp follows redirects and your cassettes may need to be re-recorded with this update.
    • Fix multiple requests being replayed per single request in aiohttp stub #495 (@nickdirienzo)
    • Add support for request_info on mocked responses in aiohttp stub #495 (@nickdirienzo)
    • doc: fixed variable name (a -> cass) in an example for rewind #492 (@yarikoptic)
    Source code(tar.gz)
    Source code(zip)
  • v2.1.1(Nov 3, 2019)

    • 2.1.1
    • Format code with black (@neozenith)
    • Use latest pypy3 in Travis (@hugovk)
    • Improve documentation about custom matchers (@gward)
    • Fix exception when body is empty (@keithprickett)
    • Add pytest-recording to the documentation as an alternative Pytest plugin (@Stranger6667)
    • Fix yarl and python3.5 version issue (@neozenith)
    • Fix header matcher for boto3 - fixes #474 (@simahawk)
    Source code(tar.gz)
    Source code(zip)
  • v2.1.0(Aug 8, 2019)

    v2.1.0

    Updates

    • Add a rewind method to reset a cassette (thanks @khamidou)
    • New error message with more details on why the cassette failed to play a request (thanks @arthurHamon2, @neozenith)
    • Handle connect tunnel URI (thanks @jeking3)
    • Add code coverage to the project (thanks @neozenith)
    • Drop support to python 3.4
    • Add deprecation warning on python 2.7, next major release will drop python 2.7 support

    Fixes

    • Fix build problems on requests tests (thanks to @dunossauro)
    • Fix matching on 'body' failing when Unicode symbols are present in them (thanks @valgur)
    • Fix bugs on aiohttp integration (thanks @graingert, @steinnes, @stj, @lamenezes, @lmazuel)
    • Fix Biopython incompatibility (thanks @rishab121)
    • Fix Boto3 integration (thanks @1oglop1, @arthurHamon2)
    Source code(tar.gz)
    Source code(zip)
  • v2.0.0(Sep 19, 2018)

    • Support python 3.7 (fix httplib2 and urllib2, thanks @felixonmars)
    • [#356] Fixes before_record_response so the original response isn't changed (thanks @kgraves)
    • Fix requests stub when using proxy (thanks @samuelfekete @daneoshiga)
    • (only for aiohttp stub) Drop support to python 3.4 asyncio.coroutine (aiohttp doesn't support python it anymore)
    • Fix aiohttp stub to work with aiohttp client (thanks @stj)
    • Fix aiohttp stub to accept content type passed
    • Improve docs (thanks @adamchainz)
    Source code(tar.gz)
    Source code(zip)
  • v1.13.0(Jul 13, 2018)

    • Fix support to latest aiohttp version (3.3.2).
    • Fix content-type bug in aiohttp stub.
    • Properly save URL with query params properly when using aiohttp.
    Source code(tar.gz)
    Source code(zip)
  • v1.12.0(May 21, 2018)

    • Fix support to latest aiohttp version (3.2.1)
    • Adapted setup to PEP508
    • Support binary responses on aiohttp
    • Dropped support for EOL python versions (2.6 and 3.3)
    Source code(tar.gz)
    Source code(zip)
  • v1.11.1(May 28, 2017)

  • v1.11.0(May 2, 2017)

    Allow injection of persistence methods + bugfixes (thanks @j-funk and @IvanMalison) Support python 3.6 + CI tests (thanks @derekbekoe and @graingert) Support pytest-asyncio coroutines (thanks @graingert)

    Source code(tar.gz)
    Source code(zip)
  • v1.10.5(Jan 12, 2017)

    • Added a fix to httplib2 (thanks @carlosds730)
    • Fix an issue with aiohttp (thanks @madninja)
    • Add missing requirement yarl (thanks @lamenezes),
    • Remove duplicate mock triple (thanks @FooBarQuaxx)
    Source code(tar.gz)
    Source code(zip)
  • v1.10.1(Sep 12, 2016)

  • v1.10.0(Aug 14, 2016)

  • v1.9.0(Jul 16, 2016)

    • Add support for boto3 (thanks @desdm, @foorbarna).
    • Fix deepcopy issue for response headers when decode_compressed_response is enabled (thanks @nickdirienzo)
    Source code(tar.gz)
    Source code(zip)
  • v1.7.3(Aug 24, 2015)

    [#188] additional_matchers kwarg on use_casstte. [#191] Actually support passing multiple before_record_request functions (thanks @agriffis).

    Source code(tar.gz)
    Source code(zip)
  • v1.7.2(Aug 19, 2015)

  • v1.7.1(Aug 12, 2015)

  • v1.6.1(Jul 15, 2015)

    [#169] Support conditional requirements in old versions of pip, Fix RST parse errors generated by pandoc, [Tornado] Fix unsupported features exception not being raised, [#166] content-aware body matcher.

    Source code(tar.gz)
    Source code(zip)
  • v1.6.0(Jul 3, 2015)

    [#120] Tornado support (thanks @abhinav), [#147] packaging fixes (thanks @graingert), [#158] allow filtering post params in requests (thanks @MrJohz), [#140] add xmlrpclib support (thanks @Diaoul).

    Source code(tar.gz)
    Source code(zip)
  • v1.5.2(May 15, 2015)

Owner
Kevin McCarthy
Kevin McCarthy
Declarative HTTP Testing for Python and anything else

Gabbi Release Notes Gabbi is a tool for running HTTP tests where requests and responses are represented in a declarative YAML-based form. The simplest

Chris Dent 139 Sep 21, 2022
Language-agnostic HTTP API Testing Tool

Dredd — HTTP API Testing Framework Dredd is a language-agnostic command-line tool for validating API description document against backend implementati

Apiary 4k Jan 5, 2023
One-stop solution for HTTP(S) testing.

HttpRunner HttpRunner is a simple & elegant, yet powerful HTTP(S) testing framework. Enjoy! ✨ ?? ✨ Design Philosophy Convention over configuration ROI

HttpRunner 3.5k Jan 4, 2023
Mockoon is the easiest and quickest way to run mock APIs locally. No remote deployment, no account required, open source.

Mockoon Mockoon is the easiest and quickest way to run mock APIs locally. No remote deployment, no account required, open source. It has been built wi

mockoon 4.4k Dec 30, 2022
User-interest mock backend server implemnted using flask restful, and SQLAlchemy ORM confiugred with sqlite

Flask_Restful_SQLAlchemy_server User-interest mock backend server implemnted using flask restful, and SQLAlchemy ORM confiugred with sqlite. Backend b

Austin Weigel 1 Nov 17, 2022
pytest plugin for distributed testing and loop-on-failures testing modes.

xdist: pytest distributed testing plugin The pytest-xdist plugin extends pytest with some unique test execution modes: test run parallelization: if yo

pytest-dev 1.1k Dec 30, 2022
a socket mock framework - for all kinds of socket animals, web-clients included

mocket /mɔˈkɛt/ A socket mock framework for all kinds of socket animals, web-clients included - with gevent/asyncio/SSL support ...and then MicroPytho

Giorgio Salluzzo 249 Dec 14, 2022
Aioresponses is a helper for mock/fake web requests in python aiohttp package.

aioresponses Aioresponses is a helper to mock/fake web requests in python aiohttp package. For requests module there are a lot of packages that help u

null 402 Jan 6, 2023
a socket mock framework - for all kinds of socket animals, web-clients included

mocket /mɔˈkɛt/ A socket mock framework for all kinds of socket animals, web-clients included - with gevent/asyncio/SSL support ...and then MicroPytho

Giorgio Salluzzo 208 Jan 31, 2021
Thin-wrapper around the mock package for easier use with pytest

pytest-mock This plugin provides a mocker fixture which is a thin-wrapper around the patching API provided by the mock package: import os class UnixF

pytest-dev 1.5k Jan 5, 2023
Cornell record & replay mock server

Cornell: record & replay mock server Cornell makes it dead simple, via its record and replay features to perform end-to-end testing in a fast and isol

HiredScoreLabs 134 Sep 15, 2022
Mock smart contracts for writing Ethereum test suites

Mock smart contracts for writing Ethereum test suites This package contains comm

Trading Strategy 222 Jan 4, 2023
PENBUD is penetration testing buddy which helps you in penetration testing by making various important tools interactive.

penbud - Penetration Tester Buddy PENBUD is penetration testing buddy which helps you in penetration testing by making various important tools interac

Himanshu Shukla 15 Feb 1, 2022
PacketPy is an open-source solution for stress testing network devices using different testing methods

PacketPy About PacketPy is an open-source solution for stress testing network devices using different testing methods. Currently, there are only two c

null 4 Sep 22, 2022
Run ISP speed tests and save results

SpeedMon Automatically run periodic internet speed tests and save results to a variety of storage backends. Supported Backends InfluxDB v1 InfluxDB v2

Matthew Carey 9 May 8, 2022
This is a bot that can type without any assistance and have incredible speed.

BulldozerType This is a bot that can type without any assistance and have incredible speed. This bot currently only works on the site https://onlinety

null 1 Jan 3, 2022
Set your Dynaconf environment to testing when running pytest

pytest-dynaconf Set your Dynaconf environment to testing when running pytest. Installation You can install "pytest-dynaconf" via pip from PyPI: $ pip

David Baumgold 3 Mar 11, 2022
Given some test cases, this program automatically queries the oracle and tests your Cshanty compiler!

The Diviner A complement to The Oracle for compilers class. Given some test cases, this program automatically queries the oracle and tests your compil

Grant Holmes 2 Jan 29, 2022
A command-line tool and Python library and Pytest plugin for automated testing of RESTful APIs, with a simple, concise and flexible YAML-based syntax

1.0 Release See here for details about breaking changes with the upcoming 1.0 release: https://github.com/taverntesting/tavern/issues/495 Easier API t

null 909 Dec 15, 2022