パーソナルツール
現在の場所: ホーム Users YAMADA Masaki 2009 0912 SpockInJapanese Parameterizations
ログイン


パスワードを忘れた?
 

Parameterizations

— カテゴリー:

Groovy/Grailsの振る舞い駆動開発 (Behavior-driven Development, BDD) フレームワーク Spockの使い方 (邦訳)

パラメタ化   

フィーチャ・メソッドのパラメタ化の方法を学ぼう.

単純なパラメタ化 Simple parameterizations

where:
x << dataProvider

ここで x を束縛されていない (つまり未定義の) 変数, データ・プロバイダ dataProvider をGroovyのセマンティクスにしたがって繰り返すオブジェクトとします. dataProvider の返すひとつひとつの値が変数 x に束縛され, 次いでフィーチャ・メソッドが一回ずつ実行されます (setup() と cleanup() も含む). 変数に束縛されたそれぞれの値に対するフィーチャ・メソッドの実行を 繰り返し iteration と呼びます.

もし静的型付けがお好みならば x をフィーチャ・メソッドの引数として定義することもできます:

def "test me"(int x) {
  // ...
  where: x << [1,2,3]
}

もしフィーチャ・メソッドが, 複数の単純パラメタを持つのならば, データ・プロバイダが返す値の最小数回だけ繰り返され, 残った値は無視されます:

where:
x << [1, 2]
y << [4, 5, 6]

このパラメタ化の場合, 繰り返しが二回起動され, 一回は x=1, y=4, もう一回は x=2, y=5 という束縛になります.

データ・プロバイダ上での繰り返しに加えて, Spockではデータ・プロバイダが持つ次の2つのメソッドを呼び出すことができます. データ・プロバイダに size() メソッドがあれば, Spockはこのメソッドの返す値を使って, フィーチャ・メソッドの繰り返し回数をの見積りを計算します. またデータ・プロバイダが close() メソッドを持っていれば, Spockはデータ・プロバイダが不要になった時点でこのメソッドを一度, 呼び出します.

自前のデータ・プロバイダを書くのはとても簡単で, 二つのメソッド next() と hasNext() (java.lang.Iterable で定義されている), size() と close() (こっちはなくてもいい) を実装するだけでOK!

導出パラメタ化 Derived parameterizations

where:
x = expression

導出パラメタ化 (Derived parameterizations) では前の値を元に次の値を計算します. 繰り返しのたびに評価されますが, それ自身が余計な繰り返しを引き起こすことはありません. 通常, 導出パラメタ化は単純なパラメタ化と組み合わせて使われます:

where:
row << sql.execute("select * from customer")
firstName = row["first_name"]
secondName = row["second_name"]
name = firstName + " " + secondName

導出パラメタ化を使って, 固定値に名前を付けることもできます.

when: stack.push(item)
then: stack.pop() == item
where: item = new Car("Porsche", Color.RED)

ここで item は new Car("Porsche", Color.RED) の別名になっており, フィーチャ・メソッドのロジックと, そこで使われる具体的なデータとを明確に切り離すことができます.

多重パラメタ化 Multi-parameterizations

スプレッドシートやデータベースのような外部データを使うときには特に, 複数の値を一度に代入できると便利な場合があります. そこでSpockでは, Groovyの多重代入と同様の書き方もできるようにしました.

where:
[name, age, gender] = sql.execute("select name, age, sex from customer")

ここでは, Spockは問い合わせで返される各行ごとに (これまた Groovyの繰り返しのセマンティクスと同様に) 繰り返し, 最初の要素を name に, 二番目の要素を age に, 三番目の要素を gender に束縛します. 各行の残りの要素は無視されます. 間の要素を飛び越すには, プレースホルダを使って次のようにします:

where:
[name, _, gender] = sql.execute("select name, age, sex from customer")

(この例の場合には, もちろんSQL問い合わせの方を変えて, name と sex だけを返すようにすればいいんですけどね)

original: http://code.google.com/p/spock/wiki/Parameterizations

translated into Japanese by masaki@metabolics.co.jp at 2009.12.06