This is Part 1 in a series of blogs about various bits and pieces in the tornado-utils package.
tornado-utils
is the result of me working on numerous web apps in Tornado that after too much copy-and-paste from project to project eventually became a repo standing on its own two legs.
TestClient
This makes it possible to write integration tests that executes GET and POST requests on your app similarly to how Django does it. Example implementation:
# tests/base.py
from tornado_utils.http_test_client import TestClient, HTTPClientMixin
from tornado.testing import LogTrapTestCase, AsyncHTTPTestCase
class BaseAsyncTestCase(AsyncHTTPTestCase, LogTrapTestCase):
pass
class BaseHTTPTestCase(BaseAsyncTestCase, HTTPClientMixin):
def setUp(self):
super(BaseHTTPTestCase, self).setUp()
self.client = TestClient(self)
# tests/test_handlers.py
from .base import BaseHTTPTestCase
class HandlersTestCase(BaseHTTPTestCase):
def setUp(self):
super(HandlersTestCase, self).setUp()
self._create_user('peterbe', 'secret') # use your imagination
def test_homepage(self):
response = self.client.get('/')
self.assertEqual(response.code, 200)
self.assertTrue('stranger' in response.body)
data = {'username': 'peterbe', 'password': 'secret'}
response = self.client.post('/login/', data)
self.assertEqual(response.code, 302)
response = self.client.get('/')
self.assertEqual(response.code, 200)
self.assertTrue('stranger' not in response.body)
self.assertTrue('hi peterbe' in response.body)
You can see a sample implementation of this here
Note that this was one of the first pieces of test code I wrote in my very first Tornado app and it's not unlikely that some assumptions and approaches are naive or even wrong but what we have here works and it makes the test code very easy to read. All it basically does is wraps the http_client.fetch(...) call and also maintains a bucket of cookies
I hope it can be useful to someone new to writing tests in Tornado.
Comments