2017-01-18 12 views
3

Мое положение в целом: Я хочу выполнить параллельные тесты. Допустим, у меня есть 4 пары учетных данных и 32 теста, которые будут выполняться в 8 параллельных потоках (на уровне параллельных методов). Поэтому у меня стандартная ситуация с производителем-потребителем, но между параллельными испытаниями.TestNG проверяет синхронизацию на внешнем объекте

Моя идея состоит в том, чтобы иметь список объектов учетных данных (на которых я буду синхронизировать тестовые потоки в фазе «beforeMethod»). Первые 4 потока получат свои учетные данные и удаляют их из списка. Все остальные потоки будут видеть пустой список и ждать его.

Первый тест, который завершит выполнение, и добавит используемые учетные данные обратно в список на этапе «afterMethod» и вызовет уведомление в этом списке и т. Д. Но проблема в том, что у меня нет подходящего места, где я могу найти этот список учетных данных. + Я хочу использовать простой «тест mvn» для запуска этого процесса. Любые идеи, как я могу добавить такую ​​синхронизацию? Если в TestNG есть аналогичная функциональность, расскажите.

+0

Интересно. Было бы здорово видеть ваши попытки. –

+1

Почему бы вам просто не ограничить количество потоков? Почему вы не можете заполнить эту учетную запись (список) в инициализаторе класса 'static'? –

+0

@ Ярослав Ставничий Ваша идея помогает мне много. благодаря –

ответ

0

Решено. Основная проблема заключалась в том, чтобы переопределить жизненный цикл TestNG + сохранить управление тестированием maven. Так что я начал копать TestNG исходный код и пришел к следующему решению:

  1. Продлить IExecutionListener, который будет хранить необходимые данные (очереди) в качестве публичного статического конечного элемента.
  2. Тот же интерфейс IExecutionListener участвует в жизненном цикле TestNG: он имеет обратные вызовы жизненного цикла onExecutionStart и onExecutionFinish. Первый из них использовался для заполнения очереди учетными данными из файла, а второй - для облегчения работы GC - очистка этой очереди.
  3. Запущенная очередь использовалась внутри метода init, аннотированная с помощью метода @BeforeMethod. Примечание. Не сохраняйте значение из очереди как простой элемент, так как вы столкнетесь с переписыванием этого элемента из разных потоков, которые выполняют тесты из одного и того же класса, но с разными тестами. Используйте ThreadLocal для обеспечения изоляции потоков этой переменной.
  4. Специальная структура данных, которая служит хорошим для моего случая, - BlockingQueue (в реализации LinkedBlockingQueue) с помощью take и put as getter/setter.
  5. Также не забудьте добавить свой пользовательский прослушиватель в xml

 Смежные вопросы

  • Нет связанных вопросов^_^