Тестирование нескольких компонентов 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;
}
Другие вопросы по тегам