Безголовое тестирование с 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

Другие вопросы по тегам