简介

您可以通过在主项目目录下执行 Gradle 的 Jtest 任务来执行分析和测试。除非是测试多模块项目,否则没有必要在分析前构建被测项目。对于多模块项目,在运行分析前,建议通过在命令行添加 buildassemble 任务进行编译。这样,Jtest 就能够使用来自本地资源库的工件,减少测试和分析代码所需的时间。

此外,如果您的项目为多模块项目,则必须执行根项目的任务。Jtest 将会测试或分析所有子项目。要测试特定的子项目,需运行根项目的 Jtest 任务(jtestjtest-agentaffectedTests)以及各子项目的 Gradle test 任务。详细信息,请参阅收集单元测试的覆盖率

运行静态分析

对代码执行静态分析的步骤:

  1. 确保完成 Gradle 的 Jtest 插件设置(请参阅配置 Gradle 的 Jtest 插件)。
  2. 执行 jtest 任务。您的命令行可能与以下内容类似:

    gradle jtest -I PATH/TO/JTEST/integration/gradle/init.gradle

    Gradle 的 Jtest 插件将在 .json 文件中收集必要的构建数据,并根据您提供的测试配置分析您的代码。

  3. 查看分析结果(请参阅查看结果)。

(info) 默认情况下会从分析中排除测试源。若要分析测试代码,需启用 includeTestSources 命令行选项;请参阅使用 jtest.includeTestSources 选项修改范围

对 Android 项目运行静态分析

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”

执行和收集单元测试的覆盖率

您可以通过使用 jtestjtest-agent 任务,以及专用的 Unit Tests 内建测试配置,将单元测试结果包含在 Jtest 报告中:

  1. 确保完成 Gradle 的 Jtest 插件设置(配置 Gradle 的 Jtest 插件)。
  2. 按以下顺序执行 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"

(info) 如果您通过调用 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"

收集 Android 项目的覆盖率 

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”

 限制:

  • 不支持从插桩的测试(在模拟或实体目标设备上执行的测试)中收集覆盖率。
  • 不支持在 IDE 中收集 Kotlin 测试的结果和 Kotlin 类的覆盖率;仅支持通过 CLI 收集。 
  • 收集和报告覆盖率时,一次仅支持一个应用变体。

收集应用程序覆盖率

Jtest 的覆盖率代理允许在对运行的应用程序执行手动或自动测试期间收集覆盖率数据。有关使用 Jtest 收集应用程序覆盖率的信息,请参阅应用程序覆盖率

测试影响分析

您可以通过测试影响分析来扩展 Gradle 的 Jtest 插件的功能。利用测试影响分析可以只关注和重新运行受变更影响的测试,从而不必要耗费额外的时间和精力执行大量未受影响的测试。对项目执行测试影响分析需要:

  1. 配置测试影响分析插件。
  2. 执行 affectedTests 任务。

无需修改 Gradle 构建脚本。

前提条件

  • Jtest 10.4.1 或更高版本
  • Gradle 3.3 或更高版本
  • JUnit 4 或 5

(info) 测试影响分析可能需要额外的内存。因此,我们建议增加分配给 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 任务参考

在构建脚本中

在构建脚本中声明配置时指定属性:

build.gradle
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

或者,您可以:

  1. build.gradle 脚本中配置任务执行:

    build.gradle
    test.dependsOn affectedTests
  2. 执行 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 在处理嵌套测试方面的限制会影响测试影响分析如何重新运行嵌套在其他测试中的测试。因此,当 runModifiedTests 选项设置为 true 时,始终会重新执行嵌套测试,即使它们未受到代码变更的影响。

此 Gradle 问题已在 Gradle 6.0.1 及更早版本中重现。

重新执行测试套件

当测试套件中至少有一个测试受到代码变更影响时,测试影响分析会重新运行整个测试套件。需注意,这可能会导致一些与受影响的测试包含在同一测试套件中的未受影响测试重新运行。

  • No labels