在 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视图中,以显示正在使用的文件夹:
androidTestMyFlavor文件夹显示在Android视图中。当选择不同的变体时,androidTestMyFlavor文件夹不会显示:
androidTestMyFlavor文件夹未显示在Android视图中。如果您使用的是Project视图,这看起来会略有不同,但原理相同:
androidTestMyFlavor文件夹在Project视图中处于活动状态。当选择不同的变体时,androidTestMyFlavor文件夹仍然可见,但未显示为活动状态:
androidTestMyFlavor文件夹在Project视图中未处于活动状态。有关源集如何合并的更多信息,请参阅源集。
配置插桩清单设置
插桩测试被构建成一个独立的 APK,并拥有自己的AndroidManifest.xml文件。当 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") } ... } } } }
默认情况下,除非您自己或使用 Mockito 等测试框架模拟 Android 依赖项,否则每当您测试的代码尝试访问 Android 平台 API 时,本地单元测试都会抛出异常。但是,您可以启用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)中。如果您的应用模块定义了多个产品风味,您可以在测试模块中重新创建这些风味。使用变体感知依赖项管理,测试模块会尝试测试目标模块中匹配的风味。
默认情况下,测试模块仅包含并测试调试变体。但是,您可以创建新的构建类型以匹配被测应用项目。要使测试模块测试不同的构建类型而非调试类型,请使用VariantFilter在测试项目中禁用调试变体,如下所示:
Groovy
android { variantFilter { variant -> if (variant.buildType.name.equals('debug')) { variant.setIgnore(true); } } }
Kotlin
android { variantFilter { if (buildType.name == "debug") { ignore = true } } }
如果您希望测试模块仅针对应用的某些风味或构建类型,可以使用matchingFallbacks属性来仅针对您想要测试的变体。这也避免了测试模块需要自行配置这些变体。