Как запустить один файл объектов в качестве инициализации (т.е. перед всеми другими файлами объектов) в cucumber-jvm?
У меня есть файл функций огурца "А", который служит для настройки среды (очистка данных и инициализация). Я хочу, чтобы он был выполнен до того, как все остальные файлы функций смогут работать.
Это похоже на @before hook, как в http://zsoltfabok.com/blog/2012/09/cucumber-jvm-hooks/. Однако, это не работает, потому что мои файлы объектов 'A' содержат сотни шагов огурца, и это не так просто, как:
@Before
public void beforeScenario() {
tomcat.start();
tomcat.deploy("munger");
browser = new FirefoxDriver();
}
вместо этого лучше иметь возможность запускать "A" как файл объектов в целом.
Я искал вокруг, но не нашел ответа. Я так удивлен, что никто не имел такого требования раньше.
Самым близким, что я нашел, является "фон". Но это означает, что у меня может быть только один огромный функциональный файл с содержимым "A" в качестве "фона" вверху, а остальная часть моего теста - в том же файле. Я действительно не хочу этого делать.
Какие-либо предложения?
2 ответа
По умолчанию функции Cucumber запускаются в одном потоке в следующем порядке:
- В алфавитном порядке по каталогу файлов объектов
- В алфавитном порядке по имени файла объекта в каталоге
Выполнение сценария выполняется по порядку в файле объектов.
Так что имейте свою функцию инициализации в первом каталоге (по алфавиту) с именем файла, который сортирует первым (по алфавиту) в этом каталоге.
При этом, как правило, плохая практика требовать порядка выполнения в ваших файлах объектов. Мы запускаем наши файлы функций параллельно, поэтому порядок не имеет смысла. Для Jenkins или TeamCity вы можете добавить шаг сборки, который выполняет один файл объектов, а затем второй шаг сборки, который выполняет остальные файлы объектов.
У меня также есть проект, где у нас есть один файл функций, который содержит очень длинный сценарий 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.feature запускался первым.
Позже мы обнаружили, что эта установка хрупкая, и решили использовать следующий прием, основанный на шаблоне PageObject:
Добавить фон одной строкой
Given(~'^I set test data for all feature files$')
В определении шага создайте фабрику для создания тестовых данных и убедитесь, что внутри метода factore он создается только один раз, например
testFactory.createTestData()
Таким образом, вы имеете удобство в выражении настройки эталона как сценария, который улучшает командную коммуникацию, но у вас также есть стабильная настройка теста.
Надеюсь, что это полезно! Agata