Techいつもコードのことばかり考えている人のために。2017-12-06Specs2でテストに失敗したときに例外を投げるScala用の代表的なテスティングフレームワークの1つがSpecs2です。specification"と呼ばれる自由度の高い仕様の記述方法が特徴的です。calcUltimateQuestionメソッドの結果の正当性を確認するテストコードです。s2"""..."""で囲まれた中に仕様を自由に記述し、テストを実行するメソッドのメソッド名を$を付けて埋め込むと、テストが実行された時に結果が埋め込まれ、成否が表示されます(上記の例でいえば、caclメソッド)。PMテストクラスの名称の後ろに「+」が表示されていれば、そのテストクラスのテストは成功したことになります。試しにテストコードの数値を「43」に書き換えると、当然演算結果が一致しないのでテストは失敗します。UltimateAnswerSpec実際のテストの判定は、マッチャーと呼ばれるメソッドで行います。be_==(42)」がマッチャーを使った箇所になります。このコードでは、計算結果が格納されたanswerという変数が42でなければならないことを表しています。判定結果はそのままメソッドの返り値として使われ、テストの成否が判定されます(Scalaではメソッドの最後に書かれた値が返り値になります)。ここまでは通常のspecs2の使い方です。ある(?)ミスこれは自分だけかもしれませんが、specs2を初めて使ったとき、あと久しぶりに使った時によくやる間違いが、テストメソッドの中でマッチャーを複数使うことです。極端な例ですが、下記のテストは、テストメソッド全体としては成功してしまいます。be_==(42)なぜならば、あくまでspecs2ではテストメソッドの戻り値だけがテストの成否に使われるからです。PerlのTest::Moreなどに慣れていると、うっかり書いてしまいますね。andで連結するこんな時はマッチャーの結果をandで連結します(上記の例を成功するように書き換えています)。be_>(41)テスト対象の変数が複数有るときはコードブロックで連結します。traitを使うと、マッチャーが失敗すると、例外を送出し、テストが失敗します。}}結果はこうなります。(UltimateAnswerSpec.scala:22)おわりにうっかり書いてしまうテストメソッド内の複数マッチャーに対する対策を書きました。ThrownExpectationsは、なんとspecs2の作者で有る@etorreborre‏さんに教えてもらいました。Type-Sを買った月別アーカイブはてなブログをはじめよう!magnoliakさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。