gpt4 book ai didi

testing - 在同一个 Spock 测试中执行所有断言,即使其中一个失败

转载 作者:行者123 更新时间:2023-11-28 21:10:13 27 4
gpt4 key购买 nike

我正在尝试在单个 Spock 方法的上下文中验证两个不同的输出,该方法运行 when-then-where 形式的多个测试用例。为此,我在 then block 中使用了两个断言,如以下示例所示:

import spock.lang.*

@Unroll
class ExampleSpec extends Specification {

def "Authentication test with empty credentials"() {
when:
def reportedErrorMessage, reportedErrorCode
(reportedErrorMessage, reportedErrorCode) = userAuthentication(name, password)

then:
reportedErrorMessage == expectedErrorMessage
reportedErrorCode == expectedErrorCode

where:
name | password || expectedErrorMessage | expectedErrorCode
' ' | null || 'Empty credentials!' | 10003
' ' | ' ' || 'Empty credentials!' | 10003
}
}

代码是一个例子,设计要求是如果namepassword' '或者null,那么我应该始终期待完全相同的 expectedErrorMessage = 'Empty credentials!'expectedErrorCode = 10003。如果出于某种原因(可能是因为源代码中的错误)我得到 expectedErrorMessage = Empty!(或除 'Empty credentials!' 之外的任何其他内容)和 expectedErrorCode = 10001(或 1003 以外的任何其他内容),这将不满足上述要求。

问题是如果两个断言在同一个测试中都失败了,我只会收到第一个断言的失败消息(这里是reportedErrorMessage)。是否有可能在同一测试中获得所有失败断言的通知?

下面是一段代码,在没有其他外部代码依赖的情况下演示了同样的问题。我知道在这种特殊情况下,将两个截然不同的测试捆绑在一起并不是一个好的做法,但我认为它仍然说明了问题。

import spock.lang.*

@Unroll
class ExampleSpec extends Specification {

def "minimum of #a and #b is #c and maximum of #a and #b is #d"() {
expect:
Math.min(a, b) == c
Math.max(a, b) == d

where:
a | b || c | d
3 | 7 || 3 | 7
5 | 4 || 5 | 4 // <--- both c and d fail here
9 | 9 || 9 | 9
}
}

最佳答案

基于latest comment通过 OP,看起来与我之前的答案不同的解决方案会有所帮助。我将保留之前的答案,因为我觉得它仍然提供了与问题相关的有用信息(特别是区分正面和负面测试)。

鉴于您希望看到所有失败,而不仅仅是让它在第一个失败的断言处失败,我建议将所有内容连接到一个 bool AND 运算中。不使用&&快捷运算符,因为它只会运行到第一个不满足整个操作的检查。我建议使用 &,以便进行所有检查,而不管之前是否有任何失败的检查。

鉴于上面的 maxmin 示例,我会将 expect block 更改为:

Math.min(a, b) == c & Math.max(a, b) == d

发生故障时,它会为您提供以下信息:

Math.min(a, b) == c & Math.max(a, b) == d
| | | | | | | | | | |
4 5 4 | 5 false 5 5 4 | 4
false false

这会向您显示失败断言的每个部分。相比之下,如果您使用 &&,它只会显示第一次失败,如下所示:

Math.min(a, b) == c && Math.max(a, b) == d
| | | | | |
4 5 4 | 5 false
false

如果您在一行中有两个以上的检查,这显然会很快变得困惑 - 但这是您可以在一行中的所有失败信息之间做出的权衡,而不是在修复每个人后必须重新运行测试组件。

希望这对您有所帮助!

关于testing - 在同一个 Spock 测试中执行所有断言,即使其中一个失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33529817/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com