Изменить скорость роботов TestFX? - PullRequest
0 голосов
/ 06 апреля 2020

В частности, WriteRobot / WriteRobotImpl. Кажется, он пишет вещи довольно медленно, и я бы хотел, чтобы он писал быстрее.

Редактировать
В ответ на комментарий MS я попытался это сделать (NB на данный момент у меня не было ' Выяснилось, что задействовано WriteRobot, а не TypeRobot):

setup(){
...
    setFinalStatic( org.testfx.robot.impl.TypeRobotImpl.class.getDeclaredField("SLEEP_AFTER_KEY_CODE_IN_MILLIS"), 5 );
}
...
static void setFinalStatic(Field field, Object newValue) throws Exception {
    field.setAccessible(true);
    Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
    field.set(null, newValue);
}

К сожалению, кажется, что нет никакой разницы в скорости набора, даже если установлено значение 1 мс.

Редактировать
Я замечаю комментарий Slaw.

Я установил свойство System testfx.robot.write_sleep перед запуском теста: это не имело никакого эффекта, несмотря на то, что кто-то мог видеть это это может произойти из исходного кода в верхней части WriteRobotImpl. java (см. ниже). Когда я установил это значение равным 500 мс, это также не имело никакого эффекта, и я пришел к выводу, что это свойство по какой-то причине не было видно из кода, поэтому было установлено значение по умолчанию 25 мс.

NB Возможные другие причины : следуя указанному коду, похоже, что WriteRobot.write всегда приводит к вызову WriteRobot.typeCharacterInScene, который, в свою очередь, вызывает BaseRobot.typeKeyboard и WaitForAsyncUtils.waitForFxEvents. Последний может быть «сложным клиентом»: если каждая нажатая клавиша должна «ждать появления событий», вполне возможно, что с этим ничего не поделаешь.

Все еще пытаюсь понять, почему в следующих строках вверху org.testfx.robot.impl.WriteRobotImpl. java не удалось увидеть свойство System:

private static final int SLEEP_AFTER_CHARACTER_IN_MILLIS;

static {
    int writeSleep;
    try {
        writeSleep = Integer.getInteger("testfx.robot.write_sleep", 25);
    }
    catch (NumberFormatException e) {
        System.err.println("\"testfx.robot.write_sleep\" property must be a number but was: \"" +
                System.getProperty("testfx.robot.write_sleep") + "\".\nUsing default of \"25\" milliseconds.");
        e.printStackTrace();
        writeSleep = 25;
    }
    SLEEP_AFTER_CHARACTER_IN_MILLIS = writeSleep;
}

Мне также было интересно, возможно ли, что кодовый блок static{...} произойдет так рано, что вам нужно установить свойство System до запуска тестов. Я попытался установить это свойство в gradle.build. По-прежнему безуспешно.

...