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 平台测试的预期结果。
我正在将一个项目从 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 平台测试的预期结果。