在 Android Studio 中测试 和 从命令行测试 解释了如何设置和运行基本测试配置。但是,当您的应用及其测试需求变得更高级时,您可能需要进一步调整测试配置。例如,当您想要执行以下操作时,可能需要高级测试设置
- 仅针对特定构建变体运行 Instrumentation 测试或覆盖其清单设置。
- 更改测试运行的构建类型或配置其 Gradle 选项。
- 将 Instrumentation 测试提取到其自己的测试模块中。
- 作为持续集成设置的一部分执行更高级的测试。
此页面描述了在默认设置不满足您的需求时配置测试的各种方法。
为构建变体创建 Instrumentation 测试
如果您的项目包含具有唯一源集的构建变体,您可能希望包含与这些源集对应的 Instrumentation 测试。这可以使您的测试代码井然有序,并允许您仅运行适用于给定构建变体的测试。
要将 Instrumentation 测试链接到构建变体,请将其放在自己的源集中,位于 src/androidTestVariantName
。
位于 src/androidTest/
源集中的 Instrumentation 测试由所有构建变体共享。当为应用的“MyFlavor”变体构建测试 APK 时,Gradle 会将 src/androidTest/
和 src/androidTestMyFlavor/
源集组合起来。
要在 Android Studio 中为您的构建变体添加测试源集,请按照以下步骤操作
- 在**项目**窗口中,单击菜单并选择**项目**视图。
- 在相应的模块文件夹中,右键单击**src**文件夹,然后单击**新建 > 目录**。
- 对于目录名称,输入“androidTestVariantName”。例如,如果您有一个名为“MyFlavor”的构建变体,请使用目录名称
androidTestMyFlavor
。 - 单击**确定**。
- 右键单击新目录,然后选择**新建 > 目录**。
- 输入“java”作为目录名称,然后单击**确定**。
现在,您可以按照添加新测试的步骤将测试添加到此新的源集中。当您到达**选择目标目录**对话框时,选择新的变体测试源集。
下表显示了 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**视图中,以显示正在使用的文件夹
当选择其他变体时,不会显示 androidTestMyFlavor
文件夹
如果您使用的是**项目**视图,则外观略有不同,但原理相同
当选择其他变体时,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 } }
您配置的每个产品风格都可以在 defaultConfig {}
块中覆盖属性。要了解更多信息,请转到配置产品风格。
代码段中的属性为
设置 | 描述 |
---|---|
testApplicationId
|
指定测试 APK 的应用 ID。 |
testInstrumentationRunner
|
指定测试 Instrumentation 运行程序的完全限定类名。 |
testHandleProfiling
|
如果设置为 true ,则启用 Instrumentation 类以启动和停止分析。如果设置为 false ,则在 Instrumentation 类运行的整个时间内都会进行分析。 |
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
任务。
为 Instrumentation 测试使用单独的测试模块
如果您希望为 Instrumentation 测试创建一个专用的模块,以将代码的其余部分与测试隔离开来,请创建一个单独的测试模块并将其构建配置类似于库模块。
要创建测试模块,请执行以下操作
- 创建库模块.
- 在模块级
build.gradle
文件中,应用com.android.test
插件而不是com.android.library
。 - 单击**同步项目** 。
创建测试模块后,您可以将测试代码包含在主源集或变体源集中(例如,src/main/java
或 src/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
属性仅针对要测试的变体。这还可以防止测试模块必须为自己配置这些变体。