вести себя: как организовать файлы этого фреймворка в не игрушечном проекте

Я пытаюсь охватить проект тестами BDD, используя структуру поведения, python. Проблема в том, что все материалы BDD на ненастоящих, игрушечных примерах. Мой проект довольно большой, и у меня возникли следующие проблемы

  1. В разных файлах .feature у меня одинаковые имена шагов, но их реализация должна быть разной. Пример: название шага «Введите код и нажмите кнопку отправки» может использоваться на многих разных страницах сайта. Как решить эту коллизию?
  2. Если у вас есть сложные веб-страницы в стадии тестирования, файлы реализации шага быстро растут. После нескольких файлов .feature файл шага содержит более 400 строк кода. Разделять файлы шагов в соответствии с файлами .feature (1-к-1) не является решением, потому что некоторые шаги должны быть разделены между файлами .feature, и становится неочевидным, как найти конкретный шаг. Есть ли возможность разделить пошаговые реализации по уровням (уровень функций, уровень каталога с несколькими функциями, уровень всего проекта...)

person Andrey Glazkov    schedule 21.08.2018    source источник


Ответы (1)


Итак, у вас есть 2 проблемы, и я попытаюсь решить их обе:

Проблема 1:

Хорошо иметь одинаковые, дословные Given/When/Then во многих ваших файлах функций; то, как вы реализуете их в своих определениях шагов, имеет значение. Есть два пути, которые я бы рассмотрел: (1) использование параметров шага ; (2) используя объект context шага, чтобы указать, какой файл функций или сценарий вы используете. Что касается (2), рассмотрите возможность настройки сценария следующим образом:

Feature: Buying toys    

    @checkout_page
    Scenario: Proceed to checkout page
        Given Toys are in the shopping cart
        When I enter code and click submit button   <--- Same step
        Then the items will be checked out

    @purchase_page
    Scenario: Proceed to purchase page
        Given Toys are in the shopping cart
        When I enter code and click submit button   <--- Same step
        Then the items will be purchased 

Отсюда вы можете использовать объект context поведения, чтобы сохранить тег и использовать его в своей реализации шага:

В окружении.py:

def before_scenario(context, scenario):
    context.current_scenario_tags = scenario.tags # This is a list
    # ... other stuff maybe

Поэтапная реализация:

@When("I enter code and click submit button")
def step_impl(context):
    # Assuming that the logic to enter the code and set up the clicking action
    # is identical in most regards, you should pull it out of the following for loop
    # and place it here. This may help shorten your step implementations.
    # vvvvvvvvvvvvvvvvvvvvv
    #         HERE
    # ^^^^^^^^^^^^^^^^^^^^^
    for tag in context.current_scenario_tags:
        if tag == "checkout_page":
            # Then handle the checkout_page scenario
            break
        elif tag == "purchase_page":
            # Then handle the purchase_page scenario
            break

*В зависимости от того, какие теги вы уже используете, вы можете просто выполнить break операторов, а не перебирать остальные теги в цикле, предполагая, что вы уже знаете конкретные теги, которые ищете.

Это не решает вашу проблему реализации шага длиной в 400 строк, но, как говорится, «вы не можете съесть свой пирог и съесть его».

Проблема 2:

Это было рассмотрено выше, но вот несколько вещей о поведении и о том, как он ищет файлы функций и файлы шагов, из документации:

поведение работает с тремя типами файлов:

  1. функциональные файлы, написанные вашим бизнес-аналитиком / спонсором / кем-либо с вашими сценариями поведения в нем, и
  2. каталог «steps» с реализациями шагов Python для сценариев.
  3. опционально некоторые элементы управления окружающей средой (код для запуска до и после шагов, сценариев, функций или всего матча стрельбы).

Поэтому требуется каталог feature/, как и подкаталог feature/steps/. Ответ — нет, поведение не позволяет вам создавать категориальные папки или подкаталоги в каталоге feature/steps/. Имейте в виду, что при поиске реализации шага, связанного с шагом в файле функций, поведение ищет все файлы Python в каталоге feature/steps/, но не рекурсивно в подкаталогах каталога. Наличие хорошего соглашения об именах определенно может иметь большое значение здесь!

person natn2323    schedule 22.08.2018