Безголовое тестирование с JavaFx и TestFx
У меня есть простое приложение JavaFx (Java 8), которое имеет модульный тест с использованием TestFx. Однако, когда тест выполняется, окно приложения запускается, и мышь перемещают, чтобы выполнить любое действие в моем тесте. Могут ли эти тесты быть выполнены таким образом, чтобы приложение не появлялось, и я все еще могу использовать свою мышь для других целей, когда выполняется автоматическая сборка и тесты?
3 ответа
Обновить:
Я нашел этот пост в блоге, который дает мне решение этой проблемы. Как предполагает автор, вам нужно добавить следующую зависимость в вашу сборку:
testRuntime 'org.testfx:openjfx-monocle:1.8.0_20'
Тогда вам нужно будет включить следующее где-то, прежде чем позвонить registerPrimaryStage()
в моем случае в методе, отмеченном @BeforeClass
как я использую JUnit:
System.setProperty("testfx.robot", "glass");
System.setProperty("testfx.headless", "true");
System.setProperty("prism.order", "sw");
System.setProperty("prism.text", "t2k");
Я бы также добавил, что полезно включить System.setProperty("java.awt.headless", "true")
чтобы убедиться, что вы не полагаетесь ни на что из AWT (в моем случае мне позвонили, чтобы узнать размер экрана, который вызывал проблемы). Я также последовал совету автора блога, чтобы добавить переключатель для включения и выключения безголового режима. Это дает окончательный метод следующим образом:
@BeforeClass
public static void setupSpec() throws Exception {
if (Boolean.getBoolean("headless")) {
System.setProperty("testfx.robot", "glass");
System.setProperty("testfx.headless", "true");
System.setProperty("prism.order", "sw");
System.setProperty("prism.text", "t2k");
System.setProperty("java.awt.headless", "true");
}
registerPrimaryStage();
}
Вы можете увидеть решение в контексте здесь
Оригинальный ответ:
Если вы используете Linux, вы можете использовать xvfb для этого. В системе на основе Debian вы можете установить xvfb следующим образом:
$ sudo apt-get install xvfb
С установленным xvfb выполните следующие тесты перед запуском тестов:
$ Xvfb :99 &>/dev/null &
$ export DISPLAY=:99
Если вы запускаете свои тесты в той же консоли, TestFX будет использовать буфер кадров вместо вашего основного дисплея. Таким образом, тесты будут выполняться, но вы не будете беспокоиться об открытии окон и перемещении указателя мыши.
Я бы согласился с KDK за использование Monocle, так как он отлично сочетается с Jenkins. Я не мог получить надежный результат от Xvfb на Дженкинс. Ниже приведены шаги, которые я предпринял и работает для меня.
Приготовить монокль
Вы хотите скачать Monocle из Monocle Github. Похоже, что есть изменения API, так что вы хотите отредактировать MonocleView.java с добавлением метода ниже после загрузки. Я не уверен, что я должен поместить в метод, но обнаружил, что он просто работает без его реализации.
@Override
protected int _getNativeFrameBuffer(long ptr) {
// TODO Auto-generated method stub
return 0;
}
Установить монокль
Создайте банку Monocle и поместите банку в вашу JRE (по пути jre/lib/ext)
Run Monocle со стеклом lib
Ниже моя команда maven, используемая в jenkins, вас заинтересует часть параметров времени выполнения Java.
$ mvn clean install -Dtestfx.robot=glass -Dglass.platform=Monocle -Dmonocle.platform=Headless -Dprism.order=sw
Да, можно выполнять тестирование приложений JavaFx2 без головы. Вам понадобится Monocle(часть OpenJFX). Более подробная информация здесь: https://github.com/TestFX/Monocle