在浓缩咖啡测试超时,测试不运行
有一个辅助类DialogIdlingResource,我试着运行我的测试。 测试发生,除了这一个。 按下按钮后,一切都停止。
AcceptanceHelper.clickOnButtonInLayout(R.id.mainSignButton, R.string.common_signin_button_text, R.id.inputLayout)
带有两个辅助方法的代码片段:
@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 }
也尝试解决下一个解决方案的问题。 而当我运行一个我的测试,所有的作品是好的。 但是,如果我开始所有的测试,我会发现错误。 因为测试没有时间检查我的对话框中的文本,他打开对话框,这是全部。
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)
请帮忙解决这个问题。 对不起,我的英语。
对不起,但你的IdlingResource看起来像超级复杂的等待功能。
这段代码适用于我 – github链接 。 你只需要提供必要的参数给ViewVisibilityIdlingResource构造函数。 其中之一是int viewId
和另一个int visibility
。 例如,如果您从对话框布局和可见性View.GONE
提供任何viewId
,则此资源将阻止Espresso测试,直到视图可见或直到向用户显示对话框。
虽然没有赶上kotlin的语法。
isIdle()总是在主线程上执行,它应该是非阻塞的。 因此,不要在isIdle()中调用isDialogRunning(),而是在单独的线程中调用它,并更新idlingResource的状态(如果视图匹配或超时),然后可以通过isIdle()进行检查。
希望它有助于:)