Android Studio -- clear application data for Instrumentation Test
Solution 1
I know it's been a while, and hopefully by now you will have this issue sorted.
I ran into that same issue today, and crashed here without any solution.
But I managed to make it work by calling my task from the test configuration.
Step 1 : Go to your test configuration
Step 2 : Simply add the gradle task you created
By the way, the task in my case simply looks like this :
task clearData(type: Exec) {
def clearDataCommand = ['adb', 'shell', 'pm', 'clear', 'com.your.application']
commandLine clearDataCommand
}
Hope this will help someone :)
Solution 2
With Android Test Orchestrator it is easier to provide this option via gradle script.
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'
}
Below is the link for Android Test Orchestrator
https://developer.android.com/training/testing/junit-runner#using-android-test-orchestrator
![Razzle Shazl](https://i.stack.imgur.com/ZnZP0.jpg?s=256&g=1)
Razzle Shazl
Updated on June 06, 2022Comments
-
Razzle Shazl about 2 years
How can I get Android Studio (AndroidJunitRunner) to clear application data preceding an instrumentation test without manually running
adb
command?I discovered that
android.support.test.runner.AndroidJUnitRunner
kind of cheats -- it never actually invokesconnectedCheck
orconnectedAndroidTest
.-
When run from command line
$ gradle connectedCheck
:MyMainApp:assembleDebug UP-TO-DATE :MyMainApp:assembleDebugTest UP-TO-DATE :MyMainApp:clearMainAppData :MyMainApp:connectedCheck
-
When run from within IDE by clicking the instrumentation test configuration (green Android robot logo with red/green arrows)
**Executing tasks: [:MyMainAppApp:assembleDebug, :MyMainAppApp:assembleDebugTest]**
As you can see, the last gradle target is
assembleDebugTest
I had added a hook onto
connectedCheck
inbuild.gradle
to clear the data of the main app before starting the instrumentation test.// Run 'adb' shell command to clear application data of main app for 'debug' variant task clearMainAppData(type: Exec) { // we have to iterate to find the 'debug' variant to obtain a variant reference android.applicationVariants.all { variant -> if (variant.name.equals("debug")) { def clearDataCommand = ['adb', 'shell', 'pm', 'clear', getPackageName(variant)] println "Clearing application data of ${variant.name} variant: [${clearDataCommand}]" commandLine clearDataCommand } } } // Clear Application Data (once) before running instrumentation test tasks.whenTaskAdded { task -> // Both of these targets are equivalent today, although in future connectedCheck // will also include connectedUiAutomatorTest (not implemented yet) if(task.name.equals("connectedAndroidTest") || task.name.equals("connectedCheck" )){ task.dependsOn(clearMainAppData) } }
I realize that alternatively I could implement a 'clear data' button in the main app and have the instrumentation app click through the UI, but I find that solution undesirable.
I looked at
AndroidJUnitRunner
API and there are hooks viaRunlistener
interface but hooks are during the context of the test app, i.e. running on device, and Android forbids one app from modifying another app. http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.htmlBest answer goes to you if you can help me trigger one of the following automatically from within Android Studio:
- execute a command line
adb shell pm clear my.main.app.package
, - or preferably invoke my gradle task
clearMainAppData
I'm also all ears if there is an alternate way. Surely with device testing automation there should be a clear way to clear application data?
Thank you!
-
-
ZelvaJan about 8 yearsIf someone has a problem: "more than one device and emulator" and only one actually running device then try restart your adb. Just need: "adb kill-server" and then "adb devices".
-
WindRider almost 8 yearsWorks but the task is started only once. Do you know some way to start before each test?
-
NSimon almost 8 yearsIf you look at the first screenshot, you'll see that the very bottom box that says "Before launch". Make sure you have that gradle task defined there (by following step2). Now each time you launch that configuration, the gradle task (here clearData) will be executed first, and then your configuration. Note that this solution only works when you only have one device connected
-
Srinivas Jayaram about 6 yearsHow to save the result of the command line execution, suppose I have commandLine 'pwd' it returns the path directory, so how to save it to a variable that it can be accessed by another task too
-
Matt Wolfe over 4 yearsThis is the best way to do it if you want the data cleared for each test.
-
Emjey over 4 yearsBut when I apply Orchestrator, I instantly get "No tests found" the next time I try to run
-
Ivan Morgillo about 4 yearsTwo missing bits:
testOptions { animationsDisabled = true execution 'ANDROIDX_TEST_ORCHESTRATOR' }
anddependences { androidTestUtil 'androidx.test:orchestrator:1.2.0' }