倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

ScalaTest も『JUnit 実践入門』もまとめて相手してやんよ (0) : ことはじめ

Scala コード書いててそろそろキチンとテストもしないといけないなぁと思い ScalaTest のユーザーガイドを読んでたんだけど、簡単なお試しコード書かないとよく分からんなぁということで、積ん読状態になってた(というより、いつの間にか本棚にキチンと直してしまってた)『JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)』を Scala で書き直してみることに。 まぁ、最後まではいかないだろうけど、Matcher くらいまでいければ万々歳かな(笑)

今回はサンプル・コードを書いていくプロジェクトの準備。 ここでは sbt を使って環境構築をします。 Jar ファイルのダウンロードとか面倒だし。

目次

この記事の内容

参考

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 はパッケージ名です。 スペースで区切って複数のテストクラスを指定することもできます。 また正規表現ワイルドカード風の「*」を使うこともできるようです。 詳しくは

参照。

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)

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

Scalaスケーラブルプログラミング第2版

Scalaスケーラブルプログラミング第2版

  • 作者: Martin Odersky,Lex Spoon,Bill Venners,羽生田栄一,水島宏太,長尾高弘
  • 出版社/メーカー: インプレスジャパン
  • 発売日: 2011/09/27
  • メディア: 単行本(ソフトカバー)
  • 購入: 12人 クリック: 235回
  • この商品を含むブログ (46件) を見る

*1:クラスやメソッドを選択して右クリックから「実行」を選択するとテストが実行できる、など。