Skip to main content
This is a pre-production deployment of Warehouse. Changes made here affect the production instance of PyPI (pypi.python.org).
Help us improve Python packaging - Donate today!

fixtion: Test fixture function definition in Python using context manager style generators.

Project Description

A basic fixture function definition:

>>> from fixtion import fixture
>>>
>>> @fixture
... def basic_fixture():
...   print 'enter basic fixture'
...   yield
...   print 'exit basic fixture'

Decorating a test function with the basic fixture function will wrap the setup and teardown code (the stuff before and after the yield) around the test function invocation:

>>> @basic_fixture
... def test_basic():
...   print '-- A test setup with a basic fixture'
>>>
>>> test_basic()
enter basic fixture
-- A test setup with a basic fixture
exit basic fixture

Decorating unittest.TestCase test methods work, too:

>>> import unittest
>>>
>>> class Tester(unittest.TestCase):
...   @basic_fixture
...   def test_foo(self):
...     print '-- a standard unittest fixtured using fixtion'
>>>
>>> tester = Tester('test_foo')
>>> tester.test_foo()
enter basic fixture
-- a standard unittest fixtured using fixtion
exit basic fixture

Change and restore os.environ:

>>> import os
>>>
>>> @fixture
... def environ_fixture(**kwargs):
...   # Save the original environment values then update the environ.
...   original = {k: v for k, v in os.environ.iteritems() if k in kwargs}
...   os.environ.update(**kwargs)
...
...   yield
...
...   # Restore the original environment values.
...   for key in kwargs:
...     os.environ.pop(key)
...   os.environ.update(**original)
>>>
>>> @environ_fixture(foo='bar')
... def test_environ():
...   print 'foo: %r' % os.environ['foo']
>>>
>>> test_environ()
foo: 'bar'
>>>
>>> 'foo' in os.environ
False

Return some test context:

>>> @fixture
... def login_fixture():
...   class context(object):
...     username = 'ksoze'
...
...   yield context()
>>>
>>> @login_fixture
... def test_login(context):
...   print context.username
>>>
>>> test_login()
ksoze

Works with mock.patch:

>>> import random
>>> import mock
>>>
>>> @fixture
... @mock.patch('random.randint', return_value=123)
... def patched_fixture(randint):
...   yield
>>>
>>> @patched_fixture
... def test_patched():
...     print 'A random number between 1 and 10: %r' % random.randint(1, 10)
...     print 'courtesy of %r' % random.randint
>>>
>>> test_patched()
A random number between 1 and 10: 123
courtesy of <MagicMock name='randint' ...>
>>>
>>> random.randint
<bound method Random.randint of <random.Random object at ...>>

The previous os.environ example can be really simplified:

>>> @fixture
... def environ_fixture(**kwargs):
...   with mock.patch.dict('os.environ', kwargs):
...     yield
>>>
>>> @environ_fixture(foo='bar')
... def test_environ():
...   print 'foo: %r' % os.environ['foo']
>>>
>>> test_environ()
foo: 'bar'
>>>
>>> 'foo' in os.environ
False
Release History

Release History

This version
History Node

0.0.1

Supported By

WebFaction WebFaction Technical Writing Elastic Elastic Search Pingdom Pingdom Monitoring Dyn Dyn DNS Sentry Sentry Error Logging CloudAMQP CloudAMQP RabbitMQ Heroku Heroku PaaS Kabu Creative Kabu Creative UX & Design Fastly Fastly CDN DigiCert DigiCert EV Certificate Rackspace Rackspace Cloud Servers DreamHost DreamHost Log Hosting