Skip to main content
This is a pre-production deployment of Warehouse. Changes made here affect the production instance of PyPI (
Help us improve Python packaging - Donate today!

py.test plugin for testing Python 3.5+ Tornado code

Project Description


.. image::

A simple pytest plugin that provides some helpful fixtures for testing
Tornado 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`` is all that is required.


Install using pip, which must be run with Python 3.5+:

.. code-block:: sh

pip install pytest-tornasync


Define an ``app`` fixture:

.. code-block:: python

import pytest

def app():
import yourapp
return yourapp.make_app() # a tornado.web.Application

Create tests as native coroutines using Python 3.5+ ``async def``:

.. code-block:: python

async def test_app(http_server_client):
resp = await http_server_client.fetch('/')
assert resp.code == 200
# ...

If you want to use the Tornado 3.2+ ``asyncio`` event loop, redefine the
``io_loop`` fixture in your ```` as follows:

.. code-block:: python

import pytest

def io_loop(io_loop_asyncio)
return io_loop_asyncio


When the plugin is installed, then ``py.test --fixtures`` will show
the fixtures that are available::

Port used by `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.

FixtureLookupError: tornado application fixture not found
Create an asynchronous HTTP client that can fetch from `http_server`.
Create an asynchronous HTTP client that can fetch from anywhere.
Create a new `tornado.ioloop.IOLoop` for each test case.
Create a new `tornado.platform.asyncio.AsyncIOLoop` for each test case.
Alias for `io_loop_tornado`, by default.

You may define an `io_loop` that uses the `io_loop_asyncio` fixture to
use an asyncio-backed Tornado event loop.


.. code-block:: python

import time

import tornado.web
import tornado.gen

import pytest

class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world!")

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('')
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

Release History

This version
History Node


History Node


History Node


Download Files

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

Filename, Size & Hash SHA256 Hash Help File Type Python Version Upload Date
(7.3 kB) Copy SHA256 Hash SHA256
Wheel py3 Aug 25, 2016

Supported By

Elastic Elastic Search Pingdom Pingdom Monitoring Dyn Dyn DNS Sentry Sentry Error Logging CloudAMQP CloudAMQP RabbitMQ Heroku Heroku PaaS Kabu Creative Kabu Creative UX & Design Fastly Fastly CDN DigiCert DigiCert EV Certificate Google Google Cloud Servers