Безголовое тестирование с JavaFx и TestFx

У меня есть простое приложение JavaFx (Java 8), в котором есть модульный тест с использованием TestFx. Однако, когда тест запущен, окно приложения запускается, и мышь перемещается, чтобы выполнить любое действие в моем тесте. Можно ли запустить эти тесты таким образом, чтобы приложение не всплывало, а я все еще мог использовать мышь для других целей, пока выполняются автоматизированная сборка и тесты?


person yellavon    schedule 10.12.2014    source источник
comment
В последней версии (4.0.1-альфа) в файле readme упоминается, что безголовое тестирование возможно, но я не вижу подробностей о том, как это сделать. Кто-нибудь может помочь здесь? Вы можете увидеть файл readme здесь: github.com/TestFX/TestFX/blob/master. /README.md   -  person Adam    schedule 10.10.2015


Ответы (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 будет использовать кадровый буфер вместо вашего основного дисплея. Таким образом, тесты будут выполняться, но вы не будете беспокоиться об открытии окон и перемещении указателя мыши.

person Adam    schedule 10.02.2016
comment
Это не работает. Мои тесты не работают в автономном режиме, даже если я удалю if. - person Adam Arold; 27.02.2018
comment
Ответ на обновление у меня не сработал ... но решение Xvfb сработало. Умная штука. - person mike rodent; 21.03.2020

Я бы согласился с 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)

Запуск Monocle с библиотекой Glass

Ниже приведена моя команда maven, используемая в jenkins, вас заинтересует часть параметров времени выполнения Java.

$ mvn clean install -Dtestfx.robot=glass -Dglass.platform=Monocle -Dmonocle.platform=Headless -Dprism.order=sw
person Steve Park    schedule 18.02.2016
comment
Можете ли вы сообщить мне ревизию Monocle? также вы поставили банку под JRE Дженкинса? - person Steve Park; 02.03.2018

Да, можно выполнять автономное тестирование приложений JavaFx2. Вам понадобится Monocle (часть OpenJFX). Подробнее здесь: https://github.com/TestFX/Monocle

person KayDK    schedule 08.01.2015