【问题标题】:Spock 2.0 is reporting an extra test for data-driven testsSpock 2.0 正在报告数据驱动测试的额外测试
【发布时间】:2021-07-22 19:48:56
【问题描述】:

我正在将一个项目从 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


    【解决方案1】:

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

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

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

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

    Spock 现在是基于 JUnit Platform 的测试引擎

    这意味着与基于 JUnit 4 运行器的 Spock 1.x 相比,Spock 2.0 运行自己的 JUnit 测试引擎,即 Spock 引擎与 Jupiter 引擎处于同一级别,两者都在 JUnit 上运行平台。

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

    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 平台测试的预期。

    【讨论】:

    • 啊,好的。我怀疑该方法本身可能会被报告为“测试”。感谢您证实这一怀疑!
    • 请仔细阅读我的回答。我没有确认任何类似的事情。我说的是分组,不是作为额外测试报告的。
    • 好的,那么你认为这是 IntelliJ 的东西(我确实仔细阅读过,我想我只是误解了)。
    • 容器实际上具有CONTAINER_AND_TEST的JUnit Platform类型,因此它可以在边缘情况下正确报告一些错误。这样做的副作用是容器也算作测试。
    • 哦,有趣的细节。我不知道。谢谢你的修改。类的容器类型(规范)呢?是同一类型吗?如果例如,这将是有道理的。静态初始化或setupSpec 中存在错误。
    猜你喜欢
    • 2023-03-11
    • 2016-10-09
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    相关资源
    最近更新 更多