配置Java项目的GitHub操作单元测试(加上Jacoco的代码覆盖)
#github #java #spring #unittest

在这篇简短的文章中,我们将讨论如何为Java项目(例如Spring Boot Projects)设置GitHub动作。我们还整合了jacoco以生成代码覆盖信息。

配置jacoco

我们必须在build.gradle文件中设置jacoco。脚本是这样的:

plugins {
    /* Other plugins */
    id 'jacoco'
}

/* Other configurations and dependencies */

test {
    testLogging {
        events "passed", "failed", "skipped"
    }
    finalizedBy jacocoTestReport
}

jacoco {
    toolVersion = "0.8.9"
}

jacocoTestReport {
    dependsOn test // tests are required to run before generating the report
    reports {
        xml.required = false
        csv.required = true
        html.outputLocation = layout.buildDirectory.dir('jacocoHtml')
    }
}

这里有一些解释:

plugins {
    /* Other plugins */
    id 'jacoco'
}

我们必须在plugins中包含jacoco,以用于Java项目的代码覆盖范围生成器。

test {
    testLogging {
        events "passed", "failed", "skipped"
    }
    finalizedBy jacocoTestReport
}

testLogging部分是可选的。这只是为了向您展示哪些测试代码已通过,失败和跳过。

jacocoTestReport {
    dependsOn test // tests are required to run before generating the report
    reports {
        xml.required = false
        csv.required = true
        html.outputLocation = layout.buildDirectory.dir('jacocoHtml')
    }
}

在此部分中,我们设置了在HTML页面中保存代码覆盖报告的位置。当我们在本地计算机上测试代码时,我们可以使用它来查看代码覆盖信息。对于GitHub Action的情况,我们仅使用.CSV输出进行代码覆盖。下图是Jacoco输出的一个示例。但是,我们不将其用于这种情况。

Jacoco example

默认情况下,jacoco将在build/reports/jacoco/test/jacocoTestReport.csv中保存.csv输出。我们将使用它在下一步中配置GitHub动作脚本。

配置GitHub动作工作流程代码

name: Java CI

on:
  pull_request:
    branches:
      - master

jobs:
  tests:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'
      - name: Grant execute permissions to Gradle wrapper
        run: chmod +x gradlew

      - name: Validate Gradle wrapper
        uses: gradle/wrapper-validation-action@ccb4328a959376b642e027874838f60f8e596de3

      - name: Run test
        run: ./gradlew test

      - name: Generate JaCoCo Badge
        uses: cicirello/jacoco-badge-generator@v2
        with:
          jacoco-csv-file: build/reports/jacoco/test/jacocoTestReport.csv

这里有一些解释:

name: Java CI

对于这种情况,我们将github动作命名为Java CI。您可以随心所欲地命名。

on:
  pull_request:
    branches:
      - master

on:pull_request指定何时应触发工作流程。在这种情况下,我们希望在每个拉请求上触发脚本。在此示例中,我们将其设置为master分支。这意味着每次开发人员向master分支提出拉请请求时,此工作流程将被触发。

jobs:
  tests:
    runs-on: ubuntu-latest

jobs部分定义将作为工作流程的一部分运行的作业。在这种情况下,我们将这项工作命名为tests

runs-on: ubuntu-latest指定作业将运行的操作系统环境。我们将Ubuntu的最新版本用于此示例。

    steps:
      - uses: actions/checkout@v3

      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'
      - name: Grant execute permissions to Gradle wrapper
        run: chmod +x gradlew

      - name: Validate Gradle wrapper
        uses: gradle/wrapper-validation-action@ccb4328a959376b642e027874838f60f8e596de3

      - name: Run test
        run: ./gradlew test

      - name: Generate JaCoCo Badge
        uses: cicirello/jacoco-badge-generator@v2
        with:
          jacoco-csv-file: build/reports/jacoco/test/jacocoTestReport.csv

steps部分包含将作为作业一部分执行的步骤列表。

  • uses: actions/checkout@v3:此步骤查看存储库的代码,允许随后的步骤访问和与项目文件进行交互。

  • name: Set up JDK 17:此步骤在Runner环境上设置JDK 17。动作actions/setup-java用于执行此操作。

  • run: chmod +x gradlew:此步骤授予对Gradle包装脚本执行权限,允许在下一步中执行它。

  • name: Validate Gradle wrapper:此步骤使用gradle/wrapper-validation-action来验证Gradle包装器。

  • run: ./gradlew test:此步骤使用gradle包装器运行了gradle的test任务。 test任务负责执行Java项目的测试。

  • name: Generate JaCoCo Badge:此步骤使用cicirello/jacoco-badge-generator操作来生成代码覆盖徽章。徽章基于jacocoTestReport.csv文件中存储的Jacoco测试覆盖范围数据,该数据通常是由Gradle Build在测试执行过程中生成的。

让我们进行测试

工作流程

要测试您的工作流程是否有效,您必须向GitHub存储库创建拉动请求。您可以关注此GitHub documentation关于如何创建拉请请求(PR)。

如果通过了所有测试,您将在PR上收到此通知:

PR success

否则,您将收到失败的通知。您可以使用此信息来考虑是否接受PR。

您可以单击显示所有检查以查看详细信息。如果输入详细信息,您将看到一些有关工作流程的信息。

Show all

运行测试零件中,您可以看到有关测试执行的细节。

Run test

代码覆盖范围

要获取代码覆盖信息,请打开您的github存储库>操作。然后,您将获取所有先前执行的工作流的列表,如这样,列表是及时订购的:

Workflow list

如果您选择其中一个,则会得到:

Workflow detail

测试摘要中一部分,您可以看到您的代码覆盖范围。

结论

自动化单元测试是软件开发生命周期中CI(连续集成)的重要组成部分。通过利用GITHUB操作来处理单元测试,我们在软件开发中自动化CI的一个方面。

附加资源