我一直在尝试在Android Studio中运行简单的检测测试,但没有任何成功。 我按照Unit Tests的指南进行操作,效果很好。现在,我想测试难以模拟的组件。 当我按照guide on instrumented tests时,我最终会遇到依赖错误。
我做了什么:
安装Android测试支持库(Android支持存储库,第17版)。
在src中创建一个目录androidTest。添加以“test”结尾的Java文件夹+包。
@RunWith(AndroidJUnit4.class) public class ServerRequestInstrumentationTest { @Test public void test(){ LogC.d("Here we go testing !"); } }
@RunWith(Suite.class) @Suite.SuiteClasses({ServerRequestInstrumentationTest.class}) public class TestSuit { public TestSuit(){} }
apply plugin: 'com.android.application' android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { applicationId "com.mydomain.app" minSdkVersion 9 targetSdkVersion 22 versionCode 28 versionName "2.0.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' lintOptions { disable 'MissingTranslation' } } } sourceSets { main { java.srcDirs = ['src/main/java'] } } } dependencies { compile 'com.android.support:support-v4:22.2.0' compile 'com.android.support:appcompat-v7:22.2.0' wearApp project(':wear') compile project(':moreapps') compile project(':lib_repair') compile project(':bugreport') //testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:1.10.19' androidTestCompile 'junit:junit:4.12' androidTestCompile 'org.hamcrest:hamcrest-library:1.1' androidTestCompile 'com.android.support.test:runner:0.3' androidTestCompile 'com.android.support.test:rules:0.3' }
我刚刚添加了行androidTestCompile 'junit:junit:4.12'
,否则无法识别注释@RunWith(AndroidJUnit4.class)
。
现在,当我启动测试时,我得到一个Gradle构建错误。
错误:任务':app:dexDebugAndroidTest'的执行失败。
com.android.ide.common.process.ProcessException:org.gradle.process.internal.ExecException:进程'命令 '/ usr / lib / jvm / jdkoracle / bin / java''以非零退出值2结束
有什么建议吗?我是否想念测试库?
谢谢
答案 0 :(得分:1)
好的,终于搞定了。
经过一番搜索,我发现Gradle控制台输出错误:
AGPBI: {"kind":"simple","text":"UNEXPECTED TOP-LEVEL EXCEPTION:","sources":[{}]}
AGPBI: {"kind":"simple","text":"com.android.dex.DexException: Multiple dex files define Lorg/hamcrest/TypeSafeMatcher;","sources":[{}]}
在我的gradle构建中更改了一行后,Gradle成功构建了项目,并且我能够运行简单的仪器化测试。
要更改的行:
androidTestCompile 'org.hamcrest:hamcrest-library:1.1'
到
testCompile 'org.hamcrest:hamcrest-library:1.1'
我不知道为什么Gradle会在一个案例中抱怨,而不是另一个案例......
答案 1 :(得分:0)
仪器测试与单元测试不同。您必须按特定类扩展测试类。有关详细信息,请查看Android Testing Fundamentals。此外,您不需要JUnit进行Instrumentaion测试。
此外,您必须将构建变体从单元测试切换到Android Instrumentation测试,如此处所述Unit testing in android studio
示例:强>
这是android中的一个仪器测试示例:
public class ExampleITest extends AndroidTestCase {
@Override
public void setUp() throws Exception {
super.setUp();
InputStream is = getContext().getAssets().open("test.xml");
XmlParser parser = new XmlParser(getContext());
parser.parse(is);
...
}
@MediumTest
public void testSomething() throws Exception {
// test some data your parser extracted from the xml file
...
}
}
如您所见,您可以访问上下文等。 对于此测试,gradle文件中不需要特定的依赖项。
我还没有听说过带有注释的Instrumantation测试。也许我应该在网上查找;)
答案 2 :(得分:0)
尽管@ Gordark的回答不会引发任何错误如果您想在仪器测试中使用Hamcrest,它不是一个合适的解决方案,它只适用于您的本地JVM测试。
我发现使用1.3版本的hamcrest-library实际上有效,只需替换
androidTestCompile 'org.hamcrest:hamcrest-library:1.1'
与
androidTestCompile 'org.hamcrest:hamcrest-library:1.3'
它应该有效。我认为这与junit和hamcrest的冲突版本有关。我猜hamcrest 1.1取决于junit版本4.12,而hamcrest 1.3取决于junit v4.12
答案 3 :(得分:0)
Your answer包含对问题的提示。你在那里说Gradle给出了一个错误。这是因为androidTestCompile
的其他依赖项之一依赖于hamcrest。这称为传递依赖。这也意味着您可以完全删除对hamcrest的明确要求。您的更改将hamcrest添加为testCompile
的依赖项,用于在开发计算机上本地运行的单元测试,而不是在Android设备或模拟器上运行。如果您没有进行单元测试,则不需要这样做。即使你开始编写单元测试,你也可能不需要明确依赖hamcrest。