Android Studio中的检测测试

时间:2015-09-02 08:53:30

标签: android testing android-studio android-instrumentation

我一直在尝试在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 !");
        }
    }
  • 添加一个简单的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:进程'命令     '/ usr / lib / jvm / jdkoracle / bin / java''以非零退出值2结束

  

有什么建议吗?我是否想念测试库?

谢谢

4 个答案:

答案 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。