在 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 } }
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测试创建专用模块,以将代码的其余部分与测试隔离,请创建一个单独的测试模块并将其构建配置为类似于库模块。
要创建测试模块,请执行以下操作
- 创建一个库模块.
- 在模块级
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
属性仅针对要测试的变体。 这还可以防止测试模块必须为自己配置这些变体。