Как запустить один файл функций в качестве инициализации (т.е. перед всеми другими файлами функций) в cucumber-jvm?

У меня есть файл функции огурца «A», который служит для настройки среды (очистка и инициализация данных). Я хочу, чтобы он был выполнен до того, как будут запущены все остальные файлы функций.

Это похоже на хук @before, как в http://zsoltfabok.com/blog/2012/09/cucumber-jvm-hooks/. Однако это не работает, потому что мои файлы функций 'A' содержат сотни шагов огурца, и это не так просто, как:

@Before
public void beforeScenario() {
    tomcat.start();
    tomcat.deploy("munger");
    browser = new FirefoxDriver();
}

вместо этого лучше иметь возможность запускать 'A' как файл функции в целом.

Я поискал, но не нашел ответа. Я так удивлен, что ни у кого раньше не было такого требования.

Ближайшее, что я нашел, это «фон». Но это означает, что у меня может быть только один огромный файл функций с содержанием «A» в качестве «фона» вверху, а остальная часть моего теста находится в том же файле. Я действительно не хочу этого делать.

Какие-либо предложения?


person user1559625    schedule 09.12.2016    source источник
comment
Если это инициализация, поместите ее в отдельный метод и вызовите этот метод в setup (). Или для вашего сценария вы хотите иметь его только как отдельный файл функций?   -  person Sakshi Singla    schedule 20.12.2016


Ответы (2)


По умолчанию функции Cucumber запускаются в одном потоке в следующем порядке:

  1. В алфавитном порядке по каталогу файлов функций
  2. В алфавитном порядке по имени файла функции в каталоге

Затем сценарий выполняется по порядку в файле функций.

Таким образом, ваша функция инициализации находится в первом каталоге (буквенно) с именем файла, которое сортируется первым (в алфавитном порядке) в этом каталоге.

При этом, как правило, требовать порядок выполнения в файлах функций - плохая практика. Мы запускаем наши файлы функций параллельно, поэтому порядок не имеет смысла. Для Jenkins или TeamCity вы можете добавить этап сборки, на котором выполняется один файл функций, за которым следует второй этап сборки, на котором выполняются остальные файлы функций.

person MikeJRamsey56    schedule 10.12.2016
comment
Частично это так. Однако он не является гибким, особенно если мне нужно использовать этот `` А '' несколько раз (т.е. один раз каждый раз, прежде чем я запустил некоторые другие функции проверки) - person user1559625; 21.12.2016

У меня также есть проект, в котором у нас есть один файл функций, который содержит очень длинный сценарий под названием Scenario: Test data с множеством очень длинных сценариев, например:

Given the system knows about the following employees
|uuid|user-key|name|nickname|
|1|0101140000|Anna|annie|
... hundreds of lines like this follow ... 

Мы считаем эти длинные сценарии SystemKnows весьма ценными, чтобы наши тестировщики, владелец продукта и разработчики имели представление о том, какие данные находятся в системе. Наша предметная область довольно сложна, и нам нужны базовые справочные данные, чтобы каждый мог понять тесты. (Эти справочные данные становятся почти как хорошо известные личности и являются общей метафорой команды)

Вначале мы полагались на соглашение об алфавитном именовании, чтобы функция AAA. запускалась первой.

Позже мы обнаружили, что эта установка была хрупкой, и решили использовать следующий трюк, вдохновленный паттерном PageObject:

  • Добавьте фон одной линией Given(~'^I set test data for all feature files$')

  • В определении шага укажите фабрику для создания тестовых данных и убедитесь, что внутри метода фактора она создается только один раз, например testFactory.createTestData()

Таким образом, у вас есть не только удобство выражения эталонной настройки в виде сценария, что улучшает взаимодействие в команде, но и стабильную настройку тестирования.

Надеюсь, это будет полезно! Агата

person themathmagician    schedule 15.12.2016
comment
Это как раз та проблема, с которой я столкнулся сейчас. Но как вы можете написать фабрику для создания тестовых данных, которые вы сделали с ОЧЕНЬ ДЛИННЫМ СЦЕНАРИЕМ, КОТОРЫЙ МОЖЕТ СОДЕРЖАТЬ СОТНИ СТРОК? Этот длинный сценарий создает все данные, и я поднимаю этот вопрос о стеке, чтобы спросить, как повторно использовать этот длинный сценарий. - person user1559625; 21.12.2016
comment
Скажем, этот длинный сценарий выглядит так: Учитывая, что я создаю тестовые данные «1»; И я создаю тестовые данные «2» .. Учитывая, что я создаю тестовые данные «1000». Каждый шаг похож на вызов функции java step с разными '1' '2' ... '1000'. Как можно добиться этого с помощью одного фабричного класса или метода ?! - person user1559625; 21.12.2016
comment
с помощью параметризованной функции ?? - person Sakshi Singla; 21.12.2016