您可以通过在主项目目录下执行 Gradle 的 Jtest 任务来执行分析和测试。除非是测试多模块项目,否则没有必要在分析前构建被测项目。对于多模块项目,在运行分析前,建议通过在命令行添加 build
或 assemble
任务进行编译。这样,Jtest 就能够使用来自本地资源库的工件,减少测试和分析代码所需的时间。
此外,如果您的项目为多模块项目,则必须执行根项目的任务。Jtest 将会测试或分析所有子项目。要测试特定的子项目,需运行根项目的 Jtest 任务(jtest
、jtest-agent
或 affectedTests
)以及各子项目的 Gradle test
任务。详细信息,请参阅收集单元测试的覆盖率。
对代码执行静态分析的步骤:
执行 jtest 任务。您的命令行可能与以下内容类似:
gradle jtest -I PATH/TO/JTEST/integration/gradle/init.gradle |
Gradle 的 Jtest 插件将在 .json 文件中收集必要的构建数据,并根据您提供的测试配置分析您的代码。
默认情况下会从分析中排除测试源。若要分析测试代码,需启用
includeTestSources
命令行选项;请参阅使用 jtest.includeTestSources 选项修改范围。
Jtest 允许使用专用的 Gradle 任务为 Android 项目运行静态分析配置。可以针对特定的应用变体(构建类型和产品风格)执行静态分析。每次运行仅支持一个应用变体。若要对多个应用变体执行静态分析,则必须针对每个变体单独运行。
要执行静态分析,必须执行以下任务:
jtest[APPLICATION VARIANT NAME]
- 其中 APPLICATION VARIANT NAME 是将对其运行测试配置的应用变体的名称。
要列出 Android Gradle 构建的所有应用变体的可用任务,可使用以下命令:
gradlew tasks –I [JTEST_HOME/integration/gradle/init.gradle] |
示例:
此示例展示了一个命令行,对“Debug”构建类型和名为“Demo”的产品风格(应用变体名称为“DemoDebug”)执行“Android Guidelines”测试配置。
gradlew installDemoDebug jtestDemoDebug –Djtest.config=”builtin://Android Guidelines” |
您可以通过使用 jtest 和 jtest-agent 任务,以及专用的 Unit Tests
内建测试配置,将单元测试结果包含在 Jtest 报告中:
按以下顺序执行 Gradle 任务:
- jtest-agent 任务
- test
(或 build
)任务,确保执行单元测试
- jtest 任务
您的命令行可能类似于:
gradle clean jtest-agent test jtest -Djtest.config="builtin://Unit Tests" |
默认情况下,Jtest 会收集执行测试的覆盖率数据。若要禁用覆盖率收集功能,则启用 jtest.coverage.skip
选项(详细信息,请参阅 Gradle 的 Jtest 任务参考)。
如果测试的是多模块项目,默认情况下,Jtest 会收集根项目下所有子项目的覆盖率信息。要收集特定子项目的覆盖率,需修改命令行以执行要测试的子项目的 Gradle test
任务。您的命令行可能与以下内容类似:
gradle clean jtest-agent subproject1:test subproject2:test jtest -Djtest.config="builtin://Unit Tests" |
如果您通过调用 org.junit.Assume(JUnit 4)或 org.junit.jupiter.api.Assumptions(JUnit 5)类的方法来跳过某个测试,Jtest 会收集调用方法前执行的代码行的覆盖率。此覆盖率信息与覆盖率报告中的所有测试无关。
Jtest 收集 Gradle 多模块项目并行构建(通过 -parallel 或 --parallel 选项启用)的测试覆盖率。详细信息,请参阅 https://docs.gradle.org/current/userguide/performance.html#parallel_execution。例如:
gradle -parallel clean jtest-agent test jtest -Djtest.config="builtin://Unit Tests" |
Jtest 允许从基于 Gradle 构建的 Android 项目的本地单元测试中收集覆盖率。Jtest 支持使用 Java 和 Kotlin 编写的单元测试。可以针对特定的应用变体(构建类型和产品风格)收集覆盖率。每次运行仅支持一个应用变体。若要收集多个应用变体的覆盖率,则必须针对每个变体单独收集。
要附加 Jtest 代理并收集覆盖率,必须执行以下任务:
jtestAgent[APPLICATION VARIANT NAME]
- APPLICATION VARIANT NAME 是要收集覆盖率的应用变体的名称。
jtest[APPLICATION VARIANT NAME]
- APPLICATION VARIANT NAME 是要为其处理测试结果和收集的覆盖率的应用变体的名称。
要列出 Android Gradle 构建的可用任务,可使用以下命令:
gradlew tasks –I[JTEST_HOME/integration/gradle/init.gradle] |
示例:
此示例展示了一个命令行,用于收集“Debug”构建类型和名为“Demo”的产品风格(应用变体名称为“DemoDebug”)的本地单元测试覆盖率。
gradlew compileDemoDebugUnitTestSources jtestAgentDemoDebug testDemoDebugUnitTest jtestDemoDebug –Djtest.config=”builtin://Unit Tests” |
限制:
Jtest 的覆盖率代理允许在对运行的应用程序执行手动或自动测试期间收集覆盖率数据。有关使用 Jtest 收集应用程序覆盖率的信息,请参阅应用程序覆盖率。
您可以通过测试影响分析来扩展 Gradle 的 Jtest 插件的功能。利用测试影响分析可以只关注和重新运行受变更影响的测试,从而不必要耗费额外的时间和精力执行大量未受影响的测试。对项目执行测试影响分析需要:
affectedTests
任务。无需修改 Gradle 构建脚本。
测试影响分析可能需要额外的内存。因此,我们建议增加分配给 Gradle 构建的内存。
Jtest 提供的 init.gradle
脚本允许您将测试影响分析插件与 Gradle 集成,而无需修改您的 Gradle 构建脚本。要将 Gradle 与插件集成,需使用 -I
选项将 init.gradle
脚本的位置传到命令行:
gradle affectedTests test -I PATH/TO/JTEST/integration/gradle/init.gradle |
您可以通过配置测试影响分析插件的属性,在构建文件或命令行中自定义项目的测试影响分析。至少需要提供 Jtest 在执行过程中生成的以下文件的路径:
coverage.xml
report.xml
有关完整的可用选项列表,请参阅 Gradle 的 Jtest 任务参考。
在构建脚本中声明配置时指定属性:
affectedTests { referenceCoverageFile = 'path/to/coverage.xml' referenceReportFile = 'path/to/report.xml' runFailedTests = false runModifiedTests = true jtestHome = 'path/to/jtest' settings = 'path/to/jtestcli.properties' } |
如果在命令行中配置插件,则使用 -D
选项传递插件属性。该属性必须包含“jtest”前缀(请参阅 Gradle 的 Jtest 任务参考)。您的命令行可能与以下内容类似:
gradle affectedTests test -I PATH/TO/JTEST/integration/gradle/init.gradle -Djtest.referenceCoverageFile="path/to/coverage.xml" -Djtest.referenceReportFile="path/to/report.xml" -Djtest.runFailedTests=false -Djtest.runModifiedTests=true -Djtest.home="path/to/jtest" -Djtest.settings="jtestcli.properties" |
affectedTest
任务您可以在命令行执行 affectedTests
任务而无需进一步配置。确保在 test
任务前执行。您的命令行可能与以下内容类似:
gradle clean affectedTests test -I PATH/TO/JTEST/integration/gradle/init.gradle |
或者,您可以:
在 build.gradle
脚本中配置任务执行:
test.dependsOn affectedTests |
执行 Gradle test
任务 – affectedTests
任务将自动执行:
gradle test -I PATH/TO/JTEST/integration/gradle/init.gradle |
如果您想为多模块项目中选定的子项目运行 affectedTests
任务,可以修改您的命令行,仅对想要测试的子项目执行 Gradle test
任务。您的命令行可能与以下内容类似:
gradle clean affectedTests subproject1:test subproject2:test -Djtest.referenceCoverageFile=tia/coverage.xml -Djtest.referenceReportFile=tia/report.xml -I path_jtest\integration\gradle\init.gradle |
Gradle 在处理嵌套测试方面的限制会影响测试影响分析如何重新运行嵌套在其他测试中的测试。因此,当 此 Gradle 问题已在 Gradle 6.0.1 及更早版本中重现。 |
当测试套件中至少有一个测试受到代码变更影响时,测试影响分析会重新运行整个测试套件。需注意,这可能会导致一些与受影响的测试包含在同一测试套件中的未受影响测试重新运行。