Контроль завершения автоматизированного теста — Espresso

StackOverflow https://stackoverflow.com//questions/21008102

Вопрос

У меня необычная ситуация, которую я тестирую.Я использую Espresso для написания тестов.Я знаю, что Espresso и InstrumentationTestCase не предназначены для этого.

У меня есть прослушиватель, который я создал в одном из своих классов, который будет уведомлять меня об изменении определенного значения.Я использую прослушиватель в своем наборе тестов.

Когда я получаю значение от слушателя, мне нужно подтвердить, что значение было изменено как таковое.

Моя проблема в том, что тест закончится до того, как я получу значение от слушателя.

    private void sendSpeedChanges() {
    setStaticSpeed(new Random().nextInt(10) + 2);
    try {
        runTestOnUiThread(new Runnable() {
            @Override
            public void run() {
                consoleActivity.onSpeedChanged(getStaticSpeed(), false);
            }
        });
    } catch (Throwable throwable) {
        throwable.printStackTrace();
    }

}

private void createSpeedDelegate() {
    EspressoMachineValues.setOnSpeedChangeListener(new EspressoMachineValues.OnSpeedChangeListener() {
        @Override
        public void onSpeedChanged(double speed) {
            //assert speed is correct.
            assertTrue(getStaticSpeed() == speed);
        }
    });

}

Это два метода, которые я использую.А createSpeedDelegate() это вызов в самом начале.Тогда я звоню sendSpeedChanges.Мне нужно сделать это X-количество раз.


ПРИМЕЧАНИЕ:

  • Для получения информации требуется около 200 миллисекунд (в среднем).
  • я не могу позвонить sendSpeedChanges() пока я не проверю значение в onSpeedChange()
  • я не могу использовать Thread.sleep(); потому что слушатель находится в основном потоке.

я пытался добавление getInstrumentation().wait(2000); а также getInstrumentation().waitForIdleSync(); Очевидно, ни то, ни другое не работает.

В идеальном мире я бы сделал так:

   for (int i = 0; i < 42; i++) {
        sendSpeedChanges();
        i++;
    }

Но это не будет ждать проверки значения.А если я дождусь значения, программа запуска тестов решит, что все тесты выполнены, и завершит работу.

Мой вопрос есть ли способ контролировать завершение теста?Хотя мои тесты появляться нужно сделать.

Это было полезно?

Решение

В вашем тесте вам нужно будет создать оператор управления, который будет поддерживать выполнение этого теста до тех пор, пока вы этого хотите.

while(myTestNeedsToRun) {
    if(speedChangeReceived) {
        sendSpeedChange();
        speedChangeReceived = false;
    }
}

private void createSpeedDelegate() {
   EspressoMachineValues.setOnSpeedChangeListener(new EspressoMachineValues.OnSpeedChangeListener() {
    @Override
    public void onSpeedChanged(double speed) {
        //assert speed is correct.
        assertTrue(getStaticSpeed() == speed);
        speedChangedReceived = true;
    }
});

Как только вы решите, что завершили тест, просто установите myTestNeedsToRun = false и тогда ваш тест закончится.

Другие советы

Альтернативно вы можете создать IdlingResource для мониторинга вашей скорости.IdlingResource — это способ, который Espresso использует для проверки того, что основной поток простаивает или что в пуле AsyncTask нет запущенных AsyncTask.

Взгляните на coutingIdlingResource class в исходном коде библиотеки.Вы можете реализовать что-то подобное.В вашем случае это может быть что-то вроде этого:

[...]

private int mTargetSpeed;
private volatile ResourceCallback resourceCallback;

@Override
public boolean isIdleNow() {
  boolean isIdle = false;
  if (getStaticSpeed() == mTargetSpeed) {
     isIdle = true;
     resourceCallback.onTransitionToIdle();
  } else {
     isIdle = false;
  }

  return isIdle;
}

В ваших тестах всякий раз, когда вы хотите дождаться, пока скорость достигнет желаемого уровня, вам следует сделать:

[...]
SpeedIdlingResource speedIdlingResource = new SpeedIdlingResource ("my_idling_resource");
Espresso.registerIdlingResources(speedIdlingResource);

Таким образом, Espresso будет блокироваться до тех пор, пока ваш ресурс на холостом ходу не сообщит платформе, что ваш SpeedMonitor простаивает.Это хорошо, потому что вы используете всю структуру синхронизации Espresso для отслеживания достижения целевой скорости, поэтому ваши тесты будут более надежными и быстрыми, чем постоянное ожидание.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top