Итак, у меня есть пара JUnit классов, каждый из которых содержит список тестовых методов. Каждый метод независим друг от друга, прямой связи нет. Но у нас непрямая связь: все методы обрабатывают один объект singleton (это Selenium Web Driver Instance, да, я использую 1 Web Driver Instance для всех своих тестов, потому что на создание нового экземпляра объекта мы тратим очень много времени! ).
И все нормально, когда тестовые методы выполняются пошагово в одном потоке. Но это слишком долго,
Итак, я решил увеличить скорость, как? - Я решил запустить все тестовые методы в параллельном режиме. Для этого я использую maven со специальной конфигурацией для параллельного выполнения тестов.
Но я думаю, что это источник новой проблемы, потому что - в результате у нас есть параллельное выполнение методов, но мы по-прежнему работаем только с одним экземпляром веб-драйвера.
Я пытаюсь найти оптимальное решение:
Я хочу, чтобы тесты выполнялись в параллельном режиме - это действительно быстро.
Я не хочу, чтобы для каждого теста создавался новый объект - это очень долгий процесс.
Какой совет вы можете мне дать?
Как бы вы решили эту проблему?
Ответ 2 · рейтинг 3 · Mike Kwan
Вокруг этого нет альтернативы. Если тесты выполняются параллельно, вы не можете использовать один экземпляр WebDriver, вы должны создать один экземпляр WebDriver для каждого тестового примера.
Один из способов получить ускорение путем последовательного запуска тестов - это повторно использовать объект WebDriver, потому что запуск WebDriver обычно занимает много времени. Другой распространенной оптимизацией является повторное использование FirefoxProfile, если используется FirefoxDriver, потому что создание профиля также происходит медленно.
Если вы решите повторно использовать объект WebDriver, убедитесь, что вы пытаетесь как можно лучше очистить экземпляр в tearDown. Например, очистив куки:
driver.manage().deleteAllCookies();
Ответ 3 · Emil Sit
В зависимости от того, где в ваших тестах находятся фактические узкие места производительности, вы можете сделать что-то грубое, например, добавить оболочку synchronized вокруг вашего драйвера, чтобы у вас все еще была только одна, но весь доступ к ней был сериализован.
Вы могли бы потенциально изменить свой тест, чтобы иметь ссылку ThreadLocal на драйвер, чтобы у вас был один драйвер на поток.