Testing on Android Studio
After watching Google IO 2013 if you couldn't resist the temptation to try out the new svelte Android Studio. You would have soon hit a snag when it came to testing.
Unlike on Eclipse or ADT Bundle, The new Android Studio doesn't require a separate android testing project.
Good news, It's all integrated now within Studio.
There are usually the following options for testing for Android apps
- Instrumentation Tests
- Junit by extending AndroidTestCase (JUnit v3.7)
- Junit (v3.8 or higher) separately
- Popular testing frameworks like Robotium or Robolectric
For the first two scenarios you just need to create the following folder structure under src folder
- src
- - - - instrumentTest
- - - - - Java
- - - - - - com.example.spinner.test
- - - - - - - SpinnerActivityTest.java
You can then run a particular test file or a package of instrumentation tests. The new build automatically generates required config and AndroidManifest.xml file automatically for you.
However, if you need to use JUnit for POJO testing exclusively or using popular frameworks then there is no integrated support yet in Android Studio. You would have to follow the steps below to configure gradle build system that is used in Android Studio.
In build.gradle file inside src folder create the following blocks
- a SourceSet
- a Configuration
- and Dependencies
- a test task
sourceSets {
testLocal {
java.srcDir file('src/test/java')
resources.srcDir file('src/test/resources')
}
}
dependencies {
compile 'org.roboguice:roboguice:2.0'
compile 'com.google.android:support-v4:r6'
testLocalCompile 'junit:junit:4.8.2'
testLocalCompile 'org.robolectric:robolectric:2.1'
testLocalCompile 'com.google.android:android:4.0.1.2'
testLocalCompile 'com.google.android:support-v4:r6'
testLocalCompile 'org.roboguice:roboguice:2.0'
}
task localTest(type: Test, dependsOn: assemble) {
testClassesDir = sourceSets.testLocal.output.classesDir
android.sourceSets.main.java.srcDirs.each { dir ->
def buildDir = dir.getAbsolutePath().split('/')
buildDir = (buildDir[0..(buildDir.length - 4)] + ['build', 'classes', 'debug']).join('/')
sourceSets.testLocal.compileClasspath += files(buildDir)
sourceSets.testLocal.runtimeClasspath += files(buildDir)
}
classpath = sourceSets.testLocal.runtimeClasspath
}
check.dependsOn localTest
It that sounds too much then do not despair there is a plugin in the making for robolectric-plugin
There is more at tools.android.com about the new gradle based build system in Android Studio.
I'm sure there will be better integrated features on the release candidate of Android Studio. Till then enjoy TDD with the sleek intelliJ based Android Studio through these hacks.
Written by Ravi
Related protips
2 Responses
Hi,
thank you for sharing! Unfortunately I stuck with AS 0.3.5. It says JUnit 3.8 error and I don't know how to put JUnit 4.0 dependency before Android dependency in running class path. Do you have any ideas?
Kind regards,
Eugen
Eugen, it was hard but I think I got it working. I followed these instructions: http://blog.futurice.com/android_unit_testing_in_ides_and_ci_environments