2

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

我做了什么:

  • 安装 Android 测试支持库(Android Support Repository,rev 17)。

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

  • 添加一个简单的测试类
 @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'
}

我只是添加了 line ,否则无法识别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 结束

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

谢谢

4

4 回答 4

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 在一种情况下抱怨而不是在另一种情况下抱怨......

于 2015-09-03T09:49:45.257 回答
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 bellow 4.12 的版本,而 hamcrest 1.3 依赖于 junit v4.12

于 2015-12-19T11:17:34.213 回答
0

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

于 2016-02-10T02:35:44.203 回答
0

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

此外,您必须将构建变体从单元测试切换到 Android 仪器测试,如此处所述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 文件中不需要特定的依赖项。

我还没有听说过仅带有注释的仪器测试。也许我应该在网上查一下;)

于 2015-09-02T08:58:33.637 回答