【问题标题】:How to continue an Android instrumentation test run after exception?异常后如何继续运行 Android 仪器测试?
【发布时间】:2016-04-26 09:51:35
【问题描述】:

显然,当检测应用程序中发生异常时,检测测试运行会停止:

测试未能完成。原因:“仪器运行因“异常”而失败。查看设备 logcat 了解详情

这是自定义检测运行器中的预期行为还是配置错误?

我正在使用自定义 MonitorinInstrumentation [1] 来自动化验收测试。

不幸的是,当一个测试中发生异常时,测试执行被取消。我希望测试套件完成并且只标记失败的测试,就像在 JUnit 中一样。

如果在一个测试中发生异常,是否有一种通用的方法来执行(连接的)测试而不退出整个仪器?

  1. https://github.com/cucumber/cucumber-jvm/blob/master/examples/android/android-studio/Cukeulator/app/src/androidTest/java/cucumber/cukeulator/test/Instrumentation.java

【问题讨论】:

    标签: android android-testing cucumber-jvm


    【解决方案1】:

    当出现问题(例如,您想要检查的某些条件)时,仪器测试会引发异常。您通常可以使用 try catch 语句(或更改这些检查)来避免某些测试失败。 在这种情况下,有一些东西让 Dalvik 虚拟机停止了。这通常是由您的应用程序崩溃引起的。尝试仔细检查您的测试流程以分析是否有一些崩溃。 另外,请确保不要在您的某些活动中使用 onDestroy() 中的 System.exit(0),因为这可能会导致您的问题。 我希望能帮助你。

    【讨论】:

    • 首先非常感谢您的回答。不幸的是,它没有为我的问题提供解决方案。正如我所说,正在测试的应用程序引发了停止完整检测运行的异常。在测试中添加 try-catch 不适用。我正在寻找一个解决方案——如果有可能使用插桩——插桩继续运行,只有导致应用程序崩溃的测试被标记为“红色”。
    • 我知道这不是解决这个问题的方法。正如我所说的,Dalvik 虚拟机有些问题:在我看来,这可能与您的代码中的某些错误有关,因此我邀请您检查您的代码。寻找一些崩溃并确保不要在 onDestroy() 中调用 System.exit(0)。
    • 既不调用 System.exit() 也不调用 onDestroy()。但是,Dalvik VM 当然会因为检测应用程序中的异常而停止。在阅读developer.android.com/tools/testing/… 之后,我的印象是仪器启动了应用程序过程并且在某种程度上独立于应用程序。但是您是说,如果仪表化进程“死”,则仪表“死”?有没有机会解耦?
    • 不,没有。如果您查看 Gradle 任务,您会注意到在您正常运行应用程序或在 Instrumentation 测试下运行它时会运行相同的任务。不同之处在于,当您在测试中运行您的应用程序时,会运行一些其他任务。当然,我应该看看你的代码来帮助你更多。
    • 不幸的是,由于保密协议,我无法分享实际代码,但是这个例子有一个类似的设置github.com/a11n/android-cucumber-espresso/tree/stackoverflow ...只需执行 ./gradlew connectedCheck
    【解决方案2】:

    你可以尝试输入你的根build.gradle

    tasks.withType(Test) {
      ignoreFailures = true
    }
    

    根据文档:

    如果其中一项测试失败,在任何设备上,构建都会失败。

    查看android testing

    【讨论】:

    • 我的问题不是构建失败。因此,很遗憾,您的提议无济于事。 (我的问题是,如果一个测试导致被测应用程序中的异常,则测试套件不会运行完成。)
    【解决方案3】:

    我最近在寻找解决这个问题的方法,发现了一些其他人可能会觉得有用的信息。

    输入org.junit.rules.ErrorCollector。虽然这个won't work if your instrumentation tests are using deprecated ApplicationTestCase<Application> class,但自从I only needed the application context 以来,我能够切换到使用androidx.test.platform.app.InstrumentationRegistry 来解决这个问题。

    以下是来自 gist I found 的一些示例代码,可帮助您入门:

    package com.foo;
    
    import org.junit.Rule;
    import org.junit.Test;
    import org.junit.rules.ErrorCollector;
    
    import static org.hamcrest.Matchers.equalTo;
    
    /**
     * Created: 12/04/19 17:12
     *
     * @author chris
     */
    public class MyTest {
        @Rule
        public ErrorCollector collector = new ErrorCollector();
    
        @Test
        public void myTest() {
            collector.checkThat("a", equalTo("b"));
            collector.checkThat(1, equalTo(2));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 2011-03-22
      • 2010-10-02
      • 2013-01-11
      • 2015-03-29
      • 1970-01-01
      相关资源
      最近更新 更多