Skip to main content

A py.test plugin providing fixtures and markers to simplify testing of asynchronous tornado applications.

Project description

A py.test plugin providing fixtures and markers to simplify testing of asynchronous tornado applications.


pip install pytest-tornado


import pytest
import tornado.web

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

application = tornado.web.Application([
    (r"/", MainHandler),

def app():
    return application

def test_hello_world(http_client, base_url):
    response = yield http_client.fetch(base_url)
    assert response.code == 200

Running tests



creates an instance of the tornado.ioloop.IOLoop for each test case
get a port used by the test server
Get an absolute base url for the test server, for example http://localhost:59828. Can also be used in a test with HTTPS fixture and will then return a corresponding url, for example http://localhost:48372.
start a tornado HTTP server, you must create an app fixture, which returns the tornado.web.Application to be tested
get an asynchronous HTTP client

There is also the possibility to test applications with HTTPS. For running a server with HTTPS you need a certificate.

Get a port used by the test server.
Start a tornado HTTPS server. You must create an app fixture, which returns the tornado.web.Application to be tested, and an ssl_options fixture which returns the SSL options for the tornado.httpserver.HTTPServer.
Get an asynchronous HTTP client. In case your test uses an self-signed certificate you can set verify=False on the fetch method.

Show fixtures provided by the plugin:

py.test --fixtures


A gen_test marker lets you write a coroutine-style tests used with the tornado.gen module:

def test_tornado(http_client):
    response = yield http_client.fetch('')
    assert response.code == 200

This marker supports writing tests with async/await syntax as well:

async def test_tornado(http_client):
    response = await http_client.fetch('')
    assert response.code == 200

Marked tests will time out after 5 seconds. The timeout can be modified by setting an ASYNC_TEST_TIMEOUT environment variable, --async-test-timeout command line argument or a marker argument.

def test_tornado(http_client):
    yield http_client.fetch('')

The mark can also receive a run_sync flag, which if turned off will, instead of running the test synchronously, will add it as a coroutine and run the IOLoop (until the timeout). For instance, this allows to test things on both a client and a server at the same time.

def test_tornado(http_server, http_client):
    response = yield http_client.fetch('http://localhost:5555/my_local_server_test/')
    assert response.body == 'Run on the same IOLoop!'

Show markers provided by the plugin:

py.test --markers

Project details

Download files

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

Files for pytest-tornado, version 0.8.1
Filename, size File type Python version Upload date Hashes
Filename, size pytest_tornado-0.8.1-py2.py3-none-any.whl (9.6 kB) File type Wheel Python version py2.py3 Upload date Hashes View
Filename, size pytest-tornado-0.8.1.tar.gz (9.1 kB) File type Source Python version None Upload date Hashes View

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Huawei Huawei PSF Sponsor Microsoft Microsoft PSF Sponsor NVIDIA NVIDIA PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page