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

RSM*_*RSM 3 groovy unit-testing 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
    }
Run Code Online (Sandbox Code Playgroud)

Ale*_*ore 7

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

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

Spock使用Groovy魔法进行转换

def "test length of names"()  {
    expect:
        name.size() == length   
    where:
        name     | length
        "Spock"  | 5
        "Java"   | 4
}
Run Code Online (Sandbox Code Playgroud)

大致相似的东西

def test_length_of_names(name, length)  { // note the arguments
    assert name.size() == length
}
Run Code Online (Sandbox Code Playgroud)

然后告诉测试运行器为where子句中的每一行调用一次测试

test_length_of_names("Spock", 5)
test_length_of_names("Java", 4)
Run Code Online (Sandbox Code Playgroud)

这种方法

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

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

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


Anu*_*eja 5

试试这个:

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

}

def getTestData(){
        [["Ram"  ,3 ] ,["Test" ,4] ]
    }
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!

谢谢