開発していると、「テストが落ちるけど一時的にマージしたいからテストを通したい」ということがたまにある。そういうときにScalaTestではどうするのかについて調べてみた。
テストスイートごとignoreする
テストスイートというのはFooBarSpec
みたいなひとまとまりのこと。
ScalaTest 2.0以降は@ignore
アノテーションをテストスイートにつけることでテストをIgnoreする。
package windymelt import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.matchers.should.Matchers import org.scalatest.Ignore @Ignore class FooSpec extends AnyFlatSpec with Matchers { "true" should "be false" in { true shouldBe false } }
FooSpec: true - should be false !!! IGNORED !!! Execution took 0ms 1 tests, 1 ignored All tests in windymelt.FooSpec passed
個々のテストをignoreする
個々の"foo" should "bar" in {...}
をignoreするには、テストにタグ付けを行う。
AnyFlatSpecを使っているとき
特に、AnyFlatSpec
を使っている場合は、it
の部分をignore
に置換するだけで良い。
package windymelt import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.matchers.should.Matchers class FooSpec extends AnyFlatSpec with Matchers { ignore should "be false" in { true shouldBe false } }
FooSpec: - should be false !!! IGNORED !!! Execution took 0ms 1 tests, 1 ignored All tests in windymelt.FooSpec passed
AnyFunSpecを使っているとき
AnyFunSpec
の場合はit()
のかわりにignore()
と書く。
package windymelt import org.scalatest.funspec.AnyFunSpec import org.scalatest.matchers.should.Matchers class FooSpec extends AnyFunSpec with Matchers { describe("foo") { ignore("should be ignored") { true shouldBe false } } }
ちなみに、タグを自作してテストに付けておくことで、特定のテストだけ実行するといったことも可能になる(参考文献1を見てほしい)。
これより細かい粒度でテストを無視するにはコメントアウトするしかなさそうだ。ScalaTestでは1つのテストが評価の最小単位とみなされていて、個々のAssertionをいじることはあまり手段として用意されていない印象がある。一部のAssertionがコケるならテスト全体がコケるに決まっているので、だったらテストをignoreしてよ、ということらしい。