← Back to team overview

launchpad-dev team mailing list archive

Re: Lighter tests with FakeLibrarian

 

I just ran into another difference between fixtures and context
managers while evaluating a feature request from James Westby.

On Wed, Aug 25, 2010 at 8:00 AM, Robert Collins
<robertc@xxxxxxxxxxxxxxxxx> wrote:
> On Wed, Aug 25, 2010 at 7:55 AM, Aaron Bentley <aaron@xxxxxxxxxxxxx> wrote:
>
>> I could argue that foo.__len__() is ugly if you use it directly, too.  I
>> think it is ugly to have two ways of doing the same thing.  I really do.
>>  Context managers are inevitable, so having a Fixture concept that is
>> equivalent but doesn't work the same is cognitive overhead and
>> finger-typing overhead.
>>
>> Anything that is equivalent to a context manager should actually be a
>> context manager, because that's what Python standardized on, and
>> therefore it'll be compatible with everything going forward.
>
> Oh, and I did forget something, lp:python-fixtures also defines a
> reset(), which context managers do not define, and which is useful for
> handling things like layers. Layers can be implemented on a fixture
> with __enter__, __exit__ and reset(), but not on a bare context
> manager.
>
> I do agree that if something is equivalent to a context manager,
> having it implement the contract is sensible - thats why Fixture
> implements it :).

This shows a behaviour of context managers that is undesirable for test suites:

from contextlib import contextmanager

@contextmanager
def raiser(message):
  yield
  print "cleanup", message
  raise RuntimeError(message)

with raiser("outer"):
    with raiser("inner"):
       print "test code"


:!python demo.py
test code
cleanup inner
Traceback (most recent call last):
  File "demo.py", line 11, in <module>
    print "test code"
  File "/usr/lib/python2.6/contextlib.py", line 23, in __exit__
    self.gen.next()
  File "demo.py", line 7, in raiser
    raise RuntimeError(message)
RuntimeError: inner

In a test suite we want to run all the cleanups, *and* we want to
report on all the exceptions.

-Rob



Follow ups

References