Espresso测试的Android Studio项目设置

use*_*395 1 java android android-studio android-espresso

大约一个星期前,我问过这个问题

为什么库模块android.support.test在添加依赖项中不可见

经过多次头部刮擦和项目设置变形后,我发现这个app/build.gradle依赖配置让我比以前更进一步,因为至少项目编译但是在尝试运行时没有构建:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion '22.0.1'

    defaultConfig {
        applicationId "com.my.package.name"
        minSdkVersion 8
        targetSdkVersion 22
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
    sourceSets { main { java.srcDirs = ['src/main/java', 'src/androidTest/java'] } }

    packagingOptions {
        exclude 'LICENSE.txt'
    }

}

dependencies {
    compile 'com.android.support:appcompat-v7:22.1.0'
    compile 'com.android.support:support-v4:22.1.0'
    compile 'com.android.support.test.espresso:espresso-core:2.1'
    compile 'com.android.support.test:testing-support-lib:0.1'
}
Run Code Online (Sandbox Code Playgroud)

请注意,compile而不是androidTestCompile测试支持依赖项.使用androidTestCompile上述问题中提到的问题的结果.

另请注意sourceSets声明中的两个srcDirs.当我手动创建androidTest/java目录时,该声明自动设置.这应该以不同的方式宣布吗

同样,getDefaultProguardFile在ide中用工具提示"无法解析符号'getDefaultProguardFile'"加下划线.如果这是至关重要的.

这种新的启示,切换androidTestCompilecompile,让我相信有什么毛病我成立了项目结构的单元测试的方式.这是我的项目结构图:项目文件夹结构

我应该提一下,从Eclipse迁移时会自动创建这个项目/模块结构.通过图标装饰,它看起来至少将我的测试类识别为测试类.

但现在我陷入了这个错误:

错误:任务':mymodule:dexDebug'的执行失败.com.android.ide.common.internal.LoggedErrorException:无法运行命令:C:\ Users\myuser\AppData\Local\Android\sdk\build-tools\22.0.1\dx.bat --dex --no- optimize --output C:\ Users\myuser\AndroidstudioProjects\myproject\mymodule\build\intermediates\dex\debug --input-list = C:\ Users\myuser\AndroidstudioProjects\myproject\mymodule\build\intermediates\tmp\dex\debug\inputList.txt错误代码:2输出:UNEXPECTED TOP-LEVEL EXCEPTION:com.android.dex.DexException:多个dex文件定义Landroid/support/test/BuildConfig; 在com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)在com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)在com.android.dx.merge.DexMerger.mergeClassDefs (DexMerger.java:535)在com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)在com.android.dx.merge.DexMerger.merge(DexMerger.java:189)在com.android. dx.command.dexer.Main.mergeLibraryDexBuffers在com.android.dx.command.dexer.Main(Main.java:454)在com.android.dx.command.dexer.Main.runMonoDex(Main.java:303).在com.android.dx.command.Main.main(Main.java:106)的com.android.dx.command.dexer.Main.main(Main.java:215)运行(Main.java:246)

不确定这是来自我的项目设置还是来自库,因为在support.test库上使用了编译.

任何关于为什么androidTestCompile不起作用的建议都表示赞赏.

另外,我在2天前从SDK Manager到22.0.1的所有最新更新都无济于事.

我注意到的另一件事是我似乎发现包含com.google.common包的唯一jar.*在espresso库中.(com.google.common.*是测试库的依赖项.)但是当我使用winzip检查espresso库jar时,所有com.google.common.*包文件夹结构都存在,但是没有.class文件包文件夹或子文件夹.只是提一下,以防它提供线索.也许它也是我错过的其他地方.

谢谢!

编辑:

我的源码集现在看起来像这样

sourceSets {
    main {
        java.srcDirs = ['src/main/java']
     }
}
Run Code Online (Sandbox Code Playgroud)

和依赖

dependencies {
    compile 'com.android.support:appcompat-v7:22.1.0'
    compile 'com.android.support:support-v4:22.1.0'
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.1'
    androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
    androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.0'
}
Run Code Online (Sandbox Code Playgroud)

我仍然无法android.support.test在我的测试类中解析(test在这些行上显示为红色):

import android.support.test.InstrumentationRegistry;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.closeSoftKeyboard;
import static android.support.test.espresso.action.ViewActions.typeText;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
Run Code Online (Sandbox Code Playgroud)

我不应该在外部库中看到测试支持,espresso-core和espresso-contrib? 外部图书馆

You*_*jae 6

以下是我基于Android Studio 1.1.0 + Espresso 2.0 +支持库v11 + gradle环境的Espresso gradle设置.您可能错过了androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.0'图书馆.

dependencies {
    // ...
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0'
    androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
    androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.0'
}

android {
    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 21
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    sourceSets {
        packagingOptions {
            //...
            exclude 'META-INF/LICENSE.txt'
            exclude 'LICENSE.txt'
        }
    }
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src/main/java']
            res.srcDirs = ['res']
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

关于目录,是的.只需维护androidTestmainsrc文件夹下.但是,您的设置不会使IDE将androidTest文件夹识别为测试项目文件夹.为此,我认为具有相同包名的两个项目会导致多dex错误.androidTestCompile在gradle依赖项和清理/重建项目中使用与espresso相关的行.

请注意,您必须将所有引用的项目gradle设置为相同的testInstrumentationRunner.

我也花了很多时间让它发挥作用.我写了韩语教程来设置和运行Espresso.对于该语言很抱歉,但屏幕截图可能会有所帮助,或者您可以尝试使用Google翻译来阅读它.

编辑.附录如下

我想为什么你的IDE没有在androidTest文件夹中显示绿色(意味着测试项目),并发现你的gradle设置似乎是错误的.

{ main { java.srcDirs = ['src/main/java', 'src/androidTest/java'] } }行使IDE识别androidTest是一个Project文件夹而不是Test Project文件夹.删除第二个.androidTest自动识别为测试项目.