当前位置:Java -> 在 GitHub Actions 中运行单元测试

在 GitHub Actions 中运行单元测试

使用单元测试验证代码更改是典型开发工作流程中的关键环节。GitHub Actions提供了许多自定义操作来收集和处理测试结果,使开发人员可以浏览结果、调试失败的测试并生成报告。

在本文中,我将向您展示如何将单元测试添加到GitHub Actions工作流程,并配置自定义操作来处理结果。

入门指南

GitHub Actions是托管服务,因此您所需要做的就是拥有一个GitHub帐户。GitHub Actions工作流程的执行期间会安装所有其他依赖项,如软件开发工具包(SDK)。

选择操作

GitHub Actions在很大程度上依赖社区贡献的第三方操作。通过快速搜索,至少能找到半打用于处理单元测试结果的操作,包括:

为了缩小选择范围,您需要考虑以下功能:

  • 该操作是否支持您的测试框架?例如,有些操作只能处理JUnit测试结果,而其他操作还包括额外格式,如TRX。
  • 该操作是否允许您根据失败测试的存在来使工作流程失败?
  • 该操作是否为源代码注释添加了测试结果的详细信息?
  • 该操作是否生成有用的报告?
  • 该项目有多少星?
test-reporter操作,在本文中进行了演示。

Java中的单元测试

下面显示的工作流程文件使用Maven运行测试,并使用test-reporter操作处理测试结果:

name: Java

on:
  push:
  workflow_dispatch:

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v1

      - name: Set up JDK 1.11
        uses: actions/setup-java@v2
        with:
          java-version: '11'
          distribution: 'adopt'

      - name: Build
        run: mvn --batch-mode -DskipTests package

      - name: Test
        run: mvn --batch-mode -Dmaven.test.failure.ignore=true test

      - name: Report
        uses: dorny/test-reporter@v1
        if: always()
        with:
          name: Maven Tests
          path: target/surefire-reports/*.xml
          reporter: java-junit
          fail-on-error: true

BuildTestReport步骤对测试过程很重要。

首先,您构建应用程序,但跳过测试:

      - name: Build
        run: mvn --batch-mode -DskipTests package

接下来,您运行测试,即使有失败的测试,也允许命令通过。这使您可以将失败的测试的响应推迟到测试处理操作:

      - name: Test
        run: mvn --batch-mode -Dmaven.test.failure.ignore=true test
if属性设置为始终运行此步骤,这允许您即使在上面的Test步骤中设置为在有失败测试的情况下使流程失败时,也可以生成报告。 fail-on-error属性设置为true,如果有失败的测试,则使此工作流失败。这是将失败测试的响应推迟到测试处理操作的示例:
      - name: Report
        uses: dorny/test-reporter@v1
        if: always()
        with:
          name: Maven Tests
          path: target/surefire-reports/*.xml
          reporter: java-junit
          fail-on-error: true

Java Tests Results

DotNET中的单元测试

下面显示的工作流程文件使用DotNET Core CLI运行测试,并使用test-reporter操作处理结果:

name: .NET Core

on:
  push:
  workflow_dispatch:

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - name: Checkout  
      uses: actions/checkout@v1

    - name: Setup .NET Core
      uses: actions/setup-dotnet@v1
      with:
        dotnet-version: 3.1.402

    - name: Build
      run: dotnet build --configuration Release

    - name: Test
      run: dotnet test --logger "trx;LogFileName=test-results.trx" || true

    - name: Test Report
      uses: dorny/test-reporter@v1
      if: always()
      with:
        name: DotNET Tests
        path: "**/test-results.trx"                            
        reporter: dotnet-trx
        fail-on-error: true
test命令如果有任何测试失败,将返回一个非零的退出代码,但您可以将对失败测试的响应推迟到测试处理器。通过链接|| true到命令,您确保步骤总是通过:
    - name: Test
      run: dotnet test --logger "trx;LogFileName=test-results.trx" || true

然后,测试报告动作会处理报告文件,并将fail-on-error设置为true,以便在有任何失败的测试时使构建失败:

    - name: Test Report
      uses: dorny/test-reporter@v1
      if: always()
      with:
        name: DotNET Tests
        path: "**/test-results.trx"                            
        reporter: dotnet-trx
        fail-on-error: true

结论

GitHub Actions 主要是一个任务执行环境,旨在验证和构建代码,并发布生成的工件。有许多第三方动作可让您生成测试报告并响应失败的测试,但 GitHub Actions 在跟踪测试结果方面存在一些缺陷。尽管如此,目前可用的报告功能仍然很有用,并且将会不断改进。

在本文中,你学到了:

  • 在评估第三方动作以处理测试结果时需要询问的一些问题
  • 如何为测试 Java 和 DotNET Core 应用程序编写基本工作流程
  • 如何处理测试结果并显示生成的报告

部署愉快!

推荐阅读: 9.comparable 和 comparator的区别? 

本文链接: 在 GitHub Actions 中运行单元测试