Как проверить JavaFX 2 в безголовой среде?

Я пытаюсь автоматизировать тестирование приложения JavaFX 2 на Java 7u6 со встроенным JavaFX 2.2. С этой целью я построил и интегрировал Jemmy3 и JemmyFX в мою среду сборки. Простой smoke test работает на всех соответствующих ОС.

В качестве следующего шага я хочу запустить тесты как часть процесса непрерывного развертывания. Поскольку текущий CI-сервер работает на OpenSUSE, который официально не поддерживается JavaFX, Я установил установку Ubuntu Server на виртуальной машине и установил gtk2.
Чтобы исправить отсутствие полноценной оконной системы, я попытался выполнить тесты как на Xvnc, так и на Xvfb, но безрезультатно.

В Xvnc тесты терпят неудачу с помощью

Prism ES2 Error - nInitialize: glXChooseFBConfig failed

тогда как на Xvfb они дают мне

Xlib:  extension "RANDR" missing on display ":10".

A сообщение в блоге предложило установить gtk-engines-pixbuf, чтобы облегчить вторую проблему, но это только изменило номер дисплея в сообщении об ошибке.

Теперь я вызываю знание JavaFX о StackOverflow и спрашиваю

  • Вы знаете, как решить указанные выше ошибки?
  • Вы успешно выполнили тест JavaFX 2 или взаимодействие с роботом на (безгласном) CI-сервере?
  • Как вы настроили эту систему, чтобы заставить ее работать?

Ответ 1

Поддержка (безглавых) CI-серверов для тестирования JavaFX недоступна до JavaFX 8.

Ответ основан на информации в этих записях отслеживания ошибок JavaFX:

  • JDK-8088651 "Инструмент для инструментов Headless Glass должен быть подключен к модулям Quantum и Prism"
  • JDK-8091286 "Квантум нужны безголовые и головные тесты" ).

Обновление от 8 января 2015 г.

Связанные записи отслеживания ошибок JavaFX не были реализованы для Java 8 и переназначены на Java 9.

Исходный код Java 8 в настоящее время включает в себя минимальный движок рендеринга с именем Monocle, который обеспечивает безглавую рендеринг (и рендеринг для различных других целевых платформ) для компонентов JavaFX. Я никогда не использовал Monocle и не могу предоставить подробные инструкции о том, как использовать его для безголового рендеринга. Я считаю, что использовать Monocle, вам в настоящее время необходимо выполнить пользовательскую сборку JavaFX из исходного кода (как я думаю, Monocle обычно поставляется только в встроенных версиях JavaFX, что не является стандартной версией JavaFX, которая поставляется с настольными средами Java и средами JDK),

Информация о Monocle доступна на JavaFX wiki.

Несмотря на то, что рендеринг без головок предоставляется Monocle, я не думаю, что использование Monocle для выполнения безгласного рендеринга официально поддерживается Oracle (хотя я не думаю, что обезглавленный рендеринг JavaFX в любой форме официально поддерживается, поэтому я предполагаю, что если Монокл хорошо работает для вас, обязательно используйте его).

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

Могут быть другие методы, позволяющие JavaFX запускаться в безголовой среде, о которой я не знаю.

Если вы сомневаетесь, спросите разработчиков JavaFX в рассылке openjfx-dev.

Если вы работаете под Linux, использование Xvfb, как было предложено Жаном Зарниковым, вероятно, является хорошим решением и, вероятно, предпочтительнее использовать Monocle.

Ответ 2

У меня была аналогичная проблема - запуск тестов JUnit в безголовой среде с Maven.

Мы не используем JemmyFX. У нас только очень простые тесты, которые используют правило JUnit, подобное этому: https://gist.github.com/andytill/3835914 (это требуется для кода, который использует Platform.runLater(...))

Текущая версия JavaFX (поставляется с JDK 1.7.0-21), похоже, работает в Xvfb на Ubuntu 12.04 без запуска Xserver:

  • Xvfb :99
  • DISPLAY=:99 mvn clean install