Jbehave поддерживает глобальные данные между историями - для порядка зависимости/выполнения

Проблема: Перед запуском A.story и B.story необходимо запустить и завершить Procondition.story, поскольку Precondition.story вставляет данные в базу данных, которые затем используются A.sotry и B.story.

Я знаю несколько подходов для установки этой зависимости, но они неприменимы в данном контексте.

  1. Аннотация «Givenstory» не очень помогает, потому что в этом случае Precondition.story будет запускаться дважды, первый раз для A.story и второй раз для B.story, что приводит к сбою Precondition.story во второй раз, говоря данные, которые он пытается вставить в база данных уже существует.

  2. Использование отказоустойчивого плагина Maven Это, безусловно, поместит Precondition.story на первое место в списке выполнения, но все эти истории выполняются в многопоточной среде, где есть 8 потоков, готовых захватывать истории для одновременного запуска. Поток 1 берет Precondition.story, но пока эта история еще не завершена, A.story и B.story начинаются потоками 2 и 3, что приводит к сбою A.story и B.story.

  3. Укажите порядок историй, переопределяющий storyPath(): не работает из-за той же проблемы, что и в пункте 2 выше.

Возможное решение: Как насчет сохранения состояния Precondition.story, скажем, в логической переменной preconditionCompleted. Когда Precondition.story завершается, для preconditionCompleted устанавливается значение true. Затем добавьте шаг в A.story и B.story в начале, который выполняет опрос preconditionCompleted каждую секунду, пока он не станет истинным, а затем выполняет остальную часть истории.

Для этого мне нужно знать, где мы можем объявить такие глобальные переменные для использования в историях?


person Kaizar Laxmidhar    schedule 01.05.2015    source источник
comment
Как насчет статической переменной где-то?   -  person Kristof    schedule 03.05.2015
comment
@Kristof да, это один из вариантов, я сейчас тестирую это, используя статическую переменную. Меня немного беспокоит охрана состояния, даже если оно синхронизировано.   -  person Kaizar Laxmidhar    schedule 05.05.2015
comment
Соглашаться. Мне нужно было что-то подобное раньше. Для передачи нескольких параметров между шагами/сценариями я реализовал одноэлементный класс с синхронизированными картами в нем (scenarioParams, storyParams), чтобы я мог передавать через них переменные. Я очистил scriptParams в @AfterScenario и storyParams в @AfterStory, чтобы они не влияли на другие сценарии/истории. Вы можете сделать что-то подобное с globalParams, конечно, вам вообще не нужно их очищать. Хорошо, если синхронизированная карта сделает синхронизацию за вас.   -  person Kristof    schedule 06.05.2015


Ответы (1)


вы можете использовать класс Singleton, который будет содержать некоторый объект. Этот объект можно заблокировать в методе @BeforeStory Precondition.story и освободить в @afterStory. Затем в историях A и B в методах @BeforeStory вы можете дождаться освобождения этого объекта, а затем выполнить их.

Другой способ, который я могу придумать, - это сделать аннотацию пользовательского заказа, но тогда вам нужно создать логику для ее обработки.

person Tony    schedule 06.05.2015