Как разместить тестовые файлы Android (инструментария) вне каталога проекта?

У меня есть проект Android (созданный Cordova), который я хочу добавить (контрольно-измерительные) тесты. Он должен тестировать только один MainActivity.java.

Обычно это означает добавление некоторых зависимостей к build.gradle и создание файла /src/androidTest/java/org/example/package/MainActivityTest.java с классом MainActivityTest и некоторыми методами тестирования. (В Android Studio я даже могу сгенерировать их с помощью Run → "Record Espresso Test" - так просто и работает).

К сожалению, теперь у меня есть требование, чтобы эти тестовые файлы действительно находились вне каталога проекта. Должны быть только минимальные изменения в существующем проекте Кордовы (поскольку он регенерируется и обрабатывается как артефакт сборки). MainActivity.java лучше всего находиться в той же корневой папке, где проект Android находится в /android.

Как я могу это достичь?


Изменения build.gradle могут быть добавлены в файл build-extras.gradle, который уже содержит реальный build.gradle, поэтому об этом позаботятся.

Но я понятия не имею, как разместить MainActivityTest.java вне структуры папок проекта и все еще иметь возможность запускать его внутри проекта.

Для iOS вы можете связать внешние файлы с проектом с абсолютными путями. Что-то вроде этого было бы идеальным и здесь.

Я посмотрел на sourceSets, но я не уверен, как интегрировать его в проект Android от Cordova, у которого уже есть этот параметр по умолчанию (я думаю?) 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']
        }
    }
    ...
}     

Ответ 1

Существует два способа:

  • Вы можете создать независимый проект Android (который можно разместить в любой папке вне проекта приложения) для ваших контрольных тестов только с помощью Android Studio 3.0. Для этого я использовал:

    Android Studio 3.0 Beta 6

    Android Gradle Плагин: 'com.android.tools.build: gradle:3.0.0-beta6'

  • Вы можете создать отдельный модуль (который вы можете поместить в любую папку вне проекта приложения) для ваших контрольных тестов. Для этого вы можете использовать:

    С Android Studio 3.0.0

    С Android Gradle Плагин 3.0.0

    С Gradle Wrapper 4.2.1-all

    Если вы получили сообщение , что AndroidManifest модуля тестирования и модуля приложения не может быть объединен, вы можете ограничить его старым Gradle версии, которые

    Протестировано с помощью Android Studio 2.3.3 и 3.0.0

    Самый высокий плагин Android Gradle будет 2.2.3

    Gradle Обертка 3.3-все (или 3.4.1/4.2.1)

    Примечание. Это нарушено для Android Gradle Плагин 2.3.0!

Я создал ПРОГРАММА SAMPLE, чтобы продемонстрировать структуру тестов в обоих случаях.


build.gradle проекта/модуля должен использовать этот плагин:

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

Этот плагин использует ссылку TestExtension (на свой 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>

Обратите внимание, что исходные исходные файлы находятся в папке главная (не 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. Это будет выглядеть так: введите описание изображения здесь Теперь запустите ваши тесты:

введите описание изображения здесь

Если у вас возникли проблемы с выпуском продукта, вам следует добавить publishNonDefault в build.gradle вашего приложения:

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