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