Skip to main content

Pytest Hoverfly Wrapper

This pytest plugin allows easy integration of Hoverfly into your tests. Hoverfly is a proxy server that can intercept requests and return custom responses. More info on Hoverfly: https://hoverfly.io/

Installation

Clone the repository and then install using setup.py:

python setup.py install

This will also automatically install the plugin's dependencies. Alternatively, install via pip:

pip install pytest-hoverfly-wrapper

Once installation has finished:

  1. Go to https://hoverfly.io/#download
  2. Download the correct package for your operating system
  3. Extract the hoverfly and hoverctl files and ensure that these are in your PATH.

Testing

The quickest way is to run tox:

pip install tox
tox -e <py35/py36/etc>

You can also run in pytest to make use of its debugging tools: (Assumes you have a virtual environment set up for a compatible Python version - see setup.py for compatible versions)

python setup.py install
pip install -r requirements-test.txt
pytest tests/

Usage example

Cache responses to external services

Adding the setup_hoverfly fixture will stand up a Hoverfly server instance running on port 8500. You can then use this as a proxy that saves the responses to any requests make via the proxy. If the test passes, the saved responses will be dumped to file, which will be used when the test runs again.

# Enable the fixture explicitly in your tests or conftest.py (not required when using setuptools entry points)
from pytest_hoverfly_wrapper import GeneratedSimulation
import requests
import pytest

@pytest.mark.simulated(GeneratedSimulation(file="some_file.json"))
def test_something(setup_hoverfly):
    proxy_port = setup_hoverfly[1]
    proxies = {
     "http": "http://localhost:{}".format(proxy_port),
     "https": "http://localhost:{}".format(proxy_port),
    }
    requests.get("https://urlwedontwanttospam.com", proxies=proxies)
    

After running the test for the first time, you will find a file located at ./test_data/generated/some_file.json, containing all the requests made using the proxy, as well as the responses to them. Upon running the test the second time, the test will load the file and attempt to match requests to the list in the file. If a successful match is found, the matching response will be served. If not, the request will be made to its original target and the target's response will be served instead.

Completely fake responses

You can also specify your own custom responses.

# Enable the fixture explicitly in your tests or conftest.py (not required when using setuptools entry points)
from pytest_hoverfly_wrapper import StaticSimulation
import requests
import pytest

@pytest.mark.simulated(StaticSimulation(files=["google_returns_404.json"]))
def test_something(setup_hoverfly):
    proxy_port = setup_hoverfly[1]
    proxies = {
     "http": "http://localhost:{}".format(proxy_port),
     "https": "http://localhost:{}".format(proxy_port),
    }
    r = requests.get("http://google.com", proxies=proxies)
    assert r.status_code == 404

Full code is in sample/

Hoverfly crashes

Occasionally, the Hoverfly proxy might crash mid-test. If this happens, the test will raise HoverflyCrashException, which gives you clarity of why the test failed and can be caught in your testing framework as part of some test retrying logic.

Logging

pytest-hoverfly-wrapper uses the in-built logging module for logs. To import the logger:

import logging
from pytest_hoverfly_wrapper import LOGGER_NAME
hoverfly_logger = logging.getLogger(LOGGER_NAME)

Then customise the logger as necessary.

Debugging

In all scenarios, when a response is sent by Hoverfly rather than a remote server, that response will have the Hoverfly-Cache-Served header set. This differentiates the two types of response, and helps debug situations where you think a response is being served by Hoverfly but isn't, e.g. when Hoverfly fails to match the request even though you're expecting it to.

At the end of the test, the plugin will create a network.json file containing the list of all requests made (and responses received) during the test, including parameters and headers.

Release History

  • 0.1.0
    • Initial release
  • 0.1.1
    • Updates the description in the PyPi page.
  • 0.1.2
    • Create test data directory if it doesn't exist
  • 0.1.3
    • Put the bugfix in 0.1.2 in its correct place and remove extraneous plugin.py code
  • 0.1.4
    • Fixes broken domain blocking functionality
  • 0.2.0
    • Bug fixes and command line option to pass custom parameters to Hoverfly executable command
  • 0.3.0
    • Expose Journal API for accessing journal
  • 0.3.2
    • Fixes bug where block_domains is ignored if a simulation file isn't specified in StaticSimulation
  • 0.3.3
    • Registers simulated marker used by plugin
  • 0.4.0
    • Strips Expires property from Set-Cookie headers in recorded simulations
  • 0.4.1
    • Fixes typo in installation instructions
  • 0.5.0
    • Records simulations for static simulations if they don't exist yet
  • 0.5.1
    • Clean up of code styling, docs and tests.

Meta

For all queries contact Veli Akiner: https://www.linkedin.com/in/veli-akiner-70a19b69/

Distributed under a modified MIT license. See LICENSE for more information.

https://github.com/kopernio/pytest-hoverfly-wrapper

Contributing

  1. Fork it (https://github.com/yourname/yourproject/fork)
  2. Create your feature branch (git checkout -b feature/fooBar)
  3. Commit your changes (git commit -am 'Add some fooBar')
  4. Push to the branch (git push origin feature/fooBar)
  5. Create a new Pull Request

Download files

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

Source Distribution

pytest-hoverfly-wrapper-0.5.1.tar.gz (13.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pytest_hoverfly_wrapper-0.5.1-py3-none-any.whl (12.2 kB view details)

Uploaded Python 3

File details

Details for the file pytest-hoverfly-wrapper-0.5.1.tar.gz.

File metadata

  • Download URL: pytest-hoverfly-wrapper-0.5.1.tar.gz
  • Upload date:
  • Size: 13.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.62.3 importlib-metadata/4.11.1 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.8.10

File hashes

Hashes for pytest-hoverfly-wrapper-0.5.1.tar.gz
Algorithm Hash digest
SHA256 8dddbc4b1037f26c86734812c5a7a1d470824d06b94f4aae47c4b2527ae69420
MD5 7de22506dece55d860bb90ac22b404e7
BLAKE2b-256 a7d28cf5f1d7342b7aa9812c2dc54455d32fe4da33060ceb60fbfc7ae6aa0e08

See more details on using hashes here.

File details

Details for the file pytest_hoverfly_wrapper-0.5.1-py3-none-any.whl.

File metadata

File hashes

Hashes for pytest_hoverfly_wrapper-0.5.1-py3-none-any.whl
Algorithm Hash digest
SHA256 2e5ee22bbd852a7897b37ddb4f75362c579224af2ca9b3826fc918fe07811b5d
MD5 b958e120fa9e411107b1b2bb4b4c5edd
BLAKE2b-256 027a37a5fdae294beb04229331c4e917962a0d49747826a7c40a79594670e852

See more details on using hashes here.

Release history Release notifications | RSS feed

1.0.1

2 files

1.0.0

2 files

This release

0.5.1 This release

2 files

0.5.0

1 file

0.4.1

1 file

0.4.0

1 file

0.3.3

1 file

0.3.2

1 file

0.3.1

1 file

0.3.0

1 file

0.2.0

1 file

0.1.4

2 files

0.1.3

1 file

0.1.2

1 file

0.1.1

1 file

0.1.0

1 file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page