Spock 2.0 正在报告数据驱动测试的额外测试

Spock 2.0 is reporting an extra test for data-driven tests

我正在将一个项目从 Spock 1.3 升级到 2.0,我注意到数据驱动测试似乎有一个额外的测试 IDE 正在某处报告。例如,文档中的“两个数字的最大值”数据驱动示例显示只有 3 行时通过了 4 个测试:

class MathSpec extends Specification {
    def "maximum of two numbers"() {
        expect:
        Math.max(a, b) == c

        where:
        a | b | c
        1 | 3 | 3
        7 | 4 | 7
        0 | 0 | 0
    }
}

这是怎么回事?

首先,您的问题既是 IntelliJ IDEA 问题又是 Spock 问题,因为您想知道为什么参数化的 Spock 2 测试在 IDEA 中看起来像那样。

其次,您发布的代码与您在 IntelliJ IDEA 中 运行 的代码不同。可能您的功能方法更像这样开始,以实现我们在您的屏幕截图中看到的测试迭代命名:

def "maximum of #a and #b is #c"() {
  // ...
}

确定了这一点,接下来让我提醒你Spock 2.0 release notes的第一句话:

Spock is now a test engine based on the JUnit Platform

这意味着与基于 JUnit 4 运行ner 的 Spock 1.x 相比,Spock 2.0 拥有自己的 JUnit 测试引擎,即 Spock 引擎与Jupiter 引擎,都运行在 JUnit 平台上运行。

在 IDEA 中报告参数化测试的方式对于 JUnit 5 测试和 Spock 2 测试是相同的:

Test class A
  - Test method x
      - parametrised method name 0
      - ...
      - parametrised method name n
  - Test method y
      - parametrised method name 0
      - ...
      - parametrised method name n
Test class B
  - Test method z
      - parametrised method name 0
      - ...
      - parametrised method name n
...

IDEA 不是“报告额外的测试”,它只是在测试报告中添加了一个按方法名称分组的级别。

例如,如果您运行这个参数化的 JUnit 5 测试

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

import static org.junit.jupiter.api.Assertions.assertTrue;

public class NumbersTest {
  @ParameterizedTest(name = "{0} is an odd number")
  @ValueSource(ints = {1, 3, 5, -3, 15, Integer.MAX_VALUE}) // six numbers
  void isOdd_ShouldReturnTrueForOddNumbers(int number) {
    assertTrue(Numbers.isOdd(number));
  }

  public static class Numbers {
    public static boolean isOdd(int number) {
      return number % 2 != 0;
    }
  }
}

在IDEA中是这样的:

即您所看到的 JUnit 平台测试的预期结果。