控制何时自动化测试结束 - Espresso

时间:2014-01-08 22:39:53

标签: java android android-testing android-espresso

我正在测试一个不寻常的情况。我正在使用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++;
    }

但是,这不会等待检查值。如果我等待值,测试运行器认为所有测试都已完成并终止。

我的问题是,有没有办法控制测试何时退出?即使我的测试出现也要完成。

2 个答案:

答案 0 :(得分:8)

或者,您可以创建一个IdlingResource来监控您的速度。 IdlingResource是Espresso用于验证主线程空闲或AsyncTask池中没有运行AsyncTasks的方式。

在库源代码中有coutingIdlingResource类的loook。你可以实现类似的东西。在你的情况下,它可能是这样的:

[...]

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处于空闲状态。这是goode因为您利用所有Espresso同步框架来监控您达到目标速度的时间,因此您的测试将比进行等待时更加可靠和快速。

答案 1 :(得分:2)

在测试中,您需要创建一个控制语句,只要您希望它运行,该语句就会使该测试保持运行。

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,然后测试就会结束。