skip to navigation
skip to content

pytest-tornasync 0.4.0

py.test plugin for testing Python 3.5+ Tornado code


.. 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  
File Type Py Version Uploaded on Size
pytest_tornasync-0.4.0-py3-none-any.whl (md5) Python Wheel py3 2016-08-25 7KB