我正在试图找出IntelliJ / Android报告“空测试套件”的原因。我有一个带有两个IntelliJ模块的小项目(Eclipse中的“Projects”)。 Unit测试模块有自己的AndroidManifest.xml,我在底部粘贴了它。我正在尝试运行ActivityUnitTestCase
,因为测试将取决于Context
- 对象。
主模块的包名称为nilzor.myapp
。测试模块的pacakge名称为nilzor.myapp.tests
为什么测试运行器不会将testBlah()
- 方法视为测试?
<?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>
这是我的测试课:;
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);
}
}
我已阅读testing fundamentals,activity testing document,并尝试关注此Hello world test blog,即使它适用于Eclipse。我无法让测试运行员找到并运行我的测试。我做错了什么?
我仍然不确定的一些问题是:
nilzor.myapp.tests
但这篇文章的主要问题是为什么测试运行员没有检测到我的测试?
答案 0 :(得分:71)
您需要为测试类提供默认构造函数,例如:
package nilzor.myapp.tests;
public class NilzorSomeTest extends ActivityUnitTestCase<ActivityYouWantToTest>{
public NilzorSomeTest(){
super(ActivityYouWantToTest.class);
}
@SmallTest
public void testBlah(){
assertEquals(1,1);
}
}
关于你的其他问题:
没有。我的测试仍然没有任何注释,但我想这是一个很好的做法。它允许您指定要运行的测试的大小。有关详细信息,请参阅What is the purpose of @SmallTest, @MediumTest, and @LargeTest annotations in Android?。
是的,您需要“test”前缀。当没有“test”前缀时,InteliJ给出“方法从未使用过”警告,并在测试运行期间跳过该方法。
是。我将我的测试组织成子包,它似乎运行良好。
答案 1 :(得分:54)
答案 2 :(得分:9)
以上都没有为我修好。有帮助的是following the instructions:
创建测试配置
在Android Studio中:
- 打开运行菜单 - &gt; 编辑 配置
- 添加新的 Android测试 配置
- 选择模块
- 添加特定模块 仪表运行员:
android.support.test.runner.AndroidJUnitRunner
运行新创建的配置。
答案 3 :(得分:5)
我有类似的问题。不确定为什么会这样,但我能够通过以下方式解决这个问题:&#34; File&#34; &GT; &#34;使高速缓存无效/重新启动&#34;在Android Studio中。
答案 4 :(得分:4)
我不知道它是否对Android Studio有帮助,但我遇到了某种Intellij-Gradle冲突。 通过在测试文件上“右键单击”并点击“编译文件... Test.java”来解决它。之后我可以再次进行单一测试。
答案 5 :(得分:4)
我在Android Studio 2.3.1上遇到了同样的问题,原来这只是AS的一个错误。在版本2.2.1上运行相同的测试表现良好。
如果您只在Cannary频道上运行Android Studio,我建议您也安装稳定版本。 http://tools.android.com/tips/using-multiple-android-studio-versions
答案 6 :(得分:3)
我的测试运行正常,直到gradle
和android studio升级。
除了为测试添加默认构造函数之外,您可能需要执行其中一些操作才能使测试套件正常工作
在src/
下创建androidTest/java/<your-package-name>/test
。请注意androidTest
。包括instrumentTest
在内的任何其他内容均无效。
将此添加到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
将其添加到AndroidManifest.xml
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:label="Tests for my packaged app"
android:targetPackage="<my-package-name>.test" />
答案 7 :(得分:3)
对于Intellij 15,我通过以下方式解决了这个问题:
答案 8 :(得分:3)
显然,您需要一个目标设备来运行您的测试,因为它们是仪表测试。出于某些原因,Android studio 有时不会要求您指向此目标设备,只是提示“空测试套件”消息。 有不同的方法来解决这个问题,这里有几个:
运行您的主应用并选择目标设备或
转到运行(运行/运行... /编辑配置)配置并修改部署目标选项
答案 9 :(得分:2)
在我的情况下,问题是由于我的代码中的错误导致的,实际上是在应用程序类中,因此目标活动未打开并且测试输出打印
清空测试套件错误
我尝试使用adb shell am instrument -w -r -e package your.package -e debug false android.support.test.runner.AndroidJUnitRunner
直接从终端运行测试。有了它,它会为您打印更多关于异常的信息。
答案 10 :(得分:2)
我有这个问题,因为我在build.gradle中有这个:
testOptions {
execution "ANDROID_TEST_ORCHESTRATOR"
}
即使我没有使用Android Test Orchestrator(必须错误地复制教程)。
评论说它解决了我。
答案 11 :(得分:1)
我遇到了同样的问题,原因是我的测试类在类名末尾没有测试!
答案 12 :(得分:1)
我刚刚重命名了文件并解决了问题。
答案 13 :(得分:1)
就我而言,之前的答案都没有奏效。解决方案是简单地将测试类移动到另一个包。
这发生在androidTest/
答案 14 :(得分:1)
我的问题是由我的测试用例的@BeforeClass
方法中抛出异常引起的。它是如何导致测试失败的 - 我只是通过检查logcat输出找到它。
我修复了异常,突然我的测试正在运行!
答案 15 :(得分:1)
今天遇到问题 - 无法运行带有空套件错误的检测Android测试 - 我发现了一个关于这个问题的git问题,感谢Stephan Linzner,我可以运行测试。
tl; dr 您必须右键单击测试包而不是类才能运行测试。
参考:https://github.com/googlecodelabs/android-testing/issues/27#issuecomment-219074863
答案 16 :(得分:1)
就我而言,我正在研究的项目有几个模块。我发现这个错误的解决方案都没有帮助我,然后我意识到,如果我在build.gradle文件的两个中添加了测试依赖项,那么测试就会神奇地开始工作。如果您的测试仅存在于其中一个模块中并不重要,则两个gradle文件都必须包含依赖项和testInstrumentationRunner值。
所以,如果像我一样,其他答案都没有帮助过你,请尝试将这些行添加到每个模块的build.gradle文件中:
android {
....
defaultConfig {
...
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
}
然后还添加:
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'
}
答案 17 :(得分:1)
其他解决方案都没有为我工作,但我只需卸载现有的应用程序或测试套件,然后运行测试就可以实现这一点。
答案 18 :(得分:0)
当我用注解 public class MyData
{
public int id { get; set; }
public MySqlDateTime currentDateTime { get; set; }
// Other fields
public MyData()
{
// Empty constructor
}
}
错误地标记了一个非模拟类变量时,我发生了这种情况
删除了注释,测试成功运行。
这是在Android Studio上的Junit 4.5中发生的
答案 19 :(得分:0)
这不是解决方案,而是一种可让您快速回到正轨的解决方法:
首先,找到一个有效的测试。我在编写一个新测试时遇到“空测试套件”错误。我进行了其他测试,它们照常工作。
复制有效的测试文件。运行它以确保此副本像原始副本一样工作。
取下机身,并用新的测试代码替换。
测试现在应该可以工作。
我们花了大约两个小时试图找到原因,但无济于事。
答案 20 :(得分:0)
我有以下代码块
@get:Rule
lateinit var activityScenario: ActivityScenario<HomeActivity>
因为我需要根据不同的测试用例根据活动目的传递不同的参数。当我删除@get:Rule
时,测试再次开始工作。
答案 21 :(得分:0)
我在@BeforeClass方法中在db中进行了一些插入。 我意识到我有一个对象/数据库映射问题。这个数据映射问题是我这个问题的原因。
答案 22 :(得分:0)
在带有spock框架的Android工作室中,我已经将我的gradle版本从2.2.2改为3.2.1,一切顺利。
答案 23 :(得分:0)
尝试在Android Studio 3.0项目中运行本地单元测试时遇到“空测试套件”错误。
在阅读Android Developer documentation后,我很快意识到问题是由我的gradle配置引起的,其中包括以下几行。
testImplementation 'com.android.support.test:runner:0.5'
testImplementation 'com.android.support.test:rules:0.5'
AndroidJUnitRunner类是一个JUnit测试运行器,允许您在 Android设备上运行JUnit 3或JUnit 4样式的测试类。
由于我的测试是本地的,因此不需要在任何设备上运行,因此删除上面的com.android.support.test ...条目使我能够执行单元测试。
答案 24 :(得分:0)
接受的答案并没有解决我的问题。所以我决定复制默认情况下在Android Studio中创建的ExampleInstrumentedTest
并且运行没有任何问题,在复制过程中重命名(复制后没有重构 - >重命名!)并将我的单元测试的内容粘贴到它。之后,错误消失了。
答案 25 :(得分:0)
就我而言,我在androidTest/java/<package.name>/MyTestingClass
进行了仪器化测试,但我已将当前的构建版本设置为&#34; preproduction&#34;。这就是重点!正如Android Studio documentation中所述:
默认情况下,所有测试都针对调试版本类型运行。
消息Class not found. Empty test suite.
一直出现,直到我这样做:
将此行添加到 build.gradle :
android{
[...]
testBuildType "preproduction"
}
然后我再次执行测试,这次他们运行得非常完美!
答案 26 :(得分:0)
我没有做任何事情,经过半天的痛苦后问题消失了,我多次打开并关闭项目,手动运行每个班级测试,也许这就解决了我的问题。
答案 27 :(得分:0)
以下是我在Android Studio突然决定停止运行/调试测试时所经历的调试步骤(而且男孩经常这种情况经常发生!!):
我会在遇到它们时添加更多修复程序!
答案 28 :(得分:0)
测试类可能会从编译中排除。将其修复为setting-compiler-exclude。
答案 29 :(得分:0)
我有一个原始Java项目,正在发生这种情况。简单的Java + JUnit4。它绝对存在于.idea /或.iml文件中。我报废了,重新导入,最后再次测试了。
答案 30 :(得分:0)
这篇文章帮助了我:Empty test suite
基本上我必须在我的src目录下创建一个包 - instrumentTest / java ,并将所有测试放在那里。然后我可以单独执行这些测试。