ScalaでJUnitでテスト
Java開発で使っている手順で重要なのが単体テストです。
JUnit3やJUnit4を使っていますが、Scalaで単体テストを試してみました。
テスト用のサンプルコードです。
hello クラスは、「greeting (あいさつ)」と「now (今)」という2つの関数を持っています。
import java.util.Date class hello { def greeting : String = { val s ="Hello! Scala" s } def now : Date = { new Date } }
「JUnit4をScalaで使えるか?」 ということで、書いたコードです。
hello クラスの、「greeting (あいさつ)」と「now (今)」ごとにテスト用の関数を定義します。
関数が返す正常値が正しく返しているかを、assertEquals を使って検証します。
import org.junit._ import org.junit.Assert._ import java.util.Date class testHello { @Test def greeting : Unit = { val hello = new hello println(hello.greeting) assertEquals("Hello! Scala", hello.greeting) } @Test def now : Unit = { val hello = new hello println(hello.now) assertEquals(new Date, hello.now) } }
テスト環境とし準備することは、EclipseのプロパティにJUnit.jar をクラスパスに追加します。
Eclipseの上で実行した結果です。イニシャライズでクラスがないとエラー。
eclipse の JUnit に Hamcrest がないということで、入手します。
http://code.google.com/p/hamcrest/downloads/list
hamcrest-all-1.3.0RC2.jarを、Eclipseのプロパティにクラスパスに追加します。
実行すると、結果は合格。
コンソールは、
しかし、この結果には納得できないなぁ。これって、toString した結果を比較していない?
Scala Test
ネットで調べてみると、ScalaTest というものがあるこということで、これも試します。
Scala Testを開発しているサイトは、http://www.scalatest.org/です。
クイックスタートというページがあります。 JUnit3とJUnit4とどちらでも使えるようです。
今回は、JUnit4なので以下のURLを参照。
http://www.scalatest.org/getting_started_with_junit_4
テスト環境とし準備することは、
http://www.scalatest.org/downloadからモジュールをダウンロードします。
テスト環境とし準備することは、Eclipseのプロパティに scalatest-1.2.jar をクラスパスに追加します。
import org.scalatest.junit.JUnitRunner import org.junit.runner.RunWith import org.scalatest.matchers.ShouldMatchers import org.scalatest.Spec import java.util.Date @RunWith(classOf[JUnitRunner]) class HelloTest extends Spec with ShouldMatchers { describe("Greeting") { it("should run") { val hello = new hello hello.greeting should be ("Hello! Scala") } } describe("Now") { it("should run") { val hello = new hello hello.now should be (new Date) } } }
結果は、先ほどと異なり、hello.now のテストでは値が一致しないとエラーとなります。
なぜ不合格となるのか? ミリ秒単位で違うから?
helloをテストするコードを書いているとき、
処理するタイミングは当然微妙に違うのでエラーが正常のだと思っていたのでこの結果を支持するのですが、
はっきりしたいとので、フォーマットしてStringで比較しましょう。
NowSSS関数を追加すます。
import java.util.Date import java.text._ class hello { def greeting : String = { val s ="Hello! Scala" s } def now : Date = { new Date } def nowSSS : String = { val d = new Date val sdf = new SimpleDateFormat("yyyyMMdd HHmmssSSS") println(sdf.format(d)) sdf.format(d) } }
テストコードにも、NowSSS関数を追加すます。
import org.scalatest.junit.JUnitRunner import org.junit.runner.RunWith import org.scalatest.matchers.ShouldMatchers import org.scalatest.Spec import java.util.Date import java.text._ @RunWith(classOf[JUnitRunner]) class HelloTest extends Spec with ShouldMatchers { describe("Greeting") { it("should run") { val hello = new hello hello.greeting should be ("Hello! Scala") } } describe("Now") { it("should run") { val hello = new hello hello.now should be (new Date) } } describe("NowSSS") { it("should run") { val hello = new hello val d = new Date val sdf = new SimpleDateFormat("yyyyMMdd HHmmssSSS") println(sdf.format(d)) hello.nowSSS should be (sdf.format(d)) } } }
コメントを残す
コメントを投稿するにはログインしてください。