繁体   English   中英

Android Studio 中的插桩测试

[英]Instrumented Tests in Android Studio

我一直在尝试在 Android Studio 中运行简单的仪器测试,但没有成功。 我遵循了单元测试指南,它工作正常。 现在,我想测试难以模拟的组件。 当我按照仪器测试指南进行操作时,我最终会遇到依赖项错误。

我做了什么:

  • 安装 Android 测试支持库(Android 支持库,修订版 17)。

  • 在 src 中创建一个目录 androidTest。 添加 Java 文件夹 + 以“test”结尾的包。

  • 添加一个简单的测试类
 @RunWith(AndroidJUnit4.class) public class ServerRequestInstrumentationTest { @Test public void test(){ LogC.d("Here we go testing !"); } }
  • 添加一个简单的 TestSuit。
 @RunWith(Suite.class) @Suite.SuiteClasses({ServerRequestInstrumentationTest.class}) public class TestSuit { public TestSuit(){} }
  • 修改我的 gradle 文件以添加依赖项。
 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: Process 'command '/usr/lib/jvm/jdkoracle/bin/java'' 以非零退出值 2 结束

有什么建议吗? 我是否错过了有关测试库的某些内容?

谢谢

好的,终于搞定了。

经过一番搜索,我发现 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 在一种情况下抱怨而不是在另一种情况下抱怨......

仪器测试不同于单元测试。 您必须通过特定类扩展您的测试类。 有关更多信息,请查看Android 测试基础知识 此外,您不需要 JUnit 进行 Instrumentaion 测试。

此外,您必须将构建变体从单元测试切换到 Android Instrumentation 测试,如此处所述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 测试。 也许我应该在网上查一下;)

尽管@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 bellow 4.12 的版本,而 hamcrest 1.3 取决于 junit v4.12

您的回答包含对问题的提示。 你在那里声明 Gradle 给出了一个错误。 这是因为androidTestCompile的其他依赖androidTestCompile依赖于 hamcrest。 这称为传递依赖。 这也意味着您可以完全删除对 hamcrest 的明确要求。 您的更改将 hamcrest 添加为testCompile的依赖项,用于在您的开发机器上本地运行的单元测试,而不是在 Android 设备或模拟器上运行。 如果您不进行单元测试,则不需要这个。 即使您开始编写单元测试,您也可能不需要显式依赖 hamcrest。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM