sbt test
概要
sbt [query / ] test [testname1 testname2] [ -- options ]
説明
test タスクはテストのコンパイルと実行の手段を提供する。
sbt 2.x の test タスクの特長:
- サブプロジェクトの並列化。クエリで指定された関連サブプロジェクトのコンパイルを並列で実行する。
- テストスイートの並列化。検出されたテストスイートをタスクにマッピングし、並列で実行する。
- 差分テスト。前回失敗したテスト、未実行のテスト、または sbt がテストやその依存関係の変更を検出した場合のみ実行する。
- キャッシュ。テスト結果はマシン全体でキャッシュされ、オプションでリモートキャッシュも可能。
テスト用の標準ソース配置は以下の通り:
src/test/scala/内の Scala ソースsrc/test/java/内の Java ソースsrc/test/resources/内のテストクラスパス用リソース
リソースは java.lang.Class または java.lang.ClassLoader の getResource メソッドでテストからアクセスできる。
テストインターフェース
sbt は JVM ベースのテストフレームワーク用の共通インターフェースを定義し、テストスイートの自動検出と並列実行を可能にする。デフォルトで sbt は MUnit、ScalaTest、Hedgehog、ScalaCheck、Specs2、Weaver、ZIO Test、JUnit 4 と連携する。テストフレームワークをクラスパスに追加するだけで sbt で利用できる。例えば MUnit は libraryDependency として宣言して使用する:
lazy val munit = "org.scalameta" %% "munit" % "1.2.0"
libraryDependencies += munit % Test
上記では、Test は Test コンフィギュレーションを表し、MUnit はテストクラスパスにのみ含まれ、main ソースでは不要であることを意味する。
JUnit
JUnit 5 のサポートは sbt-jupiter-interface にて提供される。プロジェクトに JUnit Jupiter サポートを追加するには、プロジェクトのメイン build.sbt に jupiter-interface のライブラリ依存性を追加する。
libraryDependencies += "com.github.sbt.junit" % "jupiter-interface" % "0.15.1" % Test
project/plugins.sbt に sbt-jupiter-interface プラグインを追加する:
addSbtPlugin("com.github.sbt.junit" % "sbt-jupiter-interface" % "0.15.1")
JUnit 4 のサポートは junit-interface にて提供される。プロジェクトのメイン build.sbt に junit-interface のライブラリ依存性を追加する。
libraryDependencies += "com.github.sbt" % "junit-interface" % "0.13.3" % Test
テストフィルタリング
sbt 2.x では、test タスクは実行するテスト名の空白区切りリストを受け付ける。例:
> test example.ExampleSuite example.ExampleSuite2
出力例:
> test example.ExampleSuite example.ExampleSuite2
[info] compiling 1 Scala source to /tmp/foo/target/out/jvm/scala-3.7.2/foo/backend ...
[info] compiling 2 Scala sources to /tmp/foo/target/out/jvm/scala-3.7.2/foo/test-backend ...
example.ExampleSuite:
+ addition 0.003s
example.ExampleSuite2:
+ subtraction 0.003s
[info] Passed: Total 2, Failed 0, Errors 0, Passed 2
[success] elapsed time: 3 s, cache 49%, 25 disk cache hits, 26 onsite tasks
ワイルドカードもサポートする:
> test *Example*
差分テスト
明示的なフィルタに加え、test タスクは以下のいずれかの条件を満たすテストのみを実行する:
- 前回失敗したテスト
- 以前実行されていなかったテスト
- 1つ以上の間接依存ライブラリが、別のプロジェクトにある場合も含め、再コンパイルされたテスト。
フルテスト
sbt 1.x のようにキャッシュなしのフルテストを実行するには、testFull タスクを使用する。
その他のタスク
main ソースで利用可能なタスクは、テストソースでも利用可能である。コマンドラインでは Test / をプレフィックスとして付け、Scala コードでも Test / で参照する。これらのタスクには以下が含まれる:
Test / compileTest / consoleTest / consoleQuickTest / runTest / runMain
これらのタスクの詳細はsbt runを参照。
出力
デフォルトでは、各テストソースファイルのログはそのファイルの全テストが完了するまでバッファリングされる。logBuffered を設定することで無効にできる:
Test / logBuffered := false
テストレポート
デフォルトでは、sbt はビルド内の全テストの JUnit XML テストレポートをプロジェクトの target/test-reports ディレクトリに生成する。JUnitXmlReportPlugin を無効にすることで無効にできる。
val myProject = (project in file(".")).disablePlugins(plugins.JUnitXmlReportPlugin)
オプション
テストフレームワークの引数
テストフレームワークへの引数は、-- 区切りに続けて test タスクのコマンドラインで指定できる。例:
> test org.example.MyTest -- -verbosity 1
ビルドの一部としてテストフレームワークの引数を指定するには、Tests.Argument で構築したオプションを追加する:
Test / testOptions += Tests.Argument("-verbosity", "1")
特定のテストフレームワーク用にのみ指定する場合:
Test / testOptions += Tests.Argument(TestFrameworks.ScalaCheck, "-verbosity", "1")
セットアップとクリーンアップ
Tests.Setup と Tests.Cleanup でセットアップとクリーンアップのアクションを指定する。() => Unit 型と ClassLoader => Unit 型の両方の関数を受け付ける。ClassLoader を受け取るバリアントには、テスト実行に使用される(または使用されていた)クラスローダーが渡される。テストクラスとテストフレームワーククラスにアクセスできる。
例:
Test / testOptions += Tests.Setup( () => println("Setup") )
Test / testOptions += Tests.Cleanup( () => println("Cleanup") )
Test / testOptions += Tests.Setup( loader => ... )
Test / testOptions += Tests.Cleanup( loader => ... )
テストスイートの並列実行を無効にする
デフォルトでは、sbt は全タスクを sbt 自身と同じ JVM 内で並列実行する。各テストスイートはタスクにマッピングされるため、テストもデフォルトで並列実行される。特定のプロジェクト内のテストを直列実行するには:
Test / parallelExecution := false
異なるプロジェクトのテストは依然として並行実行される場合がある。
クラスのフィルタ
名前が "Test" で終わるテストクラスのみを実行するには、Tests.Filter を使用する:
Test / testOptions := Seq(Tests.Filter(s => s.endsWith("Test")))
テストのフォーク
設定:
Test / fork := true
全てのテストを単一の外部 JVM で実行することを指定する。
テストを JVM に割り当てる方法や渡すオプションの詳細は、testGrouping キーで制御できる。
同時に実行できるフォーク JVM の最大数は、Tags.ForkedTestGroup タグの制限で制御する(デフォルトは 1)。グループがフォークされる場合、Setup と Cleanup アクションには実際のテストクラスローダーを渡せない。