Skip to main content

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 notifications | RSS feed

This release

0.0.1 This release

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page