【问题标题】:JUnit tests fails on GitHub Actions but not locallyJUnit 测试在 GitHub Actions 上失败,但不是在本地 [已解决]
【发布时间】:2021-04-16 17:52:45
【问题描述】:

我正在尝试在 GitHub Actions 上运行 JUnit 测试,但其中一些失败。本地所有测试都通过了。在我的 PC 上,我使用 Ubuntu 20.04 和 OpenJDK 1.8 (275),在 CI 上使用 OpenJDK 1.8(来自标准操作)。

java -version 从 PC 输出:

openjdk version "1.8.0_275"
OpenJDK Runtime Environment (build 1.8.0_275-8u275-b01-0ubuntu1~20.04-b01)
OpenJDK 64-Bit Server VM (build 25.275-b01, mixed mode)

java-version 来自 GitHub Actions 的输出:

openjdk version "1.8.0_275"
OpenJDK Runtime Environment (Zulu 8.50.0.53-CA-linux64) (build 1.8.0_275-b01)
OpenJDK 64-Bit Server VM (Zulu 8.50.0.53-CA-linux64) (build 25.275-b01, mixed mode)

测试断言:

@Test
public void test() {
    assertEquals(
        17,
        new CountingSheep(
            new Boolean[]{
                true, true, true, false,
                true, true, true, true,
                true, false, true, false,
                true, false, false, true,
                true, true, true, true,
                false, false, true, true
            }
        ).solution()
    );
}

代码:

package com.smlnskgmail.jaman.codewarsjava.kyu8;

import java.util.Arrays;

public class CountingSheep {

    private final Boolean[] input;

    public CountingSheep(Boolean[] input) {
        this.input = input;
    }

    public int solution() {
        return (int) Arrays
                .stream(input, 0, input.length)
                .filter(b -> b != null && b)
                .count();
    }

}

CI 检查失败:

com.smlnskgmail.jaman.codewarsjava.kyu8.CountingSheepTest > test FAILED
    java.lang.AssertionError: expected:<17> but was:<0>
        at org.junit.Assert.fail(Assert.java:88)
        at org.junit.Assert.failNotEquals(Assert.java:834)
        at org.junit.Assert.assertEquals(Assert.java:645)
        at org.junit.Assert.assertEquals(Assert.java:631)
        at com.smlnskgmail.jaman.codewarsjava.kyu8.CountingSheepTest.test(CountingSheepTest.java:11)

JUnit 实现:

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

GitHub 操作配置:

name: Build

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

env:
  GRADLE_OPTS: -Dorg.gradle.daemon=false

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 1.8
        uses: actions/setup-java@v1
        with:
          java-version: 1.8
      - name: Build with Gradle
        run: ./gradlew build --info

但是这个测试在一个月前通过了,我无法更改代码。

代码库:https://github.com/fartem/codewars-java

解决方案:here 是具有项目反射的类。如果不执行这个类,所有测试都会通过。

【问题讨论】:

  • 您是否单步执行了 IDE 中的代码? CountingSheep 构造函数在哪里?
  • 自上次测试通过以来,Gradle 版本是否发生了变化?或者可能是 Java 1.8 的版本 检查 Ubuntu 的 actions/virtual-environments 存储库以查看更改日志。
  • 与一个月前的版本相同(当所有测试都通过时)。在问题中,我添加了来自 PC 和 GitHub Actions 的java -version 输出。
  • 顺便说一句,那些投反对票的人可以给个理由吗?问题远非微不足道,发帖人已经展示了自己的努力,到目前为止,他已经提供了他所要求的一切。
  • 值得下载 Azul Zulu 版本,以便您使用完全相同的版本运行,或者在执行相同操作的 Docker 容器中本地运行它。代码看起来应该在两个地方都相同,但显然结果代码的计数返回零。可能值得放入一些打印语句,以便您可以验证您的代码是否按预期被调用。

标签: java junit jvm github-actions


【解决方案1】:

我认为这是 GitHub 上的错误。测试似乎通过了,我在https://github.com/fartem/codewars-java/pull/1 创建了一个分支,该测试似乎成功通过了。

鉴于唯一改变的是通过您的结帐操作实现的 Java 版本,我想知道 GitHub 是否有回滚的暂时损坏的 Java 版本。

顺便说一句,您在测试中使用了 Boolean 数组,但在这种情况下,您可以改用 boolean 数组 - 这样,您的过滤器就不需要 @ 987654325@查看那里。

--

根据 fartem 的观察,还有一段额外的代码运行并将 Boolean.TRUE 的值更改为 false。变化是测试的随机顺序。

 Field field = Boolean.class.getField("TRUE");
 field.setAccessible(true);

 Field modifiedField = Field.class.getDeclaredField("modifiers");
 modifiedField.setAccessible(true);
 modifiedField.setInt(field, field.getModifiers() & ~Modifier.FINAL);

 field.set(null, false);

因此,在此测试运行后使用布尔值自动装箱的任何测试都会得到错误的结果。

【讨论】:

  • 带有布尔反射的this 类存在问题。感谢您检查所有课程的建议。
  • 哦,那会很讨厌 :) 在不更改 Boolean 的情况下尝试使用该代码可能会更好,或者创建一个新的 Boolean 实例,然后对实例使用最终方法具有该特定实例的字段,因此您不会在其他地方毒害您的代码。
  • 在我的情况下可能只是一个错误的测试执行顺序。
  • 如果您在同一个 JVM 中运行测试,那么在您的 change-the-value-of-Boolean-TRUE 测试之后执行的任何测试都可能会中断。您将无法保证测试订购。这可能就是您在 GitHub 上遇到问题(使用 gradle 守护程序)但在本地执行代码时没有看到的原因(如果每个测试运行一个 JVM,或者以不同的顺序运行它们)。
猜你喜欢
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多