Right clicking on a package and selecting Run Tests... results in the message No tests were found. In earlier versions of Android Studio my tests were found and would run using this method. Running test classes individually seems to work still. I've tried Invalidate Cache / Restart, but still running into the same issue.
Logs:
---- IntelliJ IDEA coverage runner ----
sampling ...
include patterns:
exclude patterns:0 test classes found in package '<default package>'
Process finished with exit code 254
Empty test suite.
Any point in the right direction would be appreciated. Thanks!
I've seen this happen when AS tries to run unit tests (test/ folder) instead of instrumentation tests (androidTest/ folder) or the package specification for the configuration is wrong.
Make sure that when you right click a folder to run the package of tests, and select "Run", that the icon has a little droid on it to indicate it's treating the folder as android tests:
If it doesn't, continue to step 2. If it does, skip to step 3.
Sometimes AS gets confused and thinks Android tests are unit tests. To fix that, click the Run Configuration icon in the toolbar and select "Edit Configurations..."
You should see an option for Android Tests:
Select this and copy that configuration, then on the right, change it from "All in Module" to "All in Package"
Make sure the configuration for the package tests specifies the full package you want to test:
Once your configuration is correctly set up to run Android tests and explicitly indicate the full and correct package of tests to run, it should work.
Hope that helps!
Fixed in Android Studio version 3.2.1
Invalidate caches and restart fixed this for me, always worth trying.
If you are using JUnit 5 and already have JUnit 4 synced in your build.gradle then make sure that #Test annotation should be annotated from import org.junit.jupiter.api.Test
This is classic. Some of these steps might help:
Kill Gradle daemons: ./gradlew --stop
Reimport the project: close the Android Studio window, delete the project from the list of recent projects, Import again.
Report it to the Tools team: https://developer.android.com/studio/report-bugs
In my case I inadvertently had both JUnit4 and JUnit5 on the classpath.
Even though I was trying to use JUnit5 in my tests, one of my test dependencies had a transitive dependency on the older version.
After cleaning up the classpath Android Studio (3.2.1) was able to find the tests again.
When I run a Andriod test (junit) test in Android Studio I get the folowing errormessage.
Exception in thread “main” java.lang.NoClassDefFoundError: junit/textui/ResultPrinter.
I assume the error is because it cannot find the junit.jar file.
When I follow below junit setup it does not fix the error:
http://www.tutorialspoint.com/junit/junit_environment_setup.htm
I cannot get above setup working. It still cannot find the junit classes.
Any ideas how to fix the problem.
Did you put your test class in correct place in the folder structure, Martin?
Look at the table under "Flavors and build types support" on http://tools.android.com/tech-docs/unit-testing-support
It resolved the issue for me, but I had to move the test class (and create folders) manually - while Android Studio can generate the test suite automatically for you (Go to... Test, after right-clicking on the class header), it doesn't offer to put it in right location by default, so it can be confusing.
Also make sure to set Test Artifact to "Unit Tests" in Build Variants tab, but the official tutorial says that more explicitly so I assume that's not what you overlooked.
I understand your question was dated, but maybe someone stumbles upon it like I only just did struggling with this issue myself ;) And guys, remember - highest voted answers on StackOverflow that tell you to stick to Android tests and drop JUnit are obsolete now, Android Studio supports JUnit tests that run on your PC directly, as explained in the link I posted above. Of course they don't give you access to instrumentation - I use them to test my "pure" Java logic which is platform agnostic.
I am banging my head against the wall here trying to figure out why IntelliJ/Android is reporting "Empty test suite". I have a small project with two IntelliJ Modules ("Projects" in Eclipse). The Unit test module has its own AndroidManifest.xml, which I have pasted at the bottom. I am trying to run an ActivityUnitTestCase, since the tests will be dependent upon the Context-object.
The package name of the main module is nilzor.myapp. The pacakge name of the test module is nilzor.myapp.tests
Why is not the test runner detecting the testBlah()-method as a test?
<?xml version="1.0" encoding="utf-8"?>
<!-- package name must be unique so suffix with "tests" so package loader doesn't ignore us -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="nilzor.myapp.tests"
android:versionCode="1"
android:versionName="1.0">
<!-- We add an application tag here just so that we can indicate that
this package needs to link against the android.test library,
which is needed when building test cases. -->
<application>
<uses-library android:name="android.test.runner"/>
</application>
<!--
This declares that this application uses the instrumentation test runner targeting
the package of nilzor.myapp. To run the tests use the command:
"adb shell am instrument -w nilzor.myapp.tests/android.test.InstrumentationTestRunner"
-->
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="nilzor.myapp"
android:label="Tests for nilzor.myapp"/>
</manifest>
And here is my test class:;
package nilzor.myapp.tests;
public class NilzorSomeTest<T extends Activity> extends ActivityUnitTestCase<T>{
public NilzorSomeTest(Class<T> activityClass){
super(activityClass);
}
#SmallTest
public void testBlah(){
assertEquals(1,1);
}
}
I have read the testing fundamentals, the activity testing document, and tried following this Hello world test blog, even though it is for Eclipse. I cannot get the test runner to find and run my test. What am I doing wrong?
Some of the questions I still feel unsure about are:
Do I need an Annotation above the Unit test method?
Do I need to prefix the method with "test", or is that just for JUnit tests?
Can I have tests in sub-packages of nilzor.myapp.tests?
But the main question of this post is why does not the test runner detect my test?
You need to provide default constructor for your test class, for example:
package nilzor.myapp.tests;
public class NilzorSomeTest extends ActivityUnitTestCase<ActivityYouWantToTest>{
public NilzorSomeTest(){
super(ActivityYouWantToTest.class);
}
#SmallTest
public void testBlah(){
assertEquals(1,1);
}
}
about your other questions:
No. My tests still run without any annotations, but I guess it's a good practice to have them. It allows you to specify size of tests to run. See What is the purpose of #SmallTest, #MediumTest, and #LargeTest annotations in Android? for more detail.
Yes, you need "test" prefix. InteliJ gives "method never used" warning when there's no "test" prefix, and skips that method during test run.
Yes. I have my tests organized into subpackages and it seems to be working well.
If this is happening "all of a sudden" or "it was working 5 minutes ago" my solution was to go into Run/Debug configurations and remove any configurations under "Android Tests". Sometimes these configurations get corrupted if I refactor the class under test (for example by moving to an new package).
None of the above fixed it for me. What helped was following the instructions:
Create a test configuration
In Android Studio:
Open Run menu -> Edit
Configurations Add a new Android Tests
configuration Choose a module Add a specific
instrumentation runner:
android.support.test.runner.AndroidJUnitRunner
Run the newly created configuration.
I had a similar issue. Not sure why this is occurring but I was able to fix it by going to: "File" > "Invalidate Caches/Restart" in Android Studio.
I don't know if it helps for Android Studio, but I had some kind of Intellij-Gradle conflict.
Solved it by "right-clicking" on the test-file and hit "compile file ...Test.java". After that I could run single tests again.
I had the same issue on Android Studio 2.3.1, turns out it was just a bug with AS. Running the same test on version 2.2.1 performs fine.
If you're only running Android Studio on the Cannary channel, I recommend you also install a stable version as well. http://tools.android.com/tips/using-multiple-android-studio-versions
I had tests that were running fine until gradle and android studio got upgraded.
Apart from adding a default constructor to your tests, you might need to do some of these things to get your test suite to work
Under src/ create androidTest/java/<your-package-name>/test . Note the androidTest. Anything else including instrumentTest will not work.
Add this to build.gradle
sourceSets {
testLocal {
java.srcDir file('src/androidTest/java')
resources.srcDir file('src/androidTest/resources')
}
}
android{
sourceSets {
instrumentTest.setRoot('src/androidTest/')
}
}
dependencies{
testLocalCompile 'junit:junit:4.11'
}
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
Add this to the AndroidManifest.xml
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:label="Tests for my packaged app"
android:targetPackage="<my-package-name>.test" />
For Intellij 15 I resolved this issue by:
Opening the 'Project Structure' settings
Clicking 'Modules' (on left)
'Sources' Tab
a. Right click on your source directory (usually src) click 'Source'.
b. Right click on your test directory click 'Test'
c. Right click on your out directory click 'Excluded'
Go to 'Paths' tab
a. Click 'Use module compile output path' radio button
b. Select your output path directory for 'Output Path'
c. Select
your test path directory for 'Test output Path'
Click Ok
Obviously, you need a target device as to run your tests as they are instrumented tests. For some reasons, Android studio sometimes does not ask you to point to this target device and just prompt the "Empty Test Suite" message.
There are different ways to fix this, here are a few :
run your main app and select a target device or
go to the Run (Run/Run.../Edit Configurations) configuration and modify the Deployement Target Options
I had this problem because I had this in my build.gradle:
testOptions {
execution "ANDROID_TEST_ORCHESTRATOR"
}
Even though I wasn't using the Android Test Orchestrator (must have copyied from the tutorials by mistake).
Commenting that out solved it for me.
In my case, none of the previous answers worked. The solution was to simply move the test class to another package.
This happened under androidTest/
In my case that problem was caused due to mistake in my code, actually that was in application class, so target activity wasn't opened and test output prints
Empty test suite error
I have tried run tests directly from terminal with adb shell am instrument -w -r -e package your.package -e debug false android.support.test.runner.AndroidJUnitRunner. With this it prints for you much more about exception.
None of the other solutions worked for me, but I was able to get this working simply by uninstalling the existing app or test suite, then running the tests.
In my case, the project I was working on had a couple of modules. None of the solutions I found for this error helped me, and then somehow I realized that if I added the testing dependencies in BOTH of the build.gradle files, the tests magically started working. It doesn't matter if your tests live in only 1 of the modules, both gradle files must include the dependencies and the testInstrumentationRunner value.
So, if like me, none of the other answers have helped you, try adding these lines to the build.gradle file of each of your modules:
android {
....
defaultConfig {
...
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
}
and then also add:
dependencies {
...
// Test
androidTestCompile 'com.android.support:support-annotations:23.4.0'
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support.test:rules:0.5'
}
I just renamed the file and the problem fixed.
I had the same issue, and the reason was my test class did not have Test at the end of the class name!
My issue was caused by an exception being thrown in the #BeforeClass method of my test case. It some how wasn't causing the test to fail - I only found it by inspecting the logcat output.
I fixed the exception and suddenly my tests were running!
After facing the problem today - not being able to run the instrumented android tests with Empty suite error - I found a git issue about this problem and thanks to Stephan Linzner, I could run the tests.
tl;dr You have to right click the test package and not the class in order to make the tests run.
Reference: https://github.com/googlecodelabs/android-testing/issues/27#issuecomment-219074863
This article helped me: Empty test suite
Basically I had to create a package - instrumentTest/java - under my src directory, and put all the tests there. Then I could execute these tests individually.
I had a raw Java project where this was occurring. Simply Java + JUnit4. It definitely resides with something in your .idea/ or .iml files. I scrapped mine, re-imported, and finally the tests ran again.
The test class may excluded from the compilation. Fix it in setting-compiler-exclude.
Here are my debugging steps I go through when Android Studio all of a sudden decides to stop running / debugging tests (And boy does this happen embarassingly often!!):
Build: → Rebuild project
Restart Device: Restart your device/emulator and try again
Device switch: if you have both a regular phone and an emulator unplug one and try running it with just one of the devices
Android Studio: File--> Invalidate caches and restart
Activity Monitor / Task Manager: sort processes by name, see if there is a nameless processes that's using up a lot of ram, this is a "ghost" process from Android studio that must be killed
git revert: try stashing /reverting your latest code. Sometimes there is a compile error that Android Studio / gradle misses and it will just try to run uncompilable code.
Uninstall then reinstall Android Studio.
I will add more fixes as I run into them!
I did nothing and the problem went away after half a day of pain, I opened and closed the projects many times, ran each class tests manually, maybe that fixed my it.
In Android studio with spock framework I've changed my gradle's version from 2.2.2 to 3.2.1 and all goes well.
The accepted answer didn't solve my problem. So I decided to copy ExampleInstrumentedTest which is created by default in Android Studio and runs without any problems, renamed it during the copy process (no Refactor->Rename after copying!) and pasted the contents of my unit test into it. After that the error disappeared.
I experienced the "Empty test suite" error when trying to run local unit tests in my Android Studio 3.0 project.
After reading the Android Developer documentation, I quickly realised that the issue was caused by my gradle config which included the following lines.
testImplementation 'com.android.support.test:runner:0.5'
testImplementation 'com.android.support.test:rules:0.5'
The AndroidJUnitRunner class is a JUnit test runner that lets you run JUnit 3- or JUnit 4-style test classes on Android devices.
Since my tests were local and therefore not required to run on any device, removing the above com.android.support.test... entries enabled me to execute the unit tests.
I was doing some insertions in a db in the #BeforeClass method.
I realised I had an object/database mapping problem. This data mapping problem was the cause of this issue for me.
In my case, I had my instrumented tests in androidTest/java/<package.name>/MyTestingClass, but I had set my current build variant to "preproduction". And there's the point! As specified in Android Studio documentation:
By default, all tests run against the debug build type.
The message Class not found. Empty test suite. kept appearing until I did this:
Add this line to my build.gradle:
android{
[...]
testBuildType "preproduction"
}
Synchronised gradle.
Delete my previous test configurations since they don't take this Gradle synchronisation into account.
Then I executed the tests again and this time they run just perfect!!!
I had this happen to me when I mistakenly marked a non mock class variable with the annotation #Mock
Removed the annotation and the tests ran successfully.
This happened with Junit 4.5 on Android Studio
Not a solution but a workaround that will get you back on track quickly:
Firstly, find a test that works. I was writing a new test where I got the 'empty test suite' error. I ran other tests and they were working as usual.
Copy the test file that does work. Run it to make sure this copy works like the original.
Remove the body and replace it with your new test code.
The test should now work.
We spent about two hours trying to find the cause but to no avail.
(This is an Android SDK tools v17 problem. Expect a fix in v18)
I have a test target project A, and a tester project B.
Project A has FlurryAgent.jar in its libs folder.
Project B has robotium-solo-3.1.jar in its libs folder
When I compile and run them,
cd A
android update project -p .
cd ..
cd B
android update test-project -p . -m ../A
ant all clean debug
ant uninstall
ant installt
ant test
ant test fails to execute tests:
test:
[echo] Running tests ...
[exec]
[exec] com.example.r17.test.TestOne:
[exec] INSTRUMENTATION_RESULT: shortMsg=java.lang.NoClassDefFoundError
[exec] INSTRUMENTATION_RESULT: longMsg=java.lang.NoClassDefFoundError: com.flurry.android.FlurryAgent
[exec] INSTRUMENTATION_CODE: 0
I've read some posts/questions that solve this problem in Eclipse. But I don't think I can run Eclipse on headless Jenkins slave.
Since this post was the first in search engine results when I entered "java.lang.NoClassDefFoundError: com.flurry.android.FlurryAgent" and my issue was not related to Ant at all, I thought I'd add some info for people who might be scratching their heads after re-installing the ADT.
Basically, in Eclipse when you add an external library in the Java Build Path dialog, don't forget to also switch to the Order and Export tab and tick that library's name in the list. This is needed so that the library is found at run-time, not only at compile time :)
http://code.google.com/p/android/issues/detail?id=27608
I submitted the issue to Google and they uploaded a temporary fix. The fix will also be included in v18 release.
"project member x...#android.com, Today (34 minutes ago)
get the anttasks.jar from the bottom of http://tools.android.com/download to replace the one in your sdk."
The file to replace is at \Android\android-sdk\tools\lib\
It took me a very long time to figure this same problem out when using android-junit-report, but with the help of "adb logcat" I discovered that it wasn't actually missing the instrumentation class that I included, but it was missing its inherited superclass. So I needed to put this back into AndroidManifest.xml:
<application>
<uses-library android:name="android.test.runner" />
</application>
I dont have the rep to comment Qi but I think this may be related to my question here:
VerifyError in android test-project build tools v17
Xav has been instrumental in getting this back up and running and looks like hes got a fix
I have the same case and it doesn't work even if I followed Levon's post. Then I realized I need to copy the FlurryAnalytics.jar into the libs folder in my work space to make it work. Hope this helps.
I have just fix this problem "08-14 08:33:43.398: E/AndroidRuntime(6748): java.lang.NoClassDefFoundError: com.flurry.android.FlurryAgent"
I flow the official web when I want to add the flurry to my android app,it tell me add an external library in the Java Build Path dialog, And then I don't forget to also switch to the Order and Export tab and tick that library's name in the list. This is needed so that the library is found at run-time, not only at compile time,But however it do not works until I just remove the jar from build path,and then copy it to the lib. Done!!!