Intelli-J도 Eclipse에 비해서 유닛테스트 돌리기가 좀 불편하다는 인상(이건 Intelli-J에 익숙하지 않은 문제도 있겠지만)이 있기는 했지만 Vim으로 개발하니까 아예 JUnit을 돌리기가 불가능에 가까웠습니다. 그사이에 좀 좋아졌나 해서 이클립스용인 Scala-IDE를 다시 시도해봤지만 아직도 사용하기에는 불가능한 수준이었는데 마침 SBT를 이용하면 가능하다는 얘기를 듣고 SBT로 JUnit을 연동을 시도했습니다.
// src/main/scala/HelloSbt.scala
class HelloSbt {
def justOne = {
1
}
}
위와 같이 1을 리턴하는 간단한 메서드를 가진 클래스를 만들었습니다.
// src/test/scala/HelloSbtTest.scala
import org.junit._
import Assert._
class HelloSbtTest {
@Test
def testJustOne {
val t = new HelloSbt
assertEquals(1, t.justOne)
}
}
그리고 그 메서드를 테스트하는 간단한 JUnit 테스트를 만들었습니다. 이렇게 작성했을 경우 lib에 Junit을 추가하면 컴파일오류는 나지 않지만 테스트를 하기 위해서 sbt test로 테스트를 실행하면 No Tests to run이라고 나오면서 Junit의 테스트를 찾지 못했습니다.
JUnit Interface
SBT에서 JUnit을 사용하기 위해서는 스칼라의 테스트프레임워크인 ScalaTest, ScalaCheck, specs등의 Uniform Interface인 test-interface의 JUnit 버전인 JUnit-Interface를 사용해야 합니다. JUnit-inferface의 설명에 따르자면 스칼라 테스트프레임워크들과는 다르게 JUnit과 JUnit-Interface는 모두 Java로 작성되어 있기 때문에 테스트프레임워크를 먼저 빌드할 필요 없이 어떤 버전의 Scala에서도 Junit 테스트를 실행할 수 있습니다.
SBT 0.7버전 이상에서는 SBT가 junit-interface를 인지하고 있기 때문에 따로 파일을 수동으로 추가할 필요없이 설정에만 추가해 주면 SBT가 의존성 라이브러리를 추가하게 됩니다. SBT의 문서를 보면 SBT는 설정파일을 Scala 클래스로 관리하도록 되어 있습니다. 이 설정파일은 ./project/build폴더 아래에 두면 되고 설정 클래스는 sbt.Project를 구현한 클래스인데 일반적으로 sbt.DefaultProject를 상속받아서 사용합니다.
package sbt
class ManageDependencies(info: ProjectInfo) extends DefaultProject(info) {
val junitInterface = "com.novocode" % "junit-interface" % "0.5" % "test->default"
}
위와같이 DefaultProject를 상속받는 클래스를 만들어 줍니다. 클래스명은 원하는대로 해도 상관없으며 junitinterface에 대한 변수를 정의해 줍니다. 위 클래스를 SBT프로젝트 아래 ./projcet/build/ManageDependencies.scala 로 생성한 뒤에 프로젝트의 루트에서 sbt clean update를 실행하면 기존에 있던 lib폴더 외에 lib_managed폴더가 생기면서(설정에 의해서 관리되는 라이브러리는 이렇게 별도의 폴더에 들어간다고 합니다.) 설정한 의존라이브러리인 junit-4.8.1.jar, junit-interface-0.5.jar, test-interface-0.5.jar를 추가하게 됩니다.
이제 sbt test를 실행하면 자동으로 @Test가 붙은 테스트를 찾아서 테스트를 실행해주게 됩니다. Eclipse에서 돌릴때처럼 녹색막대를 볼 수 없는 것은 아쉬운 일이지만 그래도 돌릴 수는 있게 되었네요 ㅎ
Wow!! gooooood job~
Thanks~~~!