控制自动化测试何时结束 – 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同步框架来监控您达到目标速度的时间,因此您的测试将比进行等待时更加可靠和快速。
- 根据android studio编译器,数据库表不存在
- 在Android 7上写入外部存储
- 是否有针对Java的蓝牙上的任何TCP / IP堆栈实现,更具体的Android?
- 从Android本地调用由NetBeans IDE生成的RESTful Web服务?
- 我可以在Android上的多个线程中使用相同的RoomDatabase对象吗?
- ArrayAdapter.remove 的UnsupportedOperationException
- 在推送通知错误“notificationBuilder.setContentText(currentText).setNumber(++ numMessages);”中找不到符号
- 总计小时数无法从android插入MySQL
- 从另一个方法访问变量