3

是否可以像这样在 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
    }
4

2 回答 2

7

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

看到这一点的一种粗略方法是将测试主体(不包括 where 块)视为具有一定数量参数的方法 - 在您的情况下为 2,名称和长度。然后意识到 where 子句只是为测试运行器提供数据值,以便在调用测试方法时使用。

Spock 使用 Groovy 魔法进行改造

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)

这种方法

  • 在测试逻辑和测试数据之间提供了很好的关注点分离
  • 允许对广泛的输入和边缘情况重用相对通用的测试
  • 避免重复测试代码
  • 支持一种名副其实的数据驱动测试的测试设计风格。

这种解释省略了一些细节,例如为每个测试创建规范实例、更新每个测试调用的名称以及调用各种设置和清理方法。

有关更多详细信息,请参阅Spock 文档

于 2013-09-25T21:37:24.313 回答
7

尝试这个:

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

}

def getTestData(){
        [["Ram"  ,3 ] ,["Test" ,4] ]
    }

希望有帮助!!!

谢谢

于 2013-09-26T08:56:08.637 回答