Scala コード書いててそろそろキチンとテストもしないといけないなぁと思い ScalaTest のユーザーガイドを読んでたんだけど、簡単なお試しコード書かないとよく分からんなぁということで、積ん読状態になってた(というより、いつの間にか本棚にキチンと直してしまってた)『JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)』を Scala で書き直してみることに。 まぁ、最後まではいかないだろうけど、Matcher くらいまでいければ万々歳かな(笑)
今回はサンプル・コードを書いていくプロジェクトの準備。 ここでは sbt を使って環境構築をします。 Jar ファイルのダウンロードとか面倒だし。
目次
- 0. ことはじめ
- 1. テストコードの記述
- 2. ScalaTest 特化機能1
- 3. 可読性の高いテストコードの書き方
- 4. アノテーションとテストのスキップ
- 5. Matcher いろいろ~各種クラス編~
- 6. Matcher いろいろ~コレクション編~
- 7. Matcher いろいろ~論理演算・その他編~
- 8. カスタム Matcher の作成1 ~型クラス実装編~
- 9. カスタム Matcher の作成2 ~Matcher 実装編~
- 続く...
この記事の内容
参考
- 渡辺修司『JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)』
- ScalaTest 『User Guide』
- ScalaTest 『Scaladoc』
sbt プロジェクト
sbt プロジェクトで ScalaTest を使うには、build.sbt に以下のライブラリ依存性を追加します:libraryDependencies += "org.scalatest" % "scalatest_2.11" % "2.2.4" % "test"
テストにしか使わないライブラリなので、最後の「% "test"」をお忘れなく。 この記事内では以下のような build.sbt でテスト・コードを動かしていきます:
name := "scalatest-test" scalaVersion := "2.11.6" libraryDependencies += "org.scalatest" % "scalatest_2.11" % "2.2.4" % "test"
プロジェクトのディレクトリ構造は通常の sbt プロジェクトと同じようにします(Maven2/3 や Gralde と同じ):
- scalatest-test/
- build.sbt
- src/
- main/
- scala/ ・・・ ここにプロダクト・コードを配置
- test/
- scala/ ・・・ ここにテスト・コードを配置
テスト対象クラスとテストクラス
ではちょっとコードを書いていきましょう。 『JUnit 実践入門』にクラスを拝借して Scala で書いていきます。まずは当面テスト対象となるクラス Calculator クラス。
// scalatest-test/src/main/scala/scalatest/tutorial/Calculator.scala package scalatest.tutorial class Calculator { def multiply(x:Int, y:Int):Int = x * y def divide(x:Int, y:Int):Int = x / y }
『JUnit 実践入門』と別コードなのでパッケージも一応別名にしてます。 プロダクト・コードは
- scalatest-test/src/main/scala
に配置します。 続いて Calculator クラスのテストクラス CalculatorSpec:
// scalatest-test/src/test/scala/scalatest/tutorial/CalculatorSpec.scala package scalatest.tutorial import org.scalatest.FlatSpec class CalculatorSpec extends FlatSpec{ "A Calculator" should "do something" in { fail("まだ実装されていません") } }
fail メソッドがテストを常に失敗させるメソッドというのはいいでしょうけど(そのうちまた出てくるかな)、それ以外はちょっと JUnit のテストクラスと違いますね。 これらについては次回に。 テスト・コードは
- scalatest-test/src/test/scala
に配置します。
テストの実行
sbt でテストを実行するには、(コマンドライン上にて)プロジェクトのルート・ディレクトリで sbt コマンドによって sbt コンソール(sbt のインタラクティブ・コンソール)を開き、test タスクを実行します:PS C:\...\scalatest-test> sbt
Java HotSpot(TM) Client VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
[info] Set current project to scalatest-test ...
> test
[info] Updating {file:/C:/.../scalatest-test/}scalatest-test...
...
[info] CalculatorSpec:
[info] A Calculator
[info] - should do something *** FAILED ***
[info] まだ実装されていません (CalculatorSpec.scala:8)
[info] Run completed in 3 seconds, 581 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 0, failed 1, canceled 0, ignored 0, pending 0
[info] *** 1 TEST FAILED ***
[error] Failed tests:
[error] scalatest.tutorial.CalculatorSpec
[error] (test:test) sbt.TestsFailedException: Tests unsuccessful
[error] Total time: 21 s, completed 2015/06/04 9:40:05
(この実行結果は上記のテストコードではなく、もう少し先の記事のテスト結果。) 上記のコードではまだテストは失敗しますが、テストの実行はできます。 1つのコマンドでテストを実行したいなら、単にルート・ディレクトリで
sbt test
とすることもできます。 テストクラスを指定して実行したい場合は test-only の後にテストクラスを指定して実行します:
PS C:\...\scalatest-test> sbt
...
> test-only scalatest.tutorial.CalculatorSpec
[info] CalculatorSpec:
[info] A Calculator
[info] - should do something *** FAILED ***
[info] まだ実装されていません (CalculatorSpec.scala:8)
[info] Run completed in 2 seconds, 456 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 0, failed 1, canceled 0, ignored 0, pending 0
[info] *** 1 TEST FAILED ***
[error] Failed tests:
[error] scalatest.tutorial.CalculatorSpec
[error] (test:testOnly) sbt.TestsFailedException: Tests unsuccessful
[error] Total time: 3 s, completed 2015/06/04 9:43:46
指定するクラス名は完全修飾名にします。 ここでの scalatest.tutorial はパッケージ名です。 スペースで区切って複数のテストクラスを指定することもできます。 また正規表現ワイルドカード風の「*」を使うこともできるようです。 詳しくは
- ScalaTest User Guide『Using ScalaTest with sbt』
参照。
sbt 以外の、各種 IDE 上などでのテストの実行方法は『Running your tests』を参照。 IntelliJ IDEA, Eclipse, NetBeans は Scala 開発用のプラグインをインストールすれば、JUnit と同じように IDE 上でテストを実行できる*1ようにする機能も付属しているようです。 IntelliJ IDEA と Eclipse については以下の記事も参考にどうぞ:
これらの記事は sbt プロジェクトを前提に書いてますが、プラグインのインストールは sbt プロジェクトでなくても OK です。 NetBeans は Scala 関連のプラグインをインストールしても sbt プロジェクトのインストール等がうまくいかなかったので記事を書いてませんが、Scala 関連のプラグインをインストールすれば ScalaTest の機能を使うことができます。
今回は大事だけど面白味に欠ける環境のセットアップでしたが、次回から ScalaTest の本題突入。github.com
修正
コードのパッケージ名を「scalatest.tutorial」に変更しました。 また、テストの実行結果を上記のコードの実行結果そのままにしました(現段階ではテストは失敗します)。JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)
- 作者: 渡辺修司
- 出版社/メーカー: 技術評論社
- 発売日: 2012/11/21
- メディア: 単行本(ソフトカバー)
- 購入: 14人 クリック: 273回
- この商品を含むブログ (67件) を見る
- 作者: Martin Odersky,Lex Spoon,Bill Venners,羽生田栄一,水島宏太,長尾高弘
- 出版社/メーカー: インプレスジャパン
- 発売日: 2011/09/27
- メディア: 単行本(ソフトカバー)
- 購入: 12人 クリック: 235回
- この商品を含むブログ (46件) を見る
*1:クラスやメソッドを選択して右クリックから「実行」を選択するとテストが実行できる、など。