学んだことをなぐり書き


assertions と ensuring

// assertメソッドで値のチェックをすることが出来る
// 条件文が正しくなければAssertionErrorが出る
assert(0 == 0, "説明文")

// ensuringメソッドでブロックの戻り値をチェックすることも出来る
{
  "aiueo"
} ensuring (_.length == 5, "説明文")

// assert と ensuring は両方ともPredefに定義されている
// assert と ensuring はJava仮想マシンの-eaと-daのコマンド行オプションで有効・無効を切り替えられる

scalatest.FunSuite

http://www.scalatest.org/ から scalatest-x.x.jar をクラスパスが通っているディレクトリに置く
import org.scalatest.FunSuite

class TestSuite extends FunSuite {
  test("test(\"テストの説明\") { 実際のテストの処理 } という形にする"){}
  
  test("テスト項目を一時的に実行したくない場合は(pending)とする")(pending)
        
  test("== では比較した値が表示されない") {
    assert(1 == 2, "値が見れない><")
  }
  
  test("=== だと詳細が見えるので基本は === を使うといいっぽい。") {
    val (n1, n2) = (1, 2)
    assert(n1 === n2, "n1(1) は n2(2) じゃないよとちゃんと出る")
  }

  test("期待と結果が異なるということをはっきりさせたい場合は expect メソッドを使う") {
    // ブロックの戻り値で判定    
    expect(3, "3 が欲しかったけど違ったでござる") { 1 }
  }
      
  test("特定の例外が投げられたかをチェックしたい場合はinterceptメソッドを使う") {
    // IndexOutOfBoundsException を試しに投げてみる。
    intercept[IndexOutOfBoundsException] { List(1, 2, 3)(-1) }
    intercept[IllegalArgumentException]  { List(1, 2, 3)(-1) }    
  }
}

(new TestSuite).execute()
Main$$anon$1$TestSuite:
- test("テストの説明") { 実際のテストの処理 } という形にする
- テストが未完成で一時的に実行したくない場合は(pending)とする (pending)
- == では比較した値が表示されない *** FAILED ***
  値が見れない>< (test.scala:9)
- === だと詳細が見えるので基本は === を使うといいっぽい。 *** FAILED ***
  n1(1) は n2(2) じゃないよとちゃんと出る
1 did not equal 2 (test.scala:14)
- 期待と結果が異なるということをはっきりさせたい場合は expect メソッドを使う *** FAILED ***
  3 が欲しかったけど違ったでござる
Expected 3, but got 1 (test.scala:18)
- 特定の例外が投げられたかをチェックしたい場合はinterceptメソッドを使う *** FAILED ***
  Expected exception java.lang.IllegalArgumentException to be thrown, but java.lang.IndexOutOfBoundsException was thrown. (test.scala:24)

scalatest.matchers.Should(Must)Matchers

import org.scalatest.FunSuite
import org.scalatest.matchers.ShouldMatchers
// MustMatchersもあるけど違いは should か must なだけだと思う

class TestSuite extends FunSuite with ShouldMatchers {
  test("ShouldMatchers を with すれば assert の変わりにより自然言語(しかし英語)の形に近い文法で処理できる") {
    // should be の後に () か === でチェックする値を指定する
    10 should be(10)
    10 should be === 5
  }
  
  test("例外を受けとりたい場合は evaluating の後のブロックにテストを書きそのあと should produce [チェックしたい例外]にする") {
    // 試しに IndexOutOfBoundsException を投げてみる
    evaluating { List(1, 2, 3)(-1) } should produce [IndexOutOfBoundsException]
    evaluating { List(1, 2, 3)(-1) } should produce [IllegalArgumentException]
  }
}

(new TestSuite).execute()
Main$$anon$1$TestSuite:
- ShouldMatchers を with すれば assert の変わりにより自然言語(しかし英語)の形に近い文法で処理できる *** FAILED ***
  10 was not equal to 5 (test.scala:9)
- 例外を受けとりたい場合は evaluating の後のブロックにテストを書きそのあと should produce [チェックしたい例外]にする *** FAILED ***
  Expected exception java.lang.IllegalArgumentException to be thrown, but java.lang.IndexOutOfBoundsException was thrown. (test.scala:15)

メンバーのみ編集できます