Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Юнит. Параллельный бег. Но все методы тестирования обрабатывают экземпляр singleton. Как решить?

Автор вопроса: user471011Ответов: 4

Итак, у меня есть пара JUnit классов, каждый из которых содержит список тестовых методов. Каждый метод независим друг от друга, прямой связи нет. Но у нас непрямая связь: все методы обрабатывают один объект singleton (это Selenium Web Driver Instance, да, я использую 1 Web Driver Instance для всех своих тестов, потому что на создание нового экземпляра объекта мы тратим очень много времени! ).

И все нормально, когда тестовые методы выполняются пошагово в одном потоке. Но это слишком долго,

Итак, я решил увеличить скорость, как? - Я решил запустить все тестовые методы в параллельном режиме. Для этого я использую maven со специальной конфигурацией для параллельного выполнения тестов.

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

Я пытаюсь найти оптимальное решение:

Я хочу, чтобы тесты выполнялись в параллельном режиме - это действительно быстро.

Я не хочу, чтобы для каждого теста создавался новый объект - это очень долгий процесс.

Какой совет вы можете мне дать?

Как бы вы решили эту проблему?

  • Сколько у вас тестов? Emil Sit 27.12.2012
  • возможно, это все еще быстро, даже с учетом стоимости создания нового драйвера для каждого потока (не для каждого теста) radai 27.12.2012
  • На данный момент у меня есть 2 тестовых класса, каждый из которых содержит 5-7 тестовых методов. user471011 27.12.2012

javaseleniumjunitwebdriverparallel-processing

Ответы

Ответ 1 · рейтинг 3 · Pavel Zorin

К сожалению, webDriver не является потокобезопасным. Имхо, лучше всего запускать каждый тестовый класс с использованием отдельного экземпляра webDriver в отдельном потоке. Оптимальное количество потоков int threadNum = Runtime.getRuntime().availableProcessors() * 2; Время выполнения моих проектов сократилось с 30 минут до 4. Точно такой же метод используется во фреймворке Thucydides.

Ответ 2 · рейтинг 3 · Mike Kwan

Вокруг этого нет альтернативы. Если тесты выполняются параллельно, вы не можете использовать один экземпляр WebDriver, вы должны создать один экземпляр WebDriver для каждого тестового примера.

Один из способов получить ускорение путем последовательного запуска тестов - это повторно использовать объект WebDriver, потому что запуск WebDriver обычно занимает много времени. Другой распространенной оптимизацией является повторное использование FirefoxProfile, если используется FirefoxDriver, потому что создание профиля также происходит медленно.

Если вы решите повторно использовать объект WebDriver, убедитесь, что вы пытаетесь как можно лучше очистить экземпляр в tearDown. Например, очистив куки:

driver.manage().deleteAllCookies();

Ответ 3 · Emil Sit

В зависимости от того, где в ваших тестах находятся фактические узкие места производительности, вы можете сделать что-то грубое, например, добавить оболочку synchronized вокруг вашего драйвера, чтобы у вас все еще была только одна, но весь доступ к ней был сериализован.

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

Ответ 4 · Igor Maznitsa

Плагин Jute maven обеспечивает изоляцию тестовых методов JUnit(!) посредством их запуска как внешних процессов JVM, также вы можете определить конкретную JRE для тестов

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы