py.test plugin for testing Python 3.5+ Tornado code
Project description
================
pytest-tornasync
================
.. image:: https://travis-ci.org/eukaryote/pytest-tornasync.svg?branch=master
:target: https://travis-ci.org/eukaryote/pytest-tornasync
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.
Installation
------------
Install using pip, which must be run with Python 3.5+:
.. code-block:: sh
pip install pytest-tornasync
Usage
-----
Define an ``app`` fixture:
.. code-block:: python
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``:
.. 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 ``conftext.py`` as follows:
.. code-block:: python
import pytest
@pytest.fixture
def io_loop(io_loop_asyncio)
return io_loop_asyncio
Fixtures
--------
When the plugin is installed, then ``py.test --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_tornado
Create a new `tornado.ioloop.IOLoop` for each test case.
io_loop_asyncio
Create a new `tornado.platform.asyncio.AsyncIOLoop` for each test case.
io_loop
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.
Examples
--------
.. 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!")
@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
pytest-tornasync
================
.. image:: https://travis-ci.org/eukaryote/pytest-tornasync.svg?branch=master
:target: https://travis-ci.org/eukaryote/pytest-tornasync
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.
Installation
------------
Install using pip, which must be run with Python 3.5+:
.. code-block:: sh
pip install pytest-tornasync
Usage
-----
Define an ``app`` fixture:
.. code-block:: python
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``:
.. 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 ``conftext.py`` as follows:
.. code-block:: python
import pytest
@pytest.fixture
def io_loop(io_loop_asyncio)
return io_loop_asyncio
Fixtures
--------
When the plugin is installed, then ``py.test --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_tornado
Create a new `tornado.ioloop.IOLoop` for each test case.
io_loop_asyncio
Create a new `tornado.platform.asyncio.AsyncIOLoop` for each test case.
io_loop
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.
Examples
--------
.. 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!")
@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
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
No source distribution files available for this release.See tutorial on generating distribution archives.
Built Distribution
Close
Hashes for pytest_tornasync-0.4.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 58bf90d1cfa1223ea57177754ffc8aa45d22e9087a824d98dc9c3f0232f6e0bd |
|
MD5 | d3a65c6cc5938795528a5bd1d0f0e1e0 |
|
BLAKE2b-256 | 03b4b3e7ee42eb5f798d9c6a3bd85ed6def578d8d08ea1156e5d97fcd4013228 |