gpt4 book ai didi

testing - 使用 Spock 在不同的测试环境中运行测试

转载 作者:行者123 更新时间:2023-11-28 20:50:06 27 4
gpt4 key购买 nike

我目前正在使用 REST Client 和 Spock 编写 REST API 测试。我希望能够在不同的测试环境中运行我的测试。我的测试数据因测试环境而异,因此需要为每个环境使用和指定不同的输入数据。对于下面的示例测试

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

where:
a | b || c
1 | 3 || 3
}
}

我可以为每个环境指定不同的数据表吗?

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

where:
@TEST
a | b || c
1 | 3 || 3

@PROD
a | b || c
4 | 5 || 6

}
}

如果不是,解决这个问题的最佳方法是什么?谢谢。

最佳答案

我想到实现您的期望的最简单方法是在基于某些条件(例如执行环境)运行测试方法之前准备数据,然后在您的测试中使用此预定义数据。考虑以下示例:

import spock.lang.Shared
import spock.lang.Specification
import spock.lang.Unroll

class EnvBasedDataSpec extends Specification {
@Shared
static Map data = [:]

def setupSpec() {
/* If you want to pick variable from env variables, use:
* System.getenv().getOrDefault('execution.environment', 'test')
*
* If you want to provide variable like -Dexecution.environment=test, use:
* System.getProperty('execution.environment', 'test')
*/
def executionEnvironment = System.getProperty('execution.environment', 'test')

switch (executionEnvironment) {
case 'test':
data = [a: 1, b: 3, c: 3]
break
case 'prod':
data = [a: 2, b: 4, c: 4]
break
}
}

@Unroll
def "maximum of two numbers (#a, #b) == #c"() {
expect:
Math.max(a, b) == c

where:
a | b || c
data.a | data.b || data.c
}
}

在此示例中,我们准备了共享数据,其中包含我们将在测试中使用的值。这里我们期望执行环境信息将作为

-Dexecution.environment=value 

属性(或者您可以使用环境变量传递相同的信息)。在此示例中,如果缺少给定属性,我们还使用默认值 - 在这种情况下为 test(如果您忘记指定执行环境变量,它将防止测试失败)。

备选方案:@IgnoreIf 条件执行

Spock 支持条件执行。看看如果我们使用 @IgnoreIf 方法相同的测试会是什么样子:

import spock.lang.IgnoreIf
import spock.lang.Specification

class AlternativeEnvBasedDataSpec extends Specification {

@IgnoreIf({ System.getProperty('execution.environment') == 'prod' })
def "maximum of two numbers (test)"() {
expect:
Math.max(a, b) == c

where:
a | b || c
1 | 3 || 3
}

@IgnoreIf({ System.getProperty('execution.environment') == 'test' })
def "maximum of two numbers (prod)"() {
expect:
Math.max(a, b) == c

where:
a | b || c
2 | 4 || 4
}
}

不幸的是,这种方法需要大量重复:您必须重复测试方法并且不能重复使用相同的名称(编译器不允许这样做)。它很容易出错——你必须注意将相同的测试体放在所有应该测试相同内容但使用不同数据的方法中。另一件事是,如果您引入第三个环境,则必须修改传递给 @IgnoreIf 的条件 - 在这种情况下,您将指定类似的内容:

@IgnoreIf({ !(System.getProperty('execution.environment') in ['staging', 'prod']) })

我想你已经看到它开始有多少问题了。

关于testing - 使用 Spock 在不同的测试环境中运行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50382826/

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