控制自动化测试何时结束 – 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毫秒(平均而言)。
  • 在检查onSpeedChange()的值之前,我无法调用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用于validation主线程空闲或AsyncTask池中没有运行AsyncTasks的方式。

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

 [...] 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同步框架来监控您达到目标速度的时间,因此您的测试将比进行等待时更加可靠和快速。