pytest-bdd: как получить текущий сценарий от @given?

Мне нужно получить имя сценария или другую уникальную информацию о текущем выполняемом тесте в @данном методе.

В моем тесте я заявляю, что у меня есть какой-то ресурс. Этот ресурс извлекается / создается из веб-api, как это:

@given('I have a new article')
def new_article(vcr_fixture):
    with vcr_fixture.use_cassette('new_article'):  # I need to use different cassette name for different scenarios 
        return create_new_article()

Проблема в том, что у меня может быть несколько сценариев с разными параметрами, и я хотел бы использовать один и тот же ресурс несколько раз. В этом случае мне нужны разные кассеты для каждого случая. И я не могу использовать эти параметры для различения между кассетами, так как они могут быть применены после создания ресурса (например, добавление комментариев).
Я попытался добавить запрос к @ given fixture, но не смог найти в нем никакой уникальной информации.

2 ответа

  1. Для проверки имени сценария можно использовать средства синтаксического анализа.

    from pytest_bdd import parsers
    ...
    
    @given(parsers.parse('I have a {article_name}')
    def new_article(vcr_fixture, article_name):
        with vcr_fixture.use_cassette(article_name):        
            return create_new_article()
    

    Не уверен, если это, если это отвечает на ваш вопрос, хотя..

  2. хотя то, что предложил user2292262, работает, это работает не так, как можно было бы ожидать, когда начинаешь изучать pytest-bdd (по крайней мере, то, что я ожидал).

    Решение AIUI заключается в создании приспособления для каждой статьи, которую вы имеете среди ваших тестов, без автоматизации (т. е. функции, которая создает для вас данные, которые вам нужны динамически).

    Это в контексте тестирования должно быть разумно выполнимо, так как набор данных, который у вас есть, не является реальным, но подмножество и данные, которые у вас есть в качестве предварительных вопросов (данные глаголы), должны быть еще меньше.
    Вы можете подумать о заполнении светильников скриптом, если это выходит из-под контроля, запросив БД и написав шаблонный файл соответственно.

    @given(parsers.parse('I have an article called foo')
    def article_foo(vcr_fixture):
        with vcr_fixture.use_cassette('foo'):
             return create_new_article()
    
    @given(parsers.parse('I have an article called bar')
    def article_bar(vcr_fixture):
        with vcr_fixture.use_cassette('bar'):
             return create_new_article()
    
    
    etc.
    

    Проблема в «фабричном» коде другого решения

    @given(parsers.parse('I have a {article_name}')
    def new_article(vcr_fixture, article_name):
        with vcr_fixture.use_cassette(article_name):        
             return create_new_article()
    

    это то, что вы все еще испытываете искушение использовать его как

    Given I have an article called Foo
    And I have an article called Bar
    When I edit Foo
    Then Bar is untouched
    

    но этот сценарий не будет работать, потому что под шторами вы на самом деле используете один и тот же светильник дважды, но с различным «содержанием»

    Другими словами, с этим кодом кто-то будет «new_article» для двух экземпляров «данных». Это идет против того, что pytest любит.

    Кроме того, с пуристской точки зрения, данные глаголы в BDD должны быть фактами, а не вещами, которые создают факты.