高级测试设置

在 Android Studio 中测试从命令行测试 解释了如何设置和运行基本的测试配置。但是,当您的应用及其测试需求变得更高级时,您可能需要进一步调整测试配置。例如,当您想要执行以下操作时,您可能需要高级测试设置

  • 仅针对特定构建变体运行已 Instrumentation 测试或覆盖其清单设置。
  • 更改测试运行的构建类型或配置其 Gradle 选项。
  • 将已 Instrumentation 测试提取到它们自己的测试模块中。
  • 作为持续集成设置的一部分执行更高级的测试。

此页面描述了在默认设置不满足您的需求时配置测试的各种方法。

为构建变体创建已 Instrumentation 测试

如果您的项目包含具有唯一源集的构建变体,您可能希望包含与这些源集相对应的已 Instrumentation 测试。这可以使您的测试代码井井有条,并允许您仅运行适用于给定构建变体的测试。

要将已 Instrumentation 测试链接到构建变体,请将其放置在自己的源集中,位于 src/androidTestVariantName

位于 src/androidTest/ 源集中的已 Instrumentation 测试由所有构建变体共享。当为应用的“MyFlavor”变体构建测试 APK 时,Gradle 会组合 src/androidTest/src/androidTestMyFlavor/ 源集。

要在 Android Studio 中为您的构建变体添加测试源集,请按照以下步骤操作

  1. 在**项目**窗口中,单击菜单并选择**项目**视图。
  2. 在相应的模块文件夹中,右键单击**src**文件夹,然后单击**新建 > 目录**。
  3. 对于目录名称,输入“androidTestVariantName”。例如,如果您有一个名为“MyFlavor”的构建变体,请使用目录名称 androidTestMyFlavor
  4. 单击**确定**。
  5. 右键单击新目录,然后选择**新建 > 目录**。
  6. 输入“java”作为目录名称,然后单击**确定**。

现在,您可以按照添加新测试的步骤将测试添加到此新源集中。当您到达**选择目标目录**对话框时,选择新的变体测试源集。

下表显示了 Instrumentation 测试文件如何在与应用代码源集相对应的源集中驻留的示例

表 1. 应用源代码和相应的 Instrumentation 测试文件

应用类路径 匹配的 Instrumentation 测试类路径
src/main/java/Example.java src/androidTest/java/AndroidExampleTest.java
src/myFlavor/java/Example.java src/androidTestMyFlavor/java/AndroidExampleTest.java

就像它对您的应用源集所做的那样,Gradle 构建会合并和覆盖来自不同测试源集的文件。在这种情况下,androidTestMyFlavor 源集中的 AndroidExampleTest.java 文件会覆盖 androidTest 源集中的版本。这是因为产品风格源集优先于主源集。

当您在构建变体选择器中选择不同的风格时,相应的 androidTest 文件夹会显示在**Android**视图中,以显示正在使用的文件夹

MyFlavor variant selected and androidTestMyFlavor folder is shown
        in Android view
图 1. 选择了 MyFlavor 变体;androidTestMyFlavor 文件夹显示在**Android**视图中。

当选择不同的变体时,不会显示 androidTestMyFlavor 文件夹

OtherFlavor variant selected and androidTestMyFlavor folder is not
            shown in Android view
图 2. 选择了 OtherFlavor 变体;androidTestMyFlavor 文件夹未显示在**Android**视图中。

如果您使用的是**项目**视图,则外观略有不同,但原理相同

MyFlavor variant selected and androidTestMyFlavor folder is active
        in Project view
图 3. 选择了 MyFlavor 变体;androidTestMyFlavor 文件夹在**项目**视图中处于活动状态。

当选择不同的变体时,androidTestMyFlavor 文件夹仍然可见,但未显示为活动状态

OtherFlavor variant selected and androidTestMyFlavor folder is not
            active in Project view
图 4. 选择了 OtherFlavor 变体;androidTestMyFlavor 文件夹在**项目**视图中处于非活动状态。

有关如何合并源集的更多信息,请参阅源集

配置 Instrumentation 清单设置

已 Instrumentation 测试构建到具有其自身 AndroidManifest.xml 文件的单独 APK 中。当 Gradle 构建您的测试 APK 时,它会自动生成 AndroidManifest.xml 文件并使用<instrumentation>节点对其进行配置。Gradle 为您配置此节点的原因之一是确保targetPackage属性指定被测应用的正确包名称。

要更改此节点的其他设置,请在测试源集中创建另一个清单文件,或配置模块级 build.gradle 文件,如下面的代码示例所示。完整选项列表可以在BaseFlavor API 参考中找到。

Groovy

android {
    ...
    defaultConfig {
        ...
        testApplicationId "com.example.test"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        testHandleProfiling true
        testFunctionalTest true
    }
}

Kotlin

android {
    ...
    defaultConfig {
        ...
        testApplicationId = "com.example.test"
        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        testHandleProfiling = true
        testFunctionalTest = true
    }
}

Each product flavor you configure can override properties in the defaultConfig {} block. To learn more, go to Configure product flavors.

The properties in the snippet are:

设置 描述
testApplicationId Specifies the application ID for the test APK.
testInstrumentationRunner Specifies the fully qualified class name of the test instrumentation runner.
testHandleProfiling If set to true, enables the instrumentation class to start and stop profiling.
If set to false, profiling occurs the entire time the instrumentation class is running.
testFunctionalTest

如果 设置为 true, 表示Android系统应将Instrumentation类运行为功能测试。
默认值为 false.

更改测试构建类型

默认情况下,所有Instrumentation测试都针对debug构建类型运行。 您可以使用模块级build.gradle文件中的testBuildType属性将其更改为其他构建类型。 例如,如果您想针对staging构建类型运行测试,请按如下所示编辑该文件:

Groovy

android {
    ...
    testBuildType "staging"
}

Kotlin

android {
    ...
    testBuildType = "staging"
}

配置Gradle测试选项

Android Gradle插件允许您为所有测试或仅部分测试指定某些选项。 在模块级build.gradle文件中,使用testOptions块指定更改Gradle如何运行所有测试的选项

Groovy

android {
    ...
    // Encapsulates options for running tests.
    testOptions {
        reportDir "$rootDir/test-reports"
        resultsDir "$rootDir/test-results"
    }
}

Kotlin

android {
    ...
    // Encapsulates options for running tests.
    testOptions {
        reportDir "$rootDir/test-reports"
        resultsDir = "$rootDir/test-results"
    }
}

reportDir属性更改Gradle保存测试报告的目录。 默认情况下,Gradle将测试报告保存到path_to_your_project/module_name /build/outputs/reports/目录中。 $rootDir设置相对于当前项目根目录的路径。

resultsDir属性更改Gradle保存测试结果的目录。 默认情况下,Gradle将测试结果保存到path_to_your_project/module_name /build/outputs/test-results/目录中。 $rootDir设置相对于当前项目根目录的路径。

要仅为本地单元测试指定选项,请在testOptions内部配置unitTests块。

Groovy

android {
    ...
    testOptions {
        ...
        // Encapsulates options for local unit tests.
        unitTests {
            returnDefaultValues true

            all {
                jvmArgs '-XX:MaxPermSize=256m'

                if (it.name == 'testDebugUnitTest') {
                    systemProperty 'debug', 'true'
                }
                ...
            }
        }
    }
}

Kotlin

android {
    ...
    testOptions {
        ...
        // Encapsulates options for local unit tests.
        unitTests {
            returnDefaultValues = true

            all {
                jvmArgs = listOf("-XX:MaxPermSize=256m")

                 if (it.name == "testDebugUnitTest") {
                    systemProperty = mapOf("debug" to "true")
                }
                ...
            }
        }
    }
}

默认情况下,本地单元测试会在您正在测试的代码尝试访问Android平台API时抛出异常,除非您模拟Android依赖项(自行或使用Mockito等测试框架)。 但是,您可以启用returnDefaultValues属性,以便在访问平台API时测试返回null或零,而不是抛出异常。

all块封装了用于控制Gradle如何执行本地单元测试的选项。 有关您可以指定的全部选项的列表,请阅读Gradle的参考文档

jvmArgs属性为测试JVM设置JVM参数。

您还可以检查任务名称,以仅将选项应用于您指定的测试。 在示例代码段中,debug属性设置为true,但仅适用于testDebugUnitTest任务。

为Instrumented测试使用单独的测试模块

如果您希望为Instrumented测试创建专用模块,以将代码的其余部分与测试隔离,请创建一个单独的测试模块并将其构建配置为类似于库模块。

要创建测试模块,请执行以下操作

  1. 创建一个库模块.
  2. 在模块级build.gradle文件中,应用com.android.test插件而不是com.android.library
  3. 点击“同步项目”

创建测试模块后,您可以将测试代码包含在主或变体源集中(例如,src/main/javasrc/variant/java)。 如果您的应用模块定义了多个产品风格,则可以在测试模块中重新创建这些风格。 使用变体感知依赖项管理,测试模块尝试测试目标模块中的匹配风格。

默认情况下,测试模块仅包含和测试调试变体。 但是,您可以创建新的构建类型以匹配被测应用项目。 要使测试模块测试不同的构建类型而不是调试构建类型,请使用VariantFilter禁用测试项目中的调试变体,如所示

Groovy

android {
    variantFilter { variant ->
        if (variant.buildType.name.equals('debug')) {
            variant.setIgnore(true);
        }
    }
}

Kotlin

android {
    variantFilter {
        if (buildType.name == "debug") {
            ignore = true
        }
    }
}

如果您希望测试模块仅针对应用的某些风格或构建类型,则可以使用matchingFallbacks属性仅针对要测试的变体。 这还可以防止测试模块必须为自己配置这些变体。