ゼロから始めるScala – いきなりユニットテスト編
はじめに
業務どころか趣味ですらScalaを書いたことがない状態ながら、Scalaを用いたプロジェクトにてテストを検討することにしました。テスト自体は他の言語で散々書いてきたこともあり、互換性を持っていて、且つ使い勝手がよく生きているフレームワークがあればなんとかなるはずです。
また、コード書いたことなくてもテスト書けるならどうにかなるだろうの精神です。
以下、テスト用各種フレームワークに触れていきます。何も知らない状態で調査した結果から判断した内容となっています。「それは違うだろう」という点もあるかもしれません。
Scalaのユニットテストフレームワークの選択肢
歴史が古いもの、及び古いものからフィーチャーされてできたもの、最新のものまでいくつもあります。
- JUnit
- TestNG
- specs(specs2)
- ScalaTest
- ScalaCheck
あれこれ試すのもよいですが、やることは結局同じです。ScalaTestにはtraitとして他のフレームワーク(JUnit, TestNG)を使い分ける選択肢が用意されていることと、以下のDevIO記事も参考にScalaTestとspecs2の2つに絞りました。
ScalaTestとspecs2の違い
上記記事を読む限り、正直好みという点が大きいと思います。大量のfixtureを用いて行うケースにおいてはProperty-Based Testingの点からScalaTest (+ ScalaCheck)が有効かもしれません。
ScalaTestで他のTestSuiteを選択的に用いる
以下の選択肢を使い分けます。とはいえ、テストが何もない状態からのスタートなので、無理に利用する必要はないかもしれません。
- JUnit
org.scalatest.junit.JUnitSuite
- TestNG
org.scalatest.testng.TestNGSuite
以下、今回はScalaTestの前提で進めていきます
ゼロからの導入
プロジェクトが既に存在し、テストケースだけが存在しないという前提です。
ファイルへの追記
ScalaTest公式サイトにて最新のバージョンを確認しておきます。当記事時点では3.1.2です。以下、公式のインストール手順からいくつか抜粋したものになります。
各sbtファイルへ追記しますが、build.sbt
とproject/plugins.sbt
については実際のパスに読み替えてください。
echo 'libraryDependencies += "org.scalactic" %% "scalactic" % "3.1.2"' >> build.sbt echo 'libraryDependencies += "org.scalatest" %% "scalatest" % "3.1.2" % "test"' >> build.sbt mkdir -p ~/.sbt/0.13/ echo 'resolvers += "Artima Maven Repository" at "http://repo.artima.com/releases"' >> ~/.sbt/0.13/global.sbt echo 'addSbtPlugin("com.artima.supersafe" % "sbtplugin" % "1.1.10")' >> project/plugins.sbt
pom.xmlへの追記
以下のdependenciesを追記します。
<dependency> <groupId>org.scalactic</groupId> <artifactId>scalactic_2.13</artifactId> <version>3.1.2</version> </dependency> <dependency> <groupId>org.scalatest</groupId> <artifactId>scalatest_2.13</artifactId> <version>3.1.2</version> <scope>test</scope> </dependency>
あとがき
流石に色々とテストフレームワークがあるなと思いましたが、traitにて選択的に利用できることは幸いでした。とはいえ、フレームワークを選択したからといって、世の中のプロジェクト全てが柔軟にテスト可能なコード設計とは限りません。
最初にふれましたが、(必要に駆られなかったため)業務どころか趣味ですらScalaを書いたことがない状態です。Scalaのベストプラクティスを探りながら、リファクタリングも含めつつ着手しようと思います。