【问题标题】:Timeout in espresso tests, test doesn t run浓缩咖啡测试超时,测试不运行
【发布时间】:2017-01-20 09:13:34
【问题描述】:

有一个辅助类 DialogIdlingResource,我尝试通过它运行我的测试。测试发生,除了这个。按下按钮后,一切都停止了。

AcceptanceHelper.clickOnButtonInLayout(R.id.mainSignButton, R.string.common_signin_button_text, R.id.inputLayout)

使用两个辅助方法编写 sn-p 代码:

 @Test
fun signInUserWithInvalidEmail() {
    goToSignIn()
    AcceptanceHelper.updateValidationTextView(R.string.ui_data_attribute_email, "kokojambo@mail.ru")
    AcceptanceHelper.updateValidationTextView(R.string.ui_data_attribute_password, VALID_PASSWORD)
    AcceptanceHelper.clickOnButtonInLayout(R.id.mainSignButton, R.string.common_signin_button_text, R.id.inputLayout)
    val idlingResource = DialogIdlingResource()
    registerDialogIdlingResource()
    unregisterDialogIdlingResource()
}
    private fun registerDialogIdlingResource() {
    val instrumentation = InstrumentationRegistry.getInstrumentation()
    idlingResource = DialogIdlingResource()
    Espresso.registerIdlingResources(idlingResource)
}


private fun unregisterDialogIdlingResource() {
    Espresso.unregisterIdlingResources(idlingResource)
}

很可能是regester和unregister(idlingResource)这两种方法报错

但其实应该可以的,只是可能在某个地方可能出错了,辅助类代码:

class DialogIdlingResource(private val waitTimeSeconds: Int = 5) : 

IdlingResource {
private var resourceCallback: IdlingResource.ResourceCallback? = null
private var startTime = -1L

override fun getName(): String {
    return DialogIdlingResource::class.java.name
}

override fun isIdleNow(): Boolean {
    if (startTime < 0) {
        startTime = System.currentTimeMillis()
    }
    val timeOut = System.currentTimeMillis() - waitTimeSeconds * 1000 > startTime
    if (timeOut)
        throw TimeoutException("error")
    val idle = !isDialogRunning
    if (idle && resourceCallback != null) {
        resourceCallback!!.onTransitionToIdle()
    }
    return idle
}

override fun registerIdleTransitionCallback(resourceCallback: IdlingResource.ResourceCallback) {
    this.resourceCallback = resourceCallback
}

private val isDialogRunning: Boolean
    get() {
        try {
            onView(Matchers.allOf(withId(R.id.titleTextView), ViewMatchers.withText("Warning")))
                    .check(ViewAssertions.matches(isDisplayed()))
        } catch (e: NoMatchingViewException) {
            e.printStackTrace()
            System.out.println("some text")
        }
        return true
    }

尝试解决下一个solution 的问题。当我只运行一项测试时,一切正常。但是如果我开始我的所有测试,我会发现错误。因为 test 没有时间检查我的对话框中的示例文本,所以他打开了对话框,仅此而已。

IdlingResource 类:

class ElapsedTimeIdlingResource(private val activity: SignActivity?) : IdlingResource {
private var callback: IdlingResource.ResourceCallback? = null

override fun getName(): String {
    return "SignInScreenTest"
}

override fun isIdleNow(): Boolean {
    val idle = isIdle
    if (idle) callback!!.onTransitionToIdle()
    return idle
}

val isIdle: Boolean
    get() = activity != null && callback != null

override fun registerIdleTransitionCallback(resourceCallback: IdlingResource.ResourceCallback) {
    this.callback = resourceCallback
}

}

在我的测试中

val activity = mActivityTestRule.getActivity()
    val idlingResource = ElapsedTimeIdlingResource(activity)
    Espresso.registerIdlingResources(idlingResource)
    AcceptanceHelper.checkTextView(R.id.titleTextView, "Warning")

我再说一遍,就在我开始所有测试时,我需要在 registerIdlingResources 和 checktextView 之间设置睡眠 像这样的东西:

SystemClock.sleep(5000)

请帮助解决这个问题。对不起我的英语。

【问题讨论】:

    标签: android kotlin android-espresso


    【解决方案1】:

    抱歉,您的 IdlingResource 看起来像是超级复杂的等待功能。

    此代码 sn-p 适用于我 - github link。您只需向 ViewVisibilityIdlingResource 构造函数提供所需的参数。其中一个是int viewId,另一个是int visibility。例如,如果您在对话框布局中提供任何 viewId 和可见性 View.GONE,则此资源将阻止 Espresso 测试,直到视图可见或对话框显示给用户。

    【讨论】:

    • java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getId()' on a null object reference 当我解决类似这样的问题时`val idlingResource = ViewVisibilityIdlingResource(mActivityTestRule.activity.findViewById(R.id.titleTextView), 2000)`
    • 您正在寻找的视图可能属于不同的活动然后mActivityTestRule.activity。您应该会在屏幕上显示最新的活动。请参阅此链接 - qathread.blogspot.ch/2014/09/…
    【解决方案2】:

    虽然没有掌握 kotlin 的语法。

    isIdle() 总是在应该是非阻塞的主线程上执行。所以与其在 isIdle() 中调用 isDialogRunning(), 在单独的线程中调用它并更新 idlingResource 的状态(如果视图匹配或超时),然后可以通过 isIdle() 进行检查。

    希望对你有帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      相关资源
      最近更新 更多