2017-10-10 11 views
4

このようなテストを行い、where句データテーブルを再利用可能なブロックに抽出できますか?Spock:再利用可能なデータテーブル

@Unroll 
void "test that doSomething with #a and #b does not fail"(String a, String b) { 
    when: 
     doSomethingWithAandB(a, b) 
    then: 
     notThrown(Exception) 
    where: 
     a  | b 
     "foo" | "bar" 
     "foo" | "baz" 
     "foo" | "foo" 
} 

このような何か(擬似コード):

@Unroll 
void "test that doSomethingElse with #a and #b does not fail"(String a, String b) { 
    when: 
     doSomethingElseWithAandB(a, b) 
    then: 
     notThrown(Exception) 
    where: 
     dataTable() 
} 

def dataTable(a, b) { // this is now reusable in multiple tests 
     a  | b 
     "foo" | "bar" 
     "foo" | "baz" 
     "foo" | "foo"   
} 
+0

こちらをご覧ください:https://stackoverflow.com/questions/26156544/using-spock-data-table-for-filling-objects – Opal

答えて

1

はい、できます。もちろん

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

class SampleTest extends Specification { 
    @Unroll 
    def "max of #a and #b gives #c"() { 
    expect: 
    Math.max(a, b) == c 
    where: 
    a << aProvider() 
    b << bProvider() 
    c << cProvider() 
} 

private List<Integer> aProvider() { 
    [1 ,2 ,4] 
} 
private List<Integer> bProvider() { 
    [0 ,2 ,5] 
} 

private List<Integer> cProvider() { 
    [1 ,2 ,5] 
} 
} 

、aProvider/bProvider/cProvider「groovier道」にし、他のものの間で書き換えることができ、いくつかのクラスに外部化し、多くのテストで再利用することができます。テーブルを指定する必要はありませんが、 'データパイプ'を提供できます。 Data Driven Testingの章をご覧ください。

0

ありがとうございました、あなたのためにanswer!私が学んだことに基づいて、私は合理的に簡単な解決策に着きました。 where句で

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

class SampleTest extends Specification { 
    @Unroll 
    def "max of #a and #b gives #c"() { 
     expect: 
      Math.max(a, b) == c 
     where: 
      params << dataTable() 
      a = params.a 
      b = params.b 
      c = params.c 
    } 

    // this is now reusable in multiple tests 
    def dataTable() { 
     return [ 
      // case 1 
      [ 
       a: 1, 
       b: 0, 
       c: 1 
      ], 

      // case 2 
      [ 
       a: 1, 
       b: 2, 
       c: 2 
      ], 

      // case 3 
      [ 
       a: 4, 
       b: 5, 
       c: 5 
      ] 
     ] 
    } 
} 
1

表形式のデータは、実際には、コンパイル時にOR式、リストのリストに集め、次いで転置の集合として解析され、これは:

where: 
a | b | c 
1 | 0 | 1 
2 | 2 | 2 
4 | 5 | 5 

に変換されますこの:試験方法が生成される前に

where: 
a << [1, 2, 4] 
b << [0, 2, 5] 
c << [1, 2, 5] 

(詳細はorg.spockframework.compiler.WhereBlockRewriterを参照してください)。このvar << list構成は、documentationの "データパイプ"と呼ばれます。

class SampleTest extends Specification { 
    @Unroll 
    def "max of #a and #b gives #c"() { 
     expect: 
     Math.max(a, b) == c 
     where: 
     [a, b, c] << dataTable() 
    } 

    static def dataTable() { 
     [ 
       [1, 0, 1], 
       [2, 2, 2], 
       [4, 5, 5] 
     ] 
    } 
} 

ビットは、スポック1.1のように1つのテーブルを移調します「マルチバリアブルデータパイプ」と呼ばれる構造を使用して、コードを少し短くすることができ、既存の答えをアップグレード

楽しい事実は:docs on Syntactic Variationsは理由を説明しませんが、テーブルの行がOR式のセットとして解析されているので、それは、二重のバーも使用することができます -

where: 
a | b || c 
1 | 0 || 1 
2 | 2 || 2 
4 | 5 || 5 
関連する問題