高级测试设置

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

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

当默认设置无法满足您的需求时,本页面介绍了配置测试的各种方法。

为构建变体创建插桩测试

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

要将插桩测试关联到构建变体,请将其放置在它们自己的源集中,位于 src/androidTestVariantName

src/androidTest/ 源集中的插桩测试由所有构建变体共享。在为应用的“MyFlavor”变体构建测试 APK 时,Gradle 会合并 src/androidTest/src/androidTestMyFlavor/ 源集。

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

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

现在,您可以按照添加新测试的步骤向此新源集添加测试。当您到达 Choose Destination Directory(选择目标目录)对话框时,请选择新的变体测试源集。

下表显示了一个示例,展示了插桩测试文件如何驻留在与应用代码源集相对应的源集中:

表 1. 应用源代码及对应的插桩测试文件

应用类路径 对应的插桩测试类路径
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 视图中。

如果您使用的是 Project(项目)视图,显示会略有不同,但原则是一样的:

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

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

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

有关源集如何合并的详细信息,请参阅源集

配置插桩清单设置

插桩测试被构建到一个具有自己的 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
    }
}

您配置的每个产品风味都可以覆盖 defaultConfig {} 块中的属性。要了解更多信息,请前往配置产品风味

代码片段中的属性包括:

设置 描述
testApplicationId 指定测试 APK 的应用 ID
testInstrumentationRunner 指定测试插桩运行器的全限定类名。
testHandleProfiling 如果设置为 true,则启用插桩类来启动和停止性能分析。
如果设置为 false,则性能分析会在插桩类运行的整个过程中进行。
testFunctionalTest 如果设置为 true,则表示 Android 系统应将插桩类作为功能测试运行。
默认值为 false

更改测试构建类型

默认情况下,所有插桩测试都会针对 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 时会抛出异常,除非您自行或使用 Mockito 等测试框架模拟 Android 依赖项。但是,您可以启用 returnDefaultValues 属性,这样测试在访问平台 API 时会返回 null 或零,而不是抛出异常。

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

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

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

为插桩测试使用独立的测试模块

如果您想拥有一个专用于插桩测试的模块,以便将代码的其余部分与测试隔离开来,请创建一个单独的测试模块,并像配置库模块一样配置其构建。

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

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

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

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

Groovy

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

Kotlin

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

如果您希望测试模块仅针对应用的特定风味或构建类型,可以使用 matchingFallbacks 属性来仅针对您想要测试的变体。这也避免了测试模块必须自行配置这些变体。