Specs2のParameterized Testのはなし

はー、TDD Advent Calendar 2012の15日目ですねー。

誘われたのはいいけど特に書くことないなー、なにかないかなーと考えていたらタイムリミットが近づいてきて胃が痛くなってきたので、とりあえずダミー記事をあげておきます。いつか本物の記事がupされるかもしれません(フラグ)これもアリかなということで小ネタ。

SpockのParameterized Testあるよね

こんな感じの。

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

class HogeSpock extends Specification {

    @Unroll
    def "fizzBuzzへの入力値が #num の時は #res が返される"() {
        def sut = new HogeJava()
        expect: sut.fizzBuzz(num) == res
        where:
        num | res
        1   | "1"
        2   | "2"
        3   | "Fizz"
        4   | "4"
        5   | "Buzz"
        6   | "Fizz"
        7   | "7"
        8   | "8"
        9   | "Fizz"
        10  | "Buzz"
        11  | "11"
        12  | "Fizz"
        13  | "13"
        14  | "14"
        15  | "FizzBuzz"
    }
}

きれいだねーそうだねー。

Specs2も似たような書き方がある

あるらしいですよ奥さん。

import org.specs2.mutable.Specification
import org.specs2.matcher.DataTables

class FizzBuzzSpec extends Specification with DataTables {

  "FizzBuzz" should {
    "入力値に対応する文字列が返る" in {
      "num" | "res"      |
      1     ! "1"        |
      2     ! "2"        |
      3     ! "Fizz"     |
      4     ! "4"        |
      5     ! "Buzz"     |
      6     ! "Fizz"     |
      7     ! "7"        |
      8     ! "8"        |
      9     ! "Fizz"     |
      10    ! "Buzz"     |
      11    ! "11"       |
      12    ! "Fizz"     |
      13    ! "13"       |
      14    ! "14"       |
      15    ! "FizzBuzz" |> {
        (num, res) => fizzBuzz(num) must_== res
      }
    }
  }
}

ほえー

試しに間違えてみる

6と15の期待値を間違えてテストしてみる。

FizzBuzz should

  | num | res     |                                     
+ | 1   | 1       |                                     
+ | 2   | 2       |                                     
+ | 3   | Fizz    |                                     
+ | 4   | 4       |                                     
+ | 5   | Buzz    |                                     
x | 6   | Fiz     | 'Fizz' is not equal to 'Fiz'        
+ | 7   | 7       |                                     
+ | 8   | 8       |                                     
+ | 9   | Fizz    |                                     
+ | 10  | Buzz    |                                     
+ | 11  | 11      |                                     
+ | 12  | Fizz    |                                     
+ | 13  | 13      |                                     
+ | 14  | 14      |                                     
x | 15  | FizzBuz | 'FizzBuzz' is not equal to 'FizzBuz'
...

へーほー。ちなみに2要素以上でないと使えません。

まとめ

この記事について?特になし。

明日は北のほうまでとんで@shuji_w6eさんです。

没ネタ一覧

今回のAdvent Calendar用に考えた没ネタと、間に合いそうになかったネタの一覧。

  • TDDのテストは自己満足
  • TDDer 名は体をあらわす
  • GOOS写経の感想その他
  • JUnit実戦入門の他言語での写経
  • TDDBCを開催して思ったこと
  • ユニットテストとランダムテスト
  • そんな状況でTDDやってられるかよ

いつか書くかも