Skip to main content

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

Project details


Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page