Unit testing 在Spock测试中的where:块中传递值

Unit testing 在Spock测试中的where:块中传递值,unit-testing,groovy,spock,Unit Testing,Groovy,Spock,是否可以像这样在where块中传递一个值 我试过这个。但它失败了,并给出了MissingPropertyException 我希望name1和name2在方法中 def "length of names #name"() { def name1 = "Spock" def name2 = "Java" expect: name.size() == length where:

是否可以像这样在where块中传递一个值

我试过这个。但它失败了,并给出了MissingPropertyException

我希望name1和name2在方法中

def "length of names #name"()  {    
        def name1 = "Spock"
        def name2 = "Java"

        expect:
            name.size() == length

        where:
            name        || length
            name1       || 5
            name2       || 2
    }

测试数据属于where块,而不是在测试(特征)方法中硬编码

一个粗略的方法是将测试体(不包括where块)看作一个具有一些参数的方法——在您的例子中为2,名称和长度。然后认识到where子句只向测试运行程序提供数据值,以便在调用测试方法时使用

Spock使用Groovy magic进行转换

def "test length of names"()  {
    expect:
        name.size() == length   
    where:
        name     | length
        "Spock"  | 5
        "Java"   | 4
}
变成大致像

def test_length_of_names(name, length)  { // note the arguments
    assert name.size() == length
}
然后告诉测试运行程序为where子句中的每一行调用一次测试

test_length_of_names("Spock", 5)
test_length_of_names("Java", 4)
这种方法

  • 在测试逻辑和测试数据之间提供了良好的关注点分离
  • 允许对广泛的输入和边缘情况重复使用相对通用的测试
  • 避免测试代码中的重复
  • 支持一种值得称为数据驱动测试的测试设计风格
本说明省略了一些细节,例如为每个测试创建规范实例、更新每个测试调用的名称以及调用各种设置和清理方法

有关详细信息,请参阅。

尝试以下方法:

def "test length of names"()  {
    expect:
        name.size() == length   
    where:
    [name,length]<<getTestData()

}

def getTestData(){
        [["Ram"  ,3 ] ,["Test" ,4] ]
    }
def“名称的测试长度”(){
期望:
name.size()=长度
哪里:

[name,length]是的,“where”数据在功能测试之外,但是Spock的词汇布局功能在功能内部出现。顺便说一句,“Spock documentation”链接已断开。关于“where子句”,我希望有一种重用数据的机制那
Where
是一个接口,它允许
private Where getTestData(){…}
从Anuj的示例返回Where表。当然,我更喜欢整洁的表语法。谢谢你非常清晰的解释。文档链接是固定的。谢谢你指出这一点。