android-test
android-test copied to clipboard
Espresso test failed, no feedback to help me figure out why
Description
As far as I know, I'm writing my Espresso tests correctly. However, they fail when I run them, and there's nothing that's telling me why they fail so I can fix them. There's no stack trace, no assertion errors in logs, nothing.
Expected Results
In theory, my test should pass.
Actual Results
The test fails, with no information or indication of why it failed.
Here are my only logs. Good luck finding the cause from them. connected.zip
AndroidX Test and Android OS Versions
androidx.test:core:1.5.0
androidx.test.espresso:espresso-core:3.4.0
androidx.test.ext:junit-ktx:1.1.5
androidx.test:runner:1.5.2
androidx.test:rules:1.5.0
Android 10, Android 13
Sorry without more info its going to difficult for us to help.
Have you tried looking at logcat output to see if there are any errors there? Can you share a sample project + steps to reproduce the problem?
The logcat output is in the attached ZIP file. Like I said, there are no errors there to signify a failed assertion or anything.
Our project is not publicly shared, so I can't share it with you. I can tell you, just for testing purposes, I made a test that does literally nothing and still fails.
Please tell me if I'm missing something, but I don't see the logcat file.
~/Downloads$ unzip -l connected.zip
Archive: connected.zip
Length Date Time Name
--------- ---------- ----- ----
0 08-18-2023 14:19 connected/
163 08-18-2023 14:19 __MACOSX/._connected
2585 08-18-2023 14:14 connected/index.html
163 08-18-2023 14:14 __MACOSX/connected/._index.html
0 08-18-2023 14:14 connected/css/
163 08-18-2023 14:14 __MACOSX/connected/._css
0 08-18-2023 14:14 connected/js/
163 08-18-2023 14:14 __MACOSX/connected/._js
1951 08-18-2023 14:14 connected/com.encircle.espresso.LoginTest.html
163 08-18-2023 14:14 __MACOSX/connected/._com.encircle.espresso.LoginTest.html
2232 08-18-2023 14:14 connected/com.encircle.espresso.html
163 08-18-2023 14:14 __MACOSX/connected/._com.encircle.espresso.html
270551 08-18-2023 14:19 connected/Test Results - canLogOut.html
219 08-18-2023 14:19 __MACOSX/connected/._Test Results - canLogOut.html
2428 08-18-2023 14:14 connected/css/base-style.css
163 08-18-2023 14:14 __MACOSX/connected/css/._base-style.css
1131 08-18-2023 14:14 connected/css/style.css
163 08-18-2023 14:14 __MACOSX/connected/css/._style.css
2933 08-18-2023 14:14 connected/js/report.js
163 08-18-2023 14:14 __MACOSX/connected/js/._report.js
FWIW, there is some working samples at github.com/android/testing-samples if you need a sample project to start from - either to compare setup or build up a repro case.
Test Results - canLogOut.html contains the logcat output.
Ah thank you.
I see this in the log when the test starts:
08-18 17:08:01.958 23848 23908 I TestRunner: started: canLogOut(com.encircle.espresso.LoginTest)
So the test is running in process ID 23848, and that is the last log line for the TestRunner, so the test never finishes.
One of the last log lines I see from process 23848 is:
08-18 17:08:13.968 23848 23848 I Process : Sending signal. PID: 23848 SIG: 9
I could be wrong but this seems to indicate the app process under test is exiting itself. Is it possible there is a System.exit or Process.killProcess call or similar somewhere that is being triggered?
I cannot explain why you would still see no output in this case - the test runner should tell you that the process died and clearly it is unacceptable to report no output even in an abnormal circumstance.
Are you running the test through Android Studio or gradle? What versions? Is it possible to run the test manually and see what output is produced?
After installing the apks, do something like 'adb shell pm list instrumentation' to find out your component/runner class na,e 'adb shell am instrument -w "component/runner"'
Sorry for the delayed response.
Is it possible there is a System.exit or Process.killProcess call or similar somewhere that is being triggered?
If there is, it's not one I know about. 🤷 However, I tried running the tests from the CLI and saw this:
Tests on MAR-LX3A - 10 failed: There was 1 failure(s).
Test run failed to complete. Instrumentation run failed due to Process crashed.
I should probably mention, I have three different phones to test with (a Huawei P30 Lite running Android 10, a Samsung Galaxy A32 running Android 13, and a Google Pixel 7 running Android 13), and they're all consistently yielding the same results for everything I try.
Are you running the test through Android Studio or gradle? What versions?
I've been running it through Android Studio. I have the latest version (Giraffe) and I'm using AGP version 8.0.0.
Is it possible to run the test manually and see what output is produced?
Here's a stack trace from running the tests with Gradle, if it helps:
* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:connectedDebugAndroidTest'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:149)
at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:282)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:147)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:135)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:338)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:325)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:318)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:304)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:463)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:380)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)
Caused by: org.gradle.api.GradleException: There were failing tests. See the report at: file:///Users/jordanlongstaff/encircle/android/app/build/reports/androidTests/connected/index.html
at com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask.doTaskAction(DeviceProviderInstrumentTestTask.java:414)
at com.android.build.gradle.internal.tasks.NonIncrementalTask$taskAction$$inlined$recordTaskAction$1.invoke(BaseTask.kt:66)
at com.android.build.gradle.internal.tasks.Blocks.recordSpan(Blocks.java:51)
at com.android.build.gradle.internal.tasks.NonIncrementalTask.taskAction(NonIncrementalTask.kt:97)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:242)
at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:227)
at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:210)
at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:193)
at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:166)
at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:93)
at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44)
at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:57)
at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:54)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:54)
at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44)
at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:67)
at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:37)
at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41)
at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74)
at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:50)
at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:28)
at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.executeDelegateBroadcastingChanges(CaptureStateAfterExecutionStep.java:100)
at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:72)
at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:50)
at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:40)
at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:29)
at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:166)
at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:70)
at org.gradle.internal.Either$Right.fold(Either.java:175)
at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:59)
at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:68)
at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:46)
at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:36)
at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:25)
at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:36)
at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22)
at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:91)
at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:55)
at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:37)
at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:65)
at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:36)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:76)
at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:37)
at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:94)
at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:49)
at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:71)
at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:45)
at org.gradle.internal.execution.steps.SkipEmptyWorkStep.executeWithNonEmptySources(SkipEmptyWorkStep.java:177)
at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:81)
at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:53)
at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:32)
at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:21)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36)
at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23)
at org.gradle.internal.execution.steps.CleanupStaleOutputsStep.execute(CleanupStaleOutputsStep.java:75)
at org.gradle.internal.execution.steps.CleanupStaleOutputsStep.execute(CleanupStaleOutputsStep.java:41)
at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:32)
at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:287)
at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30)
at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:21)
at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37)
at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27)
at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:42)
at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:31)
at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:64)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:146)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:135)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:338)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:325)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:318)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:304)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:463)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:380)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)
After installing the apks, do something like 'adb shell pm list instrumentation' to find out your component/runner class na,e 'adb shell am instrument -w "component/runner"'
$ adb shell am instrument -w "com.encircle.test/androidx.test.runner.AndroidJUnitRunner"
com.encircle.espresso.LoginTest:INSTRUMENTATION_RESULT: shortMsg=Process crashed.
INSTRUMENTATION_CODE: 0
Is there a stack trace outputted on either the 'adb shell am instrument -w "com.encircle.test/androidx.test.runner.AndroidJUnitRunner' command or in logcat
No stack trace from the adb shell am instrument -w ... command, but I've been looking into the Process crashed message and found stack trace messages like this in logcat:
08-21 14:48:35.466 20856 20856 D StrictMode: StrictMode policy violation; ~duration=6 ms: android.os.strictmode.DiskReadViolation
08-21 14:48:35.466 20856 20856 D StrictMode: at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1556)
08-21 14:48:35.466 20856 20856 D StrictMode: at libcore.io.BlockGuardOs.access(BlockGuardOs.java:69)
08-21 14:48:35.466 20856 20856 D StrictMode: at libcore.io.ForwardingOs.access(ForwardingOs.java:73)
08-21 14:48:35.466 20856 20856 D StrictMode: at android.app.ActivityThread$AndroidOs.access(ActivityThread.java:8037)
08-21 14:48:35.466 20856 20856 D StrictMode: at java.io.UnixFileSystem.checkAccess(UnixFileSystem.java:281)
08-21 14:48:35.466 20856 20856 D StrictMode: at java.io.File.exists(File.java:815)
08-21 14:48:35.466 20856 20856 D StrictMode: at android.app.ContextImpl.getDataDir(ContextImpl.java:2470)
08-21 14:48:35.466 20856 20856 D StrictMode: at android.app.ContextImpl.getCacheDir(ContextImpl.java:789)
08-21 14:48:35.466 20856 20856 D StrictMode: at android.content.ContextWrapper.getCacheDir(ContextWrapper.java:273)
08-21 14:48:35.466 20856 20856 D StrictMode: at android.content.ContextWrapper.getCacheDir(ContextWrapper.java:273)
08-21 14:48:35.466 20856 20856 D StrictMode: at com.encircle.jsenv.EnFileManager.<init>(EnFileManager.kt:54)
08-21 14:48:35.466 20856 20856 D StrictMode: at com.encircle.jsenv.EventLoop.<init>(EventLoop.java:145)
08-21 14:48:35.466 20856 20856 D StrictMode: at com.encircle.jsenv.EventLoop.create(EventLoop.java:75)
08-21 14:48:35.466 20856 20856 D StrictMode: at com.encircle.Encircle.lambda$onCreate$1(Encircle.java:220)
08-21 14:48:35.466 20856 20856 D StrictMode: at com.encircle.Encircle.$r8$lambda$G81GPelK8dhlplDvdXpQkdW_mP8(Unknown Source:0)
08-21 14:48:35.466 20856 20856 D StrictMode: at com.encircle.Encircle$$ExternalSyntheticLambda8.call(Unknown Source:4)
08-21 14:48:35.466 20856 20856 D StrictMode: at com.encircle.util.Deferred.resolve(Deferred.java:47)
08-21 14:48:35.466 20856 20856 D StrictMode: at com.encircle.util.DiskCleanup$DiskCleanupTask.onPostExecute(DiskCleanup.kt:92)
08-21 14:48:35.466 20856 20856 D StrictMode: at com.encircle.util.DiskCleanup$DiskCleanupTask.onPostExecute(DiskCleanup.kt:28)
08-21 14:48:35.466 20856 20856 D StrictMode: at android.os.AsyncTask.finish(AsyncTask.java:755)
08-21 14:48:35.466 20856 20856 D StrictMode: at android.os.AsyncTask.access$900(AsyncTask.java:192)
08-21 14:48:35.466 20856 20856 D StrictMode: at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:772)
08-21 14:48:35.466 20856 20856 D StrictMode: at android.os.Handler.dispatchMessage(Handler.java:107)
08-21 14:48:35.466 20856 20856 D StrictMode: at android.os.Looper.loop(Looper.java:213)
08-21 14:48:35.466 20856 20856 D StrictMode: at android.app.ActivityThread.main(ActivityThread.java:8178)
08-21 14:48:35.466 20856 20856 D StrictMode: at java.lang.reflect.Method.invoke(Native Method)
08-21 14:48:35.466 20856 20856 D StrictMode: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
08-21 14:48:35.466 20856 20856 D StrictMode: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
I haven't found the fix for this yet, but it might have something to do with my issue.
My guess is StrictMode violations like this aren't the cause.
OK, maybe I should put in a qualifier about my test results, because I just discovered something else weird. Let me show you one of the tests that I'm trying to run:
@Test
fun canLogOut() {
sleep(10, TimeUnit.SECONDS)
try {
clickOn(R.id.page_great_hall_button_login)
writeTo(R.id.page_login_email, "[email protected]")
writeTo(R.id.page_login_password, "password123")
clickOn(R.id.page_login_button_login)
sleep(10, TimeUnit.SECONDS)
} catch (_: NoMatchingViewException) {
// We should be logged in already in this case
}
assertDisplayed(R.id.page_paginated_inbox_input)
openDrawer()
clickOn("Logout")
assertDisplayed(R.id.page_great_hall_button_login)
}
And here's how the result looks in Android Studio.
If I change the first assertDisplayed to an assertNotDisplayed, I'd expected the test to validly fail there. I say validly because it's a false assertion; R.id.page_paginated_inbox_input should be visible on the screen. Instead, I just get the same result as usual.
It's really weird, because these tests aren't complete duds. I was thinking that that first assertDisplayed wasn't even being reached somehow, because that was where the test consistently kept crashing. Turns out my setup for the test was wrong; the try-catch is supposed to detect if a user's already logged in, but it doesn't work (not that I'd know why, since Espresso isn't telling me anything). If I start the test without already being logged in, it completes exactly as I'd expect it to (but still reports as a failure as in the screenshot). Changing it to assertNotDisplayed does halt the test there as I'd expect to, but again, the reporting is in exactly the same way.
So, the behaviour of the test might be correct, but that yellow exclamation mark is obscuring all feedback somehow.
These functions I'm calling in the test plan come from Barista, in case you're wondering. I don't think Barista is the problem because I'm using it in another project and it works just fine there.
Turns out my setup for the test was wrong; the try-catch is supposed to detect if a user's already logged in, but it doesn't work (not that I'd know why, since Espresso isn't telling me anything).
Update: I managed to fix this.
How did you fix? Just curious.
I recently ran into getting screenshots for non-failing failures (try-catch like yours)
I solved it with this: https://github.com/TWiStErRob/net.twisterrob.libraries/blob/main/twister-lib-android/espresso/src/main/java/net/twisterrob/android/test/espresso/JustFailFailureHandler.java
Example usage: https://github.com/TWiStErRob/net.twisterrob.libraries/blob/56b7c95950e08cea0ce52ddc26e454f0620e436b/twister-lib-android/espresso/src/main/java/net/twisterrob/android/test/espresso/EspressoExtensions.java#L71
I used ViewInteraction.withFailureHandler as explained in one of the answers here. I checked for the login button to not exist if a user's already logged in, and added the login logic to the failure handler in the case that the button exists.
Here's a logcat dump from the device. To make it easier to digest, I cut it down to start from after the last log entry that comes directly from the app I'm testing, to end at a log entry that specifically mentions a crash. In other words, it's a recording from the last step of the test while it's running, to the supposed abnormality of its closure. If there's anything that would suggest a fault, it'll probably be in here.