ゼロから始めるScala – いきなりユニットテスト編

Scalaのテストを書くことになり、各種ブログやフォーラム、wikiを検索しつつ、各フレームワークの特性や相互の選択肢等を検討した結果を「ゼロから始めるScala with いきなりユニットテスト編」として書きおこしてみました。なお実際のテストコードについては今回はありません。
2020.06.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

業務どころか趣味ですら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.sbtproject/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のベストプラクティスを探りながら、リファクタリングも含めつつ着手しようと思います。

参考記事