Title: Pytest Fixture Category: tuto Tags: python, dev I am a huge fan of python (one of the best language in my toolbox). And when it comes to tests, [pytest](http://pytest.org/) is *THE* library to use. I also use [Flask](http://flask.pocoo.org/) a lot, so today I will show you some of my snippets. First one the app fixture: ```python @pytest.fixture(autouse=True) def app(): """Load flask in testing mode""" app_test = myapp app_test.config['TESTING'] = True app_test.json_encoder = my_encoder return app_test.test_client() ``` This create an app fixture which will be used to test the application, it returns a test client to interact with my Flask application. It is an adaptation of the documentation [testing skeleton] (http://flask.pocoo.org/docs/0.10/testing/#the-testing-skeleton) I also replace the json encoder by a custom one (it allows me to dump mock object for example). ```python @pytest.yield_fixture def request_context(app): """Provide a Flask request context for testing purpose""" with app.application.test_request_context() as req_context: yield req_context ``` This one applies a request context on a testing function, this can be useful if you manipulate werzeug interactions (flask request attribute mostly). This has to be use when the `RuntimeError: working outside of application context` error is raised. In the most common use case you will not need the `req_context` variable during your test. To avoid to have an unused argument, you can simply use the `@pytest.mark.usefixtures('request_context')` decorator on your testing function. Last one is also an opportunity to talk about [peewee](http://peewee.readthedocs.org/en/latest/) which is a great lightweight ORM. Like a lot of ORM peewee provides a [transaction decorator] (http://docs.peewee-orm.com/en/latest/peewee/transactions.html) , in unittest you may want to test endpoints without connecting to a db. So, here is an example on how you can replace the decorator (or contextmanager) by a dummy one. ```python import imp import contextlib import pytest import database @pytest.fixture(autouse=True, scope='session') def mock_transaction(): """Replace the atomic decorator from peewee to a noop one""" database.atomic = contextlib.contextmanager(lambda: (yield)) imp.reload(module.using.db.transactions) ``` Pytest use a lot of the python flexibility and I must confess that I love it.