在Spock测试中传递where:block中的值

时间:2013-09-25 21:08:08

标签: unit-testing groovy spock

是否可以在这样的块中传递值。

我试过这个。但它失败了,并给出了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
    }

2 个答案:

答案 0 :(得分: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)

这种方法

  • 提供了测试逻辑和测试数据之间关注点的良好分离
  • 允许相对通用的测试重用于各种输入和边缘情况
  • 避免重复测试代码
  • 支持一种值得数据驱动测试的测试设计风格。

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

有关详细信息,请参阅the Spock documentation

答案 1 :(得分:5)

试试这个:

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

}

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

希望有所帮助!!!

由于