【问题标题】:How to place Android (instrumentation) test files outside of project directory?如何将 Android(仪器)测试文件放在项目目录之外?
【发布时间】:2017-08-11 09:43:48
【问题描述】:

我有一个 Android 项目(由 Cordova 生成),我想向其中添加(仪器)测试。它只有一个MainActivity.java 需要测试。

通常这意味着向build.gradle 添加一些依赖项,并使用MainActivityTest 类和一些测试方法创建一个文件/src/androidTest/java/org/example/package/MainActivityTest.java。 (在 Android Studio 中,我什至可以使用 Run -> "Record Espresso Test" 生成这些 - 非常简单且有效)。

不幸的是,我现在要求这些测试文件确实存在于项目目录之外。现有 Cordova 项目应该只有最小的更改(因为它被重新生成并作为构建工件处理)。 MainActivity.java 最好与 Android 项目位于 /android 的根文件夹相同。

我怎样才能做到这一点?


build.gradle 的更改可以添加到真正的build.gradle 已经包含的build-extras.gradle 文件中,因此可以处理。

但我不知道如何将MainActivityTest.java 放在项目文件夹结构之外,并且仍然能够在项目中运行它。

对于 iOS,您可以使用绝对路径将外部文件链接到项目中。这样的东西在这里也很完美。

我查看了sourceSets,但我不确定如何将其集成到已经具有此非默认值的 Cordova Android 项目中(我认为?)sourceSets

android {
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
            jniLibs.srcDirs = ['libs']
        }
    }
    ...
}     

【问题讨论】:

    标签: android cordova android-espresso android-testing android-instrumentation


    【解决方案1】:

    有两种方式:

    1. 您可以仅使用 Android Studio 3.0 为您的仪器测试创建独立的 Android 项目(您可以将其放在应用项目之外的任何文件夹中)。为此,我使用了:

      Android Studio 3.0 Beta 6

      Android Gradle 插件:'com.android.tools.build:gradle:3.0.0-beta6'

    2. 您可以为仪器测试创建一个单独的模块(您可以将其放在应用项目之外的任何文件夹中)。为此,您可以使用:

      使用 Android Studio 3.0.0

      使用 Android Gradle 插件 3.0.0

      使用 Gradle Wrapper 4.2.1-all

      如果您收到error 表示无法合并 instrumentation-test-module 和 app-module 的 AndroidManifest,您可能会受限于旧的 Gradle 版本

      使用 Android Studio 2.3.3 和 3.0.0 测试

      最高的 Android Gradle 插件将是 2.2.3

      Gradle Wrapper 3.3-all(或 3.4.1 / 4.2.1)

      注意:Android Gradle Plugin 2.3.0 已损坏

    我创建了SAMPLE PROJECT 来演示两种情况下的测试结构。


    项目/模块的build.gradle必须使用这个插件:

    // A plugin used for test-only-modules
    apply plugin: 'com.android.test'
    

    此插件使用 TestExtension (link to its DSL)。使用 TestExtension'com.android.test' 插件,您的 gradle 文件将如下所示:

    apply plugin: 'com.android.test'
    
    android {
        compileSdkVersion 26
        buildToolsVersion "26.0.2"
        defaultConfig {
            minSdkVersion 9
            targetSdkVersion 26
    
            // The package name of the test app
            testApplicationId 'com.example.android.testing.espresso.BasicSample.tests'
            // The Instrumentation test runner used to run tests.
            testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
        }
        // Set the target app project. The module specified here should contain the production code
        // test should run against.
        targetProjectPath ':app'
    }
    
    dependencies {
        // Testing-only dependencies
        // Force usage of support annotations in the test app, since it is internally used by the runner module.
        compile 'junit:junit:4.12'
        compile 'com.android.support:support-annotations:25.4.0'
        compile 'com.android.support.test:runner:1.0.1'
        compile 'com.android.support.test:rules:1.0.1'
        compile 'com.android.support.test.espresso:espresso-core:3.0.1'
    }
    

    注意这里不支持"androidTestCompile"

    不要忘记创建AndroidManifest.xml。它看起来像:

    <?xml version="1.0" encoding="utf-8"?>
    
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.android.testing.espresso.BasicSample.tests">
    
    <!-- Specify runner and target application package -->
    <instrumentation
        android:name="android.support.test.runner.AndroidJUnitRunner"
        android:functionalTest="false"
        android:handleProfiling="false"
        android:label="Tests for com.example.android.testing.espresso.BasicSample"
        android:targetPackage="com.example.android.testing.espresso.BasicSample"/>
    
        <application>
            <uses-library android:name="android.test.runner" />
        </application>
    
    </manifest>
    

    注意测试源文件在“ma​​in”文件夹中(不是androidTest):

    src->main->java->package.name.folders

    然后您可以在settings.gradle中将此测试项目链接到您的应用程序项目:

    include ':module-androidTest'
    project(':module-androidTest').projectDir = new File("../BasicSampleTests/test")
    

    在 Android Studio 中,您必须创建“Android Instrumented Tests”运行配置。它看起来像: 现在运行你的测试:

    如果您对产品风格有构建问题,那么您应该在应用程序的 build.gradle 中添加 publishNonDefault

    android {
        ...
        defaultConfig {
           ...
        }
        publishNonDefault true
    }
    

    【讨论】:

    • 谢谢,不特定于 Cordova 完全没问题 - Android 项目应该是一个真正的 Android 项目,所以这应该可以工作。我会调查并报告。
    • 嗨,@janpio,我重写了我的答案。我还创建了简单的示例项目并添加了指向它的链接。顺便说一句,我也有很多构建问题和运行配置问题。所以我不得不迁移到 Android Studio 3.0 Beta 6。我的示例在那里完美运行。
    • 干得好!我们得到了那个 2.2.1 版本的插件作品。现在我们需要找到最接近最新 2.3.3 并且仍然可以成功运行的版本。
    • @janpio,好吧,我终于想通了。作为独立项目的测试将在 Android Studio 3.0 中运行(使用 Andorid Gradle Plugin 3.0.0-betaX 和 gradle wrapper 4.1-all)。测试作为一个单独的模块(github.com/janpio/separate_test_module/tree/… 中的变体)将适用于 Android Studio 2.3.3(使用 Andorid Gradle Plugin 2.2.3 和 gradle wrapper 3.3-all)。所以最高的插件是 2.2.3(从 2.3.0+ 这个功能被破坏了)。它是否符合您在项目中的需求?我想现在一切都清楚了,我们可以结束你的问题了。
    • 谢谢!是的,我尝试了从 2.2.1 到当前最新的稳定版 2.3.3 的所有版本 :) 我没有尝试 3.0.0 的所有版本,因为当它正式稳定时尝试它很重要。所以现在只使用最新的 3.0.0-beta6
    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 2020-12-29
    • 2019-11-14
    • 2020-06-26
    • 2012-05-23
    • 1970-01-01
    相关资源
    最近更新 更多