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

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

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

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

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

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

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

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

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

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


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


Ответы (4)


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

person Pavel Zorin    schedule 28.12.2012

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

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

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

driver.manage().deleteAllCookies();
person Mike Kwan    schedule 27.12.2012

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

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

person Emil Sit    schedule 27.12.2012
comment
Как упаковка synchronized поможет повысить производительность? Вы по существу заставляете его быть серийным. - person Mike Kwan; 27.12.2012
comment
Это зависит от того, находится ли причина медлительности в драйвере или в окружающем тестовом коде. Да, если проблема в WebDriver, то его наличие и синхронизация доступа к нему не сильно помогут. - person Emil Sit; 27.12.2012

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

person Igor Maznitsa    schedule 18.05.2015