我正在编写@ pytest.fixture,我需要一种方法来访问使用夹具的测试用例的名称信息。

我刚刚找到了一篇涉及以下主题的文章:http://programeveryday.com/post/pytest-creating-and-using-fixtures-for-streamlined-testing/-谢谢Dan!

import pytest


@pytest.fixture(scope='session')
def my_fixture(request):
    print request.function.__name__
    # I like the module name, too!
    # request.module.__name__
    yield


def test_name(my_fixture):
    assert False


问题是它不适用于会话范围:
E AttributeError: function not available in session-scoped context

最佳答案

我认为没有会话范围的固定装置是没有意义的,因为@placebo_session(来自here)是每个函数调用都起作用的。所以我建议简单地这样做:

@pytest.fixture(scope='function')
def placebo_session(request):
    session_kwargs = {
        'region_name': os.environ.get('AWS_DEFAULT_REGION', 'us-east-1')
    }
    profile_name = os.environ.get('PLACEBO_PROFILE', None)
    if profile_name:
        session_kwargs['profile_name'] = profile_name

    session = boto3.Session(**session_kwargs)

    prefix = request.function.__name__

    base_dir = os.environ.get(
        "PLACEBO_DIR", os.path.join(os.getcwd(), "placebo"))
    record_dir = os.path.join(base_dir, prefix)

    if not os.path.exists(record_dir):
        os.makedirs(record_dir)

    pill = placebo.attach(session, data_path=record_dir)

    if os.environ.get('PLACEBO_MODE') == 'record':
        pill.record()
    else:
        pill.playback()

    return session


但是,如果您仍然希望每个会话和每个测试用例都要做某事,则可以拆分为两个固定装置(然后使用func_session固定装置)。

@pytest.fixture(scope='session')
def session_fixture():
  # do something one per session
  yield someobj

@pytest.fixture(scope='function')
def func_session(session_fixture, request):
  # do something with object created in session_fixture and
  # request.function
  yield some_val

关于python - 在@ pytest.fixture中访问测试用例名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40139956/

10-14 00:58