有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java控制自动化测试何时结束浓缩咖啡

我正在测试一个不寻常的情况。我在用浓缩咖啡写测试。我知道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。我需要做很多次


注:

  • 检索信息(平均)大约需要200毫秒
  • 在检查onSpeedChange()中的值之前,我无法调用sendSpeedChanges()
  • 我不能使用Thread.sleep();,因为侦听器位于主线程上

我尝试过添加getInstrumentation().wait(2000);getInstrumentation().waitForIdleSync();显然,这两种方法都不管用

在一个完美的世界里,我会这样做:

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

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

我的问题是,有没有办法控制考试何时结束?即使我的测试似乎有待完成


共 (2) 个答案

  1. # 1 楼答案

    在测试中,您需要创建一条控制语句,使测试在您希望的时间内一直运行

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

  2. # 2 楼答案

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

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

    [...]
    
    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);
    

    这样,浓缩咖啡就会阻塞,直到空闲的资源告诉框架你的SpeedMonitor空闲。这很好,因为你可以利用所有的浓缩咖啡同步框架来监控你何时达到目标速度,这样你的测试会比等待时间更可靠、更快