gpt4 book ai didi

java - 在Android中运行 Espresso 测试时出现内存不足的问题

转载 作者:行者123 更新时间:2023-12-02 01:48:13 27 4
gpt4 key购买 nike

在Kitkat和Lollipop设备上运行我的意式浓缩咖啡测试套件时,我一直面临这个问题(OutOfMemory)。该套件可在棉花糖设备上完美运行。以下是更多详细信息,如果能在确定此问题的根本原因方面获得任何帮助,我将不胜感激。以下是更多详细信息:

  • OutofMemory仅在我一次运行整个套件(175个测试)时发生,并且如果我分别运行每个测试集也不会发生此问题。
  • 我尝试使用System.gc(),该脚本在运行每个方案后都会被调用,但仍然观察到OutOfmemory异常。
  • 每次我运行时,都会在不同的测试脚本上发生异常,并且在特定功能/测试脚本上不一致。
  • 应用程序中使用的位图已被压缩,因此不确定是否与图像大小有关。
  • 以下是最近运行的日志:

    java.lang.Thread.run(Thread.java:818)
    01-26 14:42:39.770 3476-4264/? E/看门狗:!@Sync 579 [01-26 14:42:39.778]
    01-26 14:42:42.470 3476-3476/? E/MotionRecognitionService:支持TA〜
    01-26 14:42:45.180 4265-4317/? E/ContactsProvider_EventLog:刷新缓冲区到文件cnt:3大小:0Kb持续时间:39ms lastUpdatedAfter:180367ms
    01-26 14:42:52.510 3476-3476/? E/MotionRecognitionService:支持TA〜
    01-26 14:42:55.320 446-454/? E/System:终结器抛出未捕获的异常
    01-26 14:42:56.900 446-454/? E/System:java.lang.OutOfMemoryError:尝试抛出OutOfMemoryError时抛出了OutOfMemoryError;没有可用的堆栈跟踪
    01-26 14:42:56.910 446-1088/? E/CrashReporting:ParseCrashReporting捕获了com.capitalone.mobilebanking.dev.debug的OutOfMemoryError异常。建筑报告。
    01-26 14:42:56.910 446-18726/? E/CrashReporting:ParseCrashReporting捕获了com.capitalone.mobilebanking.dev.debug的OutOfMemoryError异常。建筑报告。
    01-26 14:42:56.910 446-446/? E/MonitoringInstrumentation:线程[main,5,main]遇到异常。将线程状态转储到输出并固定到峡湾。
    java.lang.OutOfMemoryError:未能分配40字节的分配,其中包含3960个空闲字节和3KB,直到OOM
    在android.view.View.buildDrawingCacheImpl(View.java:16723)
    在android.view.View.buildDrawingCache(View.java:16625)
    在android.view.View.draw(View.java:17231)
    在android.view.ViewGroup.drawChild(ViewGroup.java:3921)
    在android.view.ViewGroup.dispatchDraw(ViewGroup.java:3711)
    在android.view.View.buildDrawingCacheImpl(View.java:16759)
    在android.view.View.buildDrawingCache(View.java:16625)
    在android.view.View.updateDisplayListIfDirty(View.java:16445)
    在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3905)
    在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3885)
    在android.view.View.updateDisplayListIfDirty(View.java:16424)
    在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3905)
    在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3885)
    在android.view.View.updateDisplayListIfDirty(View.java:16424)
    在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3905)
    在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3885)
    在android.view.View.updateDisplayListIfDirty(View.java:16424)
    在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3905)
    在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3885)
    在android.view.View.updateDisplayListIfDirty(View.java:16424)
    在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3905)
    在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3885)
    在android.view.View.updateDisplayListIfDirty(View.java:16424)
    在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3905)
    在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3885)
    在android.view.View.updateDisplayListIfDirty(View.java:16424)
    在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3905)
    在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3885)
    在android.view.View.updateDisplayListIfDirty(View.java:16424)
    在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3905)
    在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3885)
    在android.view.View.updateDisplayListIfDirty(View.java:16424)
    在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3905)
    在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3885)
    在android.view.View.updateDisplayListIfDirty(View.java:16424)
    在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3905)
    在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3885)
    在android.view.View.updateDisplayListIfDirty(View.java:16424)
    在android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:325)
    在android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:331)
    在android.view.ThreadedRenderer.draw(ThreadedRenderer.java:366)
    在android.view.ViewRootImpl.draw(ViewRootImpl.java:3134)
    在android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2933)
    在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2522)
    在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1437)
    在android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:7397)
    在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:920)
    在android.view.Choreographer.doCallbacks(Choreographer.java:695)
    在android.view.Choreographer.doFrame(Choreographer.java:631)
    在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:906)
    在android.os.Handler.handleCallback(Handler.java:739)
    在android.os.Handler.dispatchMessage(Handler.java:95)
    在android.os.Looper.loop(Looper.java:158)
    在android.app.ActivityThread.main(ActivityThread.java:7224)
    在java.lang.reflect.Method.invoke( native 方法)
    在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1230)
    在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
    01-26 14:42:56.910 446-18726/? E/AndroidRuntime:致命异常(exception):IntentService [AlertSubscriptionService]
    流程:com.capitalone.mobilebanking.dev.debug,PID:446
    java.lang.OutOfMemoryError:尝试抛出OutOfMemoryError时抛出 OutOfMemoryError;没有可用的堆栈跟踪
    01-26 14:42:56.910 446-1088/? E/CrashReporting:处理崩溃异常
    java.lang.OutOfMemoryError:未能分配4092字节分配,其中包含3928个空闲字节和3KB,直到OOM
    在java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95)
    在java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:146)
    在java.lang.StringBuffer.append(StringBuffer.java:219)
    在java.util.regex.Matcher.appendTail(Matcher.java:285)
    在java.util.regex.Matcher.replaceAll(Matcher.java:321)
    在gherkin.formatter.PrettyFormatter.indent(PrettyFormatter.java:469)
    在gherkin.formatter.PrettyFormatter.printError(PrettyFormatter.java:385)
    在gherkin.formatter.PrettyFormatter.printSteps(PrettyFormatter.java:133)
    在gherkin.formatter.PrettyFormatter.replay(PrettyFormatter.java:121)
    在gherkin.formatter.PrettyFormatter.eof(PrettyFormatter.java:421)
    在java.lang.reflect.Method.invoke( native 方法)
    在Cucumber.runtime.Utils $ 1.call(Utils.java:34)
    在cumul.runtime.Timeout.timeout(Timeout.java:13)
    在cumul.runtime.Utils.invoke(Utils.java:30)
    在Cucumber.runtime.RuntimeOptions $ 1.invoke(RuntimeOptions.java:243)
    在java.lang.reflect.Proxy.invoke(Proxy.java:393)
    在$ Proxy11.eof(未知来源)
    在cumul.runtime.model.CucumberFeature.run(CucumberFeature.java:165)
    在Cucumber.runtime.android.CucumberExecutor.execute(CucumberExecutor.java:113)
    在Cucumber.api.android.CucumberInstrumentationCore.start(CucumberInstrumentationCore.java:88)
    在com.capitalone.mobilebanking.espressoTests.Instrumentation.onStart(Instrumentation.java:133)
    在android.app.Instrumentation
  • 最佳答案

    当我一次开始运行300多个Espresso测试时,我遇到了同样的问题。
    显然,在每次导致OOM错误(OutOfMemoryError)的测试之后,都不会清除内存。

    为了解决此问题,我开始使用Android Test Orchestrator,它为您的测试环境提供了以下好处:

  • 最小共享状态。每个测试都在自己的仪器中运行
    实例。因此,如果您的测试共享应用程序状态,则大多数
    每次共享状态从设备的CPU或内存中删除后,
    测试。
  • 在之后删除设备CPU和内存中的所有共享状态
    每次测试时,请使用clearPackageData标志。
  • 崩溃是隔离的。即使一个测试崩溃,它也只会崩溃
    它自己的Instrumentation实例,因此套件中的其他测试
    仍在运行。

  • 我在项目构建gradle文件中添加了 Android Test Orchestrator来解决此问题:
    android {
    defaultConfig {
    ...
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    // The following argument makes the Android Test Orchestrator run its
    // "pm clear" command after each test invocation. This command ensures
    // that the app's state is completely cleared between tests.
    testInstrumentationRunnerArguments clearPackageData: 'true'
    }

    testOptions {
    execution 'ANDROIDX_TEST_ORCHESTRATOR'
    }
    }

    dependencies {
    androidTestImplementation 'androidx.test:runner:1.1.0'
    androidTestUtil 'androidx.test:orchestrator:1.1.0'
    }

    关于java - 在Android中运行 Espresso 测试时出现内存不足的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41917666/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com