Сначала позвольте мне описать структуру моих тестов:
- Существует BaseTest (Singleton), содержащий
setUp()
метод, который запускает @BeforeSuite
.Этот метод setUp () инициализирует MyObject , который объявлен как:
protected static ThreadLocal<MyObject> myObject= new ThreadLocal<MyObject>();
Так что в идеале этот метод setUp () должен выполняться перед любым другим тестом.И он запускается только один раз .
Я пытаюсь запустить тестовые примеры параллельно в среде TestNG.Для этого я установил атрибут параллели в теге suite
файла testng.xml как
<suite name="Suite" parallel="classes" thread-count="5">
Теперь, через несколько секунд после запуска сборки, сборка получаетне удалось, все основные тесты не пройдены, а другие пропущены.
Неудачный тест из-за java.lang.NullPointerException
Насколько я понимаю, пока метод setUp () выполняется в потоке, некоторые другие тестыв разных потоках пытаются получить доступ к MyObject, который еще не инициализирован.Как и провал.Верно ли мое понимание?
Если да, что может быть возможным решением этой проблемы?
Могу ли я сделать что-то вроде - пусть сначала запустится поток, в котором выполняется setUp (), и до тех пор не позволяйте другим потокам вызываться.И как только вызов setUp () завершится / вернется, разрешите другим потокам вызывать.
( Примечание: Мой проект использует Maven)