Scalaでテスト:Scala + ScalaTest + JUnit4

Posted 2010年12月12日 by

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))    
		}
	}
}






やはり、コンソールでプリントさせると、ミリ秒のSSSの値が違います。

納得!


Post Details

  • Post Title: Scalaでテスト:Scala + ScalaTest + JUnit4
  • Author: admin
  • Filed As: Scala
  • Tags:
  • You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

コメントを残す