Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

ScalaTestでテストをIgnoreする方法いろいろ

開発していると、「テストが落ちるけど一時的にマージしたいからテストを通したい」ということがたまにある。そういうときに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してよ、ということらしい。

参考文献

1 www.scalatest.org 2 stackoverflow.com

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?