def METHOD_NAME(fixture_generator, *args, **kargs):
    # setup, to the first yield in fixture
    logging.info("-" * 20 + (" fixture %s setup starts " % fixture_generator.__name__) + "-" * 20)
    it = fixture_generator(*args, **kargs)
    try:
        res = next(it)
        logging.info("-" * 20 + (" fixture %s setup ends " % fixture_generator.__name__) + "-" * 20)
        yield res
    except Exception as detail:
        logging.exception("\n%r", detail)
        logging.info("-" * 20 + (" fixture %s setup ends " % fixture_generator.__name__) + "-" * 20)
        raise
    # teardown, fixture will raise StopIteration
    logging.info("-" * 20 + (" fixture %s teardown starts " % fixture_generator.__name__) + "-" * 20)
    try:
        next(it)
    except StopIteration:
        return
    except Exception as detail:
        logging.exception("\n%r", detail)
        raise
    finally:
        logging.info("-" * 20 + (" fixture %s teardown ends " % fixture_generator.__name__) + "-" * 20)