Espresso测试单独传递,在套件

时间:2017-02-27 19:59:13

标签: android android-espresso

我有以下Espresso测试。如果我自己运行它总是通过,但是当我同时在类中运行所有测试时总是会失败。

它有点奇怪的是,它曾经作为套件的一部分工作。我不知道为什么现在它停止了工作。它必须是我已经完成的事情,但我不知道是什么。

@Test
public void itemHasImage_ShowsImage() {
    closeSoftKeyboard();
    if (mItem.getImageUrl() != null) {
        onView(withId(R.id.edit_item_image)).perform(scrollTo())
            .check(matches(isDisplayed()));
    }
}

我得到的错误是:

Error performing 'scroll to'...
...
Caused by: java.lang.RuntimeException: Action will not be performed
because the target view does not match one or more of the following
constraints:(view has effective visibility=VISIBLE and is descendant
of a: (is assignable from class: class android.widget.ScrollView...

视图是可见的,是滚动视图的后代,正如它在其上运行时所传递的那样。

当它进入这个测试时(在套件中)它不会滚动。但是当我单独运行它时,它滚动得很好。

在我最近询问的另一个堆栈溢出问题Espresso not starting Activity the same for second iteration in parameterised test中,我发现上一次测试中的onDestroy在当前测试中的onResume之后被调用,导致它将值设置为null并使测试失败。在这种情况下,问题是测试本身通过但不在套件中。我现在有类似的问题,但没有明显的方法来解决它。 (修改:无法再应用其他问题的解决方法。)

任何想法?它能以某种方式阅读错误的活动吗?就像它可能正在查看上一次测试中的那个。这听起来很荒谬,但在最后一个问题之后我觉得有可能。

编辑:好的结果是,当作为套件的一部分运行此测试时,图像实际上是不可见的,导致测试失败。我发现这是使用调试器并手动滚动视图。但为什么呢?

我认为这是一个错误,并在此处记录了一个问题:

https://code.google.com/p/android/issues/detail?id=235247

2 个答案:

答案 0 :(得分:4)

它可以解决使用Orchestrator android测试实用程序库,它将独立执行每个测试用例,因此没有机会在测试套件中破解

  • 使用AndroidJUnitRunner 1.0或更高版本时,您可以访问名为Android Test Orchestrator的工具,该工具允许您在自己的Instrumentation调用中运行每个应用程序的测试。

启用build.gradle

    android {
  defaultConfig {
   ...
   testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
 }

  testOptions {
    execution 'ANDROID_TEST_ORCHESTRATOR'
  }
}

dependencies {
  androidTestImplementation 'com.android.support.test:runner:1.0.1'
  androidTestUtil 'com.android.support.test:orchestrator:1.0.1'
}

了解更多信息:https://developer.android.com/training/testing/junit-runner.html#using-android-test-orchestrator

答案 1 :(得分:0)

我遇到了类似的问题,但是原因不同,@ Rakshith-Kumar建议使用Orchestrator可能可行,并且将每种测试方法都放在TestSuite中也可以解决,因为可以通过以下方法解决脆弱性分别运行每个测试。

还想提及一下,如果您正在测试使用RxJava调度程序(例如io调度程序)在后台线程中运行某些任务的组件,则可能会出现不稳定现象,因为Espresso将无法与后台线程同步。

解决方案可以注入ObservableTransformer来执行 subscribeOn observeOn 操作。对于Espresso测试,将 ObservableTransformer 实例替换为另一实例,该实例将 Schedulers.from(AsyncTask.THREAD_POOL_EXECUTOR)用于io调度程序。 像这样:

public <T> ObservableTransformer<T, T> ioTransformer() {
        return observable -> observable.subscribeOn(AsyncTask.THREAD_POOL_EXECUTOR).observeOn(AndroidSchedulers.mainThread());
    }

这样,Espresso可以与后台线程同步并避免松软。 更多信息: https://blog.danlew.net/2015/03/02/dont-break-the-chain/ https://developer.android.com/training/testing/espresso/#sync

相关问题