在 Android Studio 中测试和从命令行测试介绍了如何设置和运行基本的测试配置。但是,当您的应用及其测试需求变得更高级时,您可能需要进一步调整测试配置。例如,在以下情况下,您可能需要高级测试设置:
- 仅针对特定的构建变体运行插桩测试,或覆盖其清单设置。
- 更改测试所运行的构建类型,或配置其 Gradle 选项。
- 将插桩测试提取到其自己的测试模块中。
- 作为持续集成设置的一部分执行更高级的测试。
当默认设置无法满足您的需求时,本页面介绍了配置测试的各种方法。
为构建变体创建插桩测试
如果您的项目包含具有唯一源集的构建变体,您可能希望包含与这些源集相对应的插桩测试。这可以保持测试代码的条理性,并允许您仅运行适用于给定构建变体的测试。
要将插桩测试关联到构建变体,请将其放置在它们自己的源集中,位于 src/androidTestVariantName。
src/androidTest/ 源集中的插桩测试由所有构建变体共享。在为应用的“MyFlavor”变体构建测试 APK 时,Gradle 会合并 src/androidTest/ 和 src/androidTestMyFlavor/ 源集。
要在 Android Studio 中为您的构建变体添加测试源集,请按照以下步骤操作:
- 在 Project(项目)窗口中,点击菜单并选择 Project(项目)视图。
- 在相应的模块文件夹内,右键点击 src 文件夹,然后点击 New > Directory(新建 > 目录)。
- 对于目录名称,输入“androidTestVariantName”。例如,如果您有一个名为“MyFlavor”的构建变体,请使用目录名称
androidTestMyFlavor。 - 点击 **OK**。
- 右键点击新目录,然后选择 New > Directory(新建 > 目录)。
- 输入“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 变体;androidTestMyFlavor 文件夹显示在 Android 视图中。当选择不同的变体时,不会显示 androidTestMyFlavor 文件夹。
OtherFlavor 变体;androidTestMyFlavor 文件夹不会显示在 Android 视图中。如果您使用的是 Project(项目)视图,显示会略有不同,但原则是一样的:
MyFlavor 变体;androidTestMyFlavor 文件夹在 Project 视图中处于激活状态。当选择不同的变体时,androidTestMyFlavor 文件夹仍然可见,但不会显示为激活状态。
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 任务。
为插桩测试使用独立的测试模块
如果您想拥有一个专用于插桩测试的模块,以便将代码的其余部分与测试隔离开来,请创建一个单独的测试模块,并像配置库模块一样配置其构建。
要创建测试模块,请执行以下操作:
- 创建一个库模块。.
- 在模块级
build.gradle文件中,应用com.android.test插件,而不是com.android.library。 - 点击 Sync Project(同步项目)
。
创建测试模块后,您可以将测试代码包含在主源集或变体源集中(例如 src/main/java 或 src/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 属性来仅针对您想要测试的变体。这也避免了测试模块必须自行配置这些变体。