Android 浓缩咖啡测试失败,通常无活性消肿感觉

Android 浓缩咖啡测试失败,通常无活性消肿感觉,android,testing,android-espresso,Android,Testing,Android Espresso,编辑:更新了说明和错误消息,并添加了一些图像。还有这个问题 我有一个奇怪的错误,在运行浓缩咖啡测试时多次出现。在两次成功的测试运行后,测试开始失败,出现以下异常: 06-23 13:04:48.438 info TestRunner failed: WhenNavigatingToReportsThenCorrectViewShouldBeShown(com.myapp.ui.views.MainActivityTest) 06-23 13:04:48.439 info

编辑:更新了说明和错误消息,并添加了一些图像。还有这个问题

我有一个奇怪的错误,在运行浓缩咖啡测试时多次出现。在两次成功的测试运行后,测试开始失败,出现以下异常:

   06-23 13:04:48.438   info    TestRunner  failed: WhenNavigatingToReportsThenCorrectViewShouldBeShown(com.myapp.ui.views.MainActivityTest)
06-23 13:04:48.439  info    TestRunner  ----- begin exception -----
06-23 13:04:48.441  info    TestRunner  android.support.test.espresso.NoActivityResumedException: No activities in stage RESUMED. Did you forget to launch the activity. (test.getActivity() or similar)?
06-23 13:04:48.441  info    TestRunner  at dalvik.system.VMStack.getThreadStackTrace(Native Method)
06-23 13:04:48.441  info    TestRunner  at java.lang.Thread.getStackTrace(Thread.java:580)
06-23 13:04:48.441  info    TestRunner  at android.support.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:82)
06-23 13:04:48.441  info    TestRunner  at android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:53)
06-23 13:04:48.441  info    TestRunner  at android.support.test.espresso.ViewInteraction.runSynchronouslyOnUiThread(ViewInteraction.java:184)
06-23 13:04:48.441  info    TestRunner  at android.support.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:115)
06-23 13:04:48.441  info    TestRunner  at android.support.test.espresso.ViewInteraction.perform(ViewInteraction.java:87)
06-23 13:04:48.441  info    TestRunner  at com.myapp.ui.views.MainActivityTest.WhenNavigatingToReportsThenCorrectViewShouldBeShown(MainActivityTest.java:96)
06-23 13:04:48.441  info    TestRunner  at java.lang.reflect.Method.invoke(Native Method)
06-23 13:04:48.441  info    TestRunner  at java.lang.reflect.Method.invoke(Method.java:372)
06-23 13:04:48.441  info    TestRunner  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
06-23 13:04:48.441  info    TestRunner  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
06-23 13:04:48.441  info    TestRunner  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
06-23 13:04:48.441  info    TestRunner  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
06-23 13:04:48.441  info    TestRunner  at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
06-23 13:04:48.441  info    TestRunner  at android.support.test.internal.statement.UiThreadStatement.evaluate(UiThreadStatement.java:55)
06-23 13:04:48.441  info    TestRunner  at android.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:257)
06-23 13:04:48.441  info    TestRunner  at org.junit.rules.RunRules.evaluate(RunRules.java:18)
06-23 13:04:48.441  info    TestRunner  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
06-23 13:04:48.441  info    TestRunner  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
06-23 13:04:48.441  info    TestRunner  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
06-23 13:04:48.441  info    TestRunner  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
06-23 13:04:48.441  info    TestRunner  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
06-23 13:04:48.441  info    TestRunner  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
06-23 13:04:48.441  info    TestRunner  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
06-23 13:04:48.441  info    TestRunner  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
06-23 13:04:48.441  info    TestRunner  at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
06-23 13:04:48.441  info    TestRunner  at org.junit.runners.Suite.runChild(Suite.java:128)
06-23 13:04:48.441  info    TestRunner  at org.junit.runners.Suite.runChild(Suite.java:24)
06-23 13:04:48.441  info    TestRunner  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
06-23 13:04:48.441  info    TestRunner  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
06-23 13:04:48.441  info    TestRunner  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
06-23 13:04:48.441  info    TestRunner  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
06-23 13:04:48.441  info    TestRunner  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
06-23 13:04:48.441  info    TestRunner  at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
06-23 13:04:48.441  info    TestRunner  at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
06-23 13:04:48.441  info    TestRunner  at org.junit.runner.JUnitCore.run(JUnitCore.java:136)
06-23 13:04:48.441  info    TestRunner  at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:54)
06-23 13:04:48.441  info    TestRunner  at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:228)
06-23 13:04:48.441  info    TestRunner  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1837)
06-23 13:04:48.441  info    TestRunner  ----- end exception -----
06-23 13:04:48.443  info    TestRunner  finished: WhenNavigatingToReportsThenCorrectViewShouldBeShown(com.myapp.ui.views.MainActivityTest)
我有一个简单的应用程序,可以导航到目前只包含文本的页面,测试应该导航到每个页面并识别文本

@RunWith(AndroidJUnit4.class)
@LargeTest
public class MainActivityTest {

@Rule
public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule(MainActivity.class);
private MainActivity mainActivity;

@Before
public void setActivity() {
    mainActivity = mActivityRule.getActivity();
}

 @Test
public void WhenNavigatingToReportsThenCorrectViewShouldBeShown() {
    onView(allOf(withId(R.id.icon), hasSibling(withText(R.string.reports)))).perform(click());

    onView(withText("This is the Reports Activity.")).check(matches(isDisplayed()));
    Spoon.screenshot(mainActivity, "main_view");
}
}
@RunWith(AndroidJUnit4.class)
@最大的
公共类维护活动测试{
@统治
public ActivityTestRule mActivityRule=新的ActivityTestRule(MainActivity.class);
私人活动;
@以前
公共活动(){
mainActivity=mActivityRule.getActivity();
}
@试验
提交报告时的公共无效应显示错误的视图(){
onView(allOf(withId(R.id.icon)),hasSibling(withText(R.string.reports)))。执行(click());
onView(withText(“这是报告活动”))。检查(匹配项(isDisplayed());
屏幕截图(主要活动,“主要视图”);
}
}
此故障仅在实际设备上发生。在模拟设备上,测试工作正常。见下图

所有测试都由gradle脚本执行,首先删除以前的应用程序和测试api,然后再安装。确保环境清洁。日志表明卸载已成功。然后部署新应用程序并开始运行测试。现在他们失败了

如果测试失败,直到我手动从设备中删除应用程序和测试api,我才能再次获得成功的测试。但只有一段时间,直到同样的错误发生

为什么我得不到activityresumedexception,我找不到一个好的例子来说明它是什么以及什么时候发生的


我也有同样的问题。当设备上的屏幕关闭时会发生这种情况。打开屏幕应该可以解决问题。

您可以在每次测试前唤醒设备


要避免这种情况,请让您的设备保持清醒。设备的开发者选项中有一个选项

您可以使用com.android.ddmlib和gradle任务通过adb更改每个构建运行和您正在测试的每个设备的设备设置

import com.android.ddmlib.AndroidDebugBridge
import com.android.ddmlib.CollectingOutputReceiver
import com.android.ddmlib.IDevice
import com.android.ddmlib.NullOutputReceiver

task stayAwake {

    description = "Activate the Stay Awake settings in the developer options."
    group = "Device Setup"

    AndroidDebugBridge.initIfNeeded(false)
    def bridge = AndroidDebugBridge.createBridge(android.adbExecutable.path, false)

    doLast {
        bridge.devices.each {
            it.executeShellCommand("settings put global stay_on_while_plugged_in 3", NullOutputReceiver.receiver)
            println "Device ${it} will stay awake."
        }
    }
}
此外,您还可以通过另一个gradle任务激活屏幕。(前提是未设置PIN或解锁模式)

让这些任务在负责UI测试的gradle任务之前运行


这样,您的测试中就不需要额外的代码来激活设备并使其保持活动状态。

主要错误在于,如果您的连接未处于活动模式,那么它也不应该处于睡眠模式,它必须位于编写测试用例的应用程序中。
假设您已经使用了@Rule Activity启动规则。

一个可能的原因是测试正在并行运行。使用
--无并行

示例-->
gradlew connectedLiveDebugAndroidTest--无并行


只有当从控制台或顺序运行所有这些设备时,才会发生这种情况,但不会单独运行它们,那么它们很可能是在同一设备上并行运行的。在同一台设备上同时运行的两个不同的浓缩咖啡测试会使它们变得不稳定并且容易失败。

在我的例子中,解决方案是使用UI自动机

val uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
uiDevice.findObject(UiSelector().textContains("text")).click()
我想点击谷歌登录SDK托管的活动。我注意到SDK触发的活动仍然可见,即使被测试应用程序的进程被终止。因此,我使用了用于跨应用程序功能UI测试的inteded


我看到其他帖子建议切换动画(在开发者设置中)。你找到解决方案了吗?不是一个明确的解决方案。但请注意,它经常发生在系统窗口弹出时。当活动预期结果时也是如此。找到了一些可能解决某些问题的答案:例如,在我的例子中,正如@Pnemonic所指出的,动画是打开的。希望这对其他人有所帮助。我的项目中有两个android应用程序模块,当我使用单个命令(./gradlew spoon或./gradlew connectedDebugAndroidTest)在所有模块中运行测试时,在不同的测试中随机出现此错误,当我仅为特定模块运行测试时(./gradlew module1:connectedDebugAndroidTest),此错误消失。不知道为什么我要花上一辈子的时间才能弄明白-在我开始删除所有内容并重新开始之前谢谢你。开发者设置中的选项在充电时保持屏幕打开确实很有帮助:-)坐标的用途是什么?触摸屏幕,使其不会熄灭
IDevice.metaClass.inputKeyEventByShell {
    delegate.executeShellCommand("input keyevent ${it}", NullOutputReceiver.receiver)
}
IDevice.metaClass.inputSwipeByShell {
    delegate.executeShellCommand("input swipe ${it}", NullOutputReceiver.receiver)
}

task unlockScreen {

    description = "Activate screen and unlock device."
    group = "Device Setup"

    AndroidDebugBridge.initIfNeeded(false)
    def bridge = AndroidDebugBridge.createBridge(android.adbExecutable.path, false)

    doLast {
        bridge.devices.each {

            def receiver = CollectingOutputReceiver.newInstance()
            it.executeShellCommand("dumpsys power | grep \"mHolding\"", receiver)

            def displaySuspendFalse = receiver.getOutput().find("mHoldingDisplaySuspendBlocker=false")
            def wakelockSuspendFalse = receiver.getOutput().find("mHoldingWakeLockSuspendBlocker")

            if (displaySuspendFalse || wakelockSuspendFalse) {
                it.inputKeyEventByShell('26') //power keyevent
                println "Screen of device $it activated & unlocked."
            }

            it.inputSwipeByShell('100 500 100 1450 100') //swipe action
        }
    }
}
val uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
uiDevice.findObject(UiSelector().textContains("text")).click()