Flask-AutoFixture is an extension that automatically records JSON fixtures right from the test suite by hooking into the request callbacks of your Flask application.
pip install flask-autofixture
To get started, simply wrap your Flask application under test in the setup method of your testing framework like this:
import unittest
from app import create_app
from flask.ext.autofixture import AutoFixture
autofixture = AutoFixture()
class APITestCase(unittest.TestCase):
def setUp(self):
self.app = create_app('testing')
# Register the app for recording
autofixture.init_app(self.app)
self.app_context = self.app.app_context()
self.app_context.push()
self.client = self.app.test_client()
def tearDown(self):
self.app_context.pop()Instead of passing the Flask instance directly to the AutoFixture constructor, you can use init_app to initialize Flask afterwards. If you are using a factory to create your Flask instance or want to configure the recording of your fixtures (see below), this is the recommended approach.
Then simply run your test suite. Fixtures for every request executed by the test_client will magically appear in your instance folder.
Flask-AutoFixture provides parametrized decorators to configure fixture generation on individual test methods.
To provide a descriptive name for the generated fixture, simply annotate the test method with the record decorator like so:
from app import create_app
from flask.ext.autofixture import AutoFixture
app = create_app('testing')
autofixture = AutoFixture(app)
@autofixture.record(request_name="missing_email_request",
response_name="missing_email_resonse")
def test_missing_email_returns_bad_request(self):
response = self.client.post(
url_for('api.new_user'),
data=json.dumps({'name': 'john'}))
self.assertTrue(response.status_code == 400)By default, AutoFixture will record all requests and responses automatically. If you want to record requests only in a specific set of test methods, you can disable this behaviour in the AutoFixture constructor by means of the explicit_recording argument:
from app import create_app
from flask.ext.autofixture import AutoFixture
app = create_app('testing')
autofixture = AutoFixture(app, explicit_recording=True)If explicit_recording is enabled, you must declare individual requests to be recorded using the record decorator. Alternatively, if a test methods performs multiple requests, you can apply the record_all decorator to avoid nested record decorators.
By default, the generated fixtures will be stored in your app's instance folder (1) in an autofixture directory. You can specify an alternative path and name for the generated directory in the AutoFixture constructor like so:
from flask.ext.autofixture import AutoFixture, RouteLayout
autofixture = AutoFixture(app,
fixture_dirname="mydir",
fixture_dirpath="/path/to/project",
storage_layout=RouteLayout)The generated directory is laid out according to the StorageLayout specified in the AutoFixture constructor. The default layout is RequestMethodLayout:
class RequestMethodLayout(StorageLayout):
"""This strategy lays out a :class:`Fixture` by its request method first.
Example directory structure:
/autofixture (the name of the extension)
/app (the name of the app)
/GET (the request method)
/api-posts (the request path)
response.json
/POST
/api-posts
request.json (the request payload)
response.json (the response data)
request_2.json
response_2.json
"""- Support further mime types
- Support request context manager (trigger preprocess_request)
- Get listed in the Flask extension registry