Тестирование нескольких компонентов JavaFX с использованием JemmyFX
Я работаю над довольно крупным проектом, который включает в себя набор пользовательских компонентов JavaFX. Для каждого пользовательского компонента, который предполагается использовать повторно, я начал писать набор автоматических тестов с использованием JemmyFX и JUnit. Во время разработки я запускаю их из Eclipse Juno.
Выполнение всего набора тестов за один раз оказалось трудным. Кажется, проблема связана с тем фактом, что, поскольку я хочу протестировать несколько компонентов, в идеале я бы запустил разные приложения для каждого (чтобы тесты, выполняемые на одном компоненте, не влияли на другие тесты).
Я создал базовый класс, который делает следующее:
@BeforeClass public static void beforeClass () { Поток t = новый поток ("Начальный поток JavaFX") { @Override public void run() { Application.launch(UITester.class, new String[0]); } }; t.setDaemon(истина); t.start(); }
Используя этот базовый класс, я создал отдельный класс с @Test
тесты для каждого пользовательского элемента управления. Когда я запускаю этот набор тестов, первый тестовый пример работает нормально, но остальные терпят неудачу:
Исключение в потоке "Поток инициализации JavaFX" java.lang.IllegalStateException: запуск приложения не должен вызываться более одного раза
Я пробовал следующие способы решения этой проблемы:
Закройте приложение
Я добавил следующее в базовый класс:
@После школы public static void afterClass() { Platform.exit(); }
Та же проблема сохраняется. Возможно, потому что виртуальная машина не перезапускается между тестами?
Поставьте предохранитель от перезапуска приложения
Я вставил статическую переменную, чтобы проверить, возможно, приложение уже запущено. Это устраняет проблему, когда я запускаю тесты из Eclipse. Когда я запускаю их из командной строки, проблема все еще существует. Не подходит, когда мы пытаемся запустить эти тесты на сервере интеграции.
Поймать исключение IllegalStateException
Это странный. Я могу поймать исключение, и большинство моих проблем исчезают, за исключением того факта, что каждые 4 или 5 запусков всего набора тестов Ubuntu вылетает в оболочку, и мне приходится снова входить в систему.
Итак, как мне лучше написать тесты для большого набора пользовательских элементов управления? Мой подход неверен?
1 ответ
Посмотрев на источник MarvinFX, я смог реализовать наш тестовый фреймворк таким образом, чтобы решить мои проблемы. Похоже, что больше всего помогло решить эту проблему, это перестроить сцену и сцену для каждого теста, как показано в этом (псевдо) коде:
@Before
public void before() {
Node node = generateComponentToTest();
Parent parent = StackPaneBuilder.create().children(node).build();
Scene scene = SceneBuilder.create().root(parent).build();
if (this.currentStage != null) {
this.currentStage.close();
}
Stage stage = new Stage();
stage.setScene(scene);
stage.centerOnScreen();
stage.show();
this.currentStage = stage;
}