py.test plugin for testing Python 3.5+ Tornado code
Project description
A simple pytest plugin that provides some helpful fixtures for testing Tornado (version 5.0 or newer) apps and easy handling of plain (undecoratored) native coroutine tests (Python 3.5+).
Why another Tornado pytest plugin when the excellent pytest-tornado already exists? The main reason is that I didn’t want to have to decorate every test coroutine with @pytest.mark.gen_test. This plugin doesn’t have anything like gen_test. Defining a test with async def and a name that begins with test_ is all that is required.
Installation
Install using pip, which must be run with Python 3.5+:
pip install pytest-tornasync
Usage
Define an app fixture:
import pytest
@pytest.fixture
def app():
import yourapp
return yourapp.make_app() # a tornado.web.Application
Create tests as native coroutines using Python 3.5+ async def:
async def test_app(http_server_client):
resp = await http_server_client.fetch('/')
assert resp.code == 200
# ...
Fixtures
When the plugin is installed, then pytest --fixtures will show the fixtures that are available:
- http_server_port
Port used by http_server.
- http_server
Start a tornado HTTP server that listens on all available interfaces.
You must create an app fixture, which returns the tornado.web.Application to be tested.
Raises: FixtureLookupError: tornado application fixture not found
- http_server_client
Create an asynchronous HTTP client that can fetch from http_server.
- http_client
Create an asynchronous HTTP client that can fetch from anywhere.
- io_loop
Create a new tornado.ioloop.IOLoop for each test case.
Examples
import time
import tornado.web
import tornado.gen
import pytest
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world!")
@pytest.fixture
def app():
return tornado.web.Application([(r"/", MainHandler)])
async def test_http_server_client(http_server_client):
# http_server_client fetches from the `app` fixture and takes path
resp = await http_server_client.fetch('/')
assert resp.code == 200
assert resp.body == b"Hello, world!"
async def test_http_client(http_client):
# http_client fetches from anywhere and takes full URL
resp = await http_client.fetch('http://httpbin.org/status/204')
assert resp.code == 204
async def example_coroutine(period):
await tornado.gen.sleep(period)
async def test_example():
# no fixtures needed
period = 1.0
start = time.time()
await example_coroutine(period)
elapsed = time.time() - start
assert elapsed >= period
Changes
0.5.0 (2018-05-28)
updated to work with Tornado 5, which is now the minimum required version
require pytest >= 3.0
the io_loop fixture always refers to a tornado.ioloop.IOLoop instance now
the io_loop_asyncio and io_loop_tornado fixtures have been removed, since now that Tornado 5 always uses asyncio under Python 3, there would be no difference between the two fixtures, so io_loop is all that is needed
tox tests now test more versions of Tornado (5.0.* and latest 5.*), Pytest (3.0.* and latest 3.*), and Python (3.5, 3.6, 3.7, and pypy3).
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
File details
Details for the file pytest_tornasync-0.6.0-py3-none-any.whl
.
File metadata
- Download URL: pytest_tornasync-0.6.0-py3-none-any.whl
- Upload date:
- Size: 4.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.18.4 setuptools/39.2.0 requests-toolbelt/0.8.0 tqdm/4.23.4 CPython/3.6.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 91c9273dc84d76849e22674674fbd5ff7cdcdf9b5cbe076ad9cbe88c32ff9efc |
|
MD5 | de5265690d0ea44f2ee322f01a22c38d |
|
BLAKE2b-256 | 23fa7b43b5765acb69ff66c3f4def288949306daa45cde6aa21cfd4fca36cc8e |