Pytest yield fixture usage

944 Views Asked by At

I have a use case where I may use fixture multiple times inside a test in a "context manager" way. See example code below:

in conftest.py

class SomeYield(object):
    def __enter__(self):
        log.info("SomeYield.__enter__")

    def __exit__(self, exc_type, exc_val, exc_tb):
        log.info("SomeYield.__exit__")


def generate_name():
    name = "{current_time}-{uuid}".format(
        current_time=datetime.now().strftime("%Y-%m-%d-%H-%M-%S"),
        uuid=str(uuid.uuid4())[:4]
    )
    return name


@pytest.yield_fixture
def some_yield():
    name = generate_name()
    log.info("Start: {}".format(name))
    yield SomeYield()
    log.info("End: {}".format(name))

in test_some_yield.py

def test_some_yield(some_yield):
    with some_yield:
        pass

    with some_yield:
        pass

Console output:

INFO:conftest:Start: 2017-12-06-01-50-32-5213
INFO:conftest:SomeYield.__enter__
INFO:conftest:SomeYield.__exit__
INFO:conftest:SomeYield.__enter__
INFO:conftest:SomeYield.__exit__
INFO:conftest:End: 2017-12-06-01-50-32-5213

Questions:

  1. If I have some setup code in SomeYield.enter and cleanup code in SomeYield.exit, is this the right way to do it using fixture for multiple calls in my test?
  2. Why didn't I see three occurrences of enter and exit? Is this expected?
0

There are 0 best solutions below