如何将Android(仪器)testing文件放置在项目目录之外?

我有一个Android项目(由cordova生成),我想添加(仪器)testing。 它只有一个应该testing的MainActivity.java

通常这意味着添加一些依赖到build.gradle并用MainActivityTest类和一些testing方法创build一个/src/androidTest/java/org/example/package/MainActivityTest.java文件。 (在Android Studio中,我甚至可以使用Run – >“Record Espresso Test”来生成这些文件 – 这非常简单,而且工作正常)。

不幸的是,我现在要求这些testing文件实际上不在项目目录中。 现有的cordova项目应该只有很小的变化(因为它被重build并作为构build工件来处理)。 MainActivity.java最好放在Android项目所在的同一个根文件夹中。

我怎样才能做到这一点?


build.gradle更改可以添加到build-extras.gradle文件中,这是真正的build.gradle已经包含的,所以这是照顾的。

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

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

我看着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'] } } ... } 

Solutions Collecting From Web of "如何将Android(仪器)testing文件放置在项目目录之外?"

有两种方法:

  1. 您只能使用Android Studio 3.0创build独立的Android项目 (您可以将其放在应用程序项目之外的任何文件夹中)。 为此我使用了:

    Android Studio 3.0 Beta 6

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

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

    使用Android Studio 3.0.0

    使用Android Gradle插件3.0.0

    随着Gradle包装4.2.1-所有

    如果您收到错误 ,说明instrumentation-test-module和app-module的AndroidManifest无法合并,那么您可能会被限制为旧的Gradle版本

    使用Android Studio 2.3.3和3.0.0进行testing

    最高的Android Gradle插件将是2.2.3

    Gradle Wrapper 3.3-all(或3.4.1 / 4.2.1)

    注意: 这是Android Gradle插件2.3.0

我创build了SAMPLE PROJECT来演示两种情况下的testing结构。


项目/模块的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”

不要忘记创buildAndroidManifest.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> 

请注意,testing源文件在“ ”文件夹(而不是androidTest )中:

SRC-> main-> Java的> package.name.folders

然后,您可以将这个testing项目链接到settings.gradle中的应用程序项目:

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

在Android Studio中,您必须创build“ Android Instrumentedtesting ”运行configuration。 它会看起来像: 在这里输入图像说明 现在运行你的testing:

在这里输入图像说明

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

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