Magnolia Tech

いつもコードのことばかり考えている人のために。

ScalaCheckを他のテスティングフレームワークと組み合わせる

blog.magnolia.tech

前回の記事の続き...

ScalaCheckで書かれたテストには、色々な起動方法が提供されていますが、他のテストと同じようにsbttestコマンドで起動できた方が便利です。

import org.scalacheck._

object ExampleTest extends Properties("String") {
  property("startWith") = Prop.forAll { (a: String, b: String) =>
    (a + b).endsWith(b)
  }
}

ScalaCheckには、sbtのtesting interfaceを継承したRunnerが提供されているので、Propertiesクラスを継承したテストクラスに、個々のテストをpropertyで定義しておけば、sbttestコマンドでテストが実行されます。

[info] + String.startWith: OK, passed 100 tests.
[info] Passed: Total 1, Failed 0, Errors 0, Passed 1
[success] Total time: 3 s, completed Jul 22, 2023, 4:27:10 PM

ただ、完全にScalaCheckだけでライブラリのテストが完結する、というシチュエーションはあまり無いので、既存のテスティングフレームワークの中でScalaCheckのテストを実行する方法が用意されています。

AirSpec

wvlet.org

wvlet.airspec.spi.PropertyCheckが、forAllのラッパー関数を提供しているので、そのままScalaCheckの記法と変わらず書けますし、独自のアサーションも使えます。

munit

scalameta.org

munit.ScalaCheckSuitepropertyのラッパー関数を提供しているので、そのままScalaCheckの記法と変わらず書けますし、独自のアサーションも使えます。


その他、specs2や、ScalaTestでもサポートされています。

specs2

etorreborre.github.io

ScalaTest

www.scalatest.org