テストが失敗した場合、それに依存するすべてのテストがスキップされるように、scalaTest 仕様間に依存関係を持たせることはできますか?
4 に答える
当時、それを正当化する説得力のあるユースケースがなかったので、私は TestNG のその機能を追加しませんでした。その後、いくつかのユースケースを収集し、それに対応する機能を ScalaTest の次のバージョンに追加しています。ただし、依存するテストではなく、満たされていない前提条件に基づいてテストを「キャンセル」する方法にすぎません。
それまでは、Scala if ステートメントを使用して、条件が満たされた場合にのみテストを登録するか、出力を確認したい場合は無視して登録することができます。Spec を使用している場合は、次のようになります。
if (databaseIsAvailable) {
it("should do something that requires the database") {
// ...
}
it ("should do something else that requires the database") {
}
}
これは、テスト構築時に条件が確実に満たされる場合にのみ機能します。たとえば、データベースが beforeAll メソッドによって起動されることになっている場合、おそらく、各テスト内でチェックを行う必要があります。その場合、保留中であると言えます。何かのようなもの:
it("should do something that requires the database") {
if (!databaseIsAvailable) pending
// ...
}
it("should do something else that requires the database") {
if (!databaseIsAvailable) pending
// ...
}
これは、テストが失敗した場合にテストスイートのすべてのテストを失敗させるScalaの特性です。
(提案をありがとう、Jens Schauder(この質問に対する別の回答を投稿しました))
長所:テストの依存関係を理解するのは簡単です。
短所:あまりカスタマイズできません。
自動ブラウザテストに使用しています。何かが失敗した場合、それは「めちゃくちゃ」状態にあるので、通常、GUIとの対話を続ける意味はありません。
ライセンス:パブリックドメイン(クリエイティブコモンズCC0)、または(オプションで)MITライセンス。
import org.scalatest.{Suite, SuiteMixin}
import scala.util.control.NonFatal
/**
* If one test fails, then this traits cancels all remaining tests.
*/
trait CancelAllOnFirstFailure extends SuiteMixin {
self: Suite =>
private var anyFailure = false
abstract override def withFixture(test: NoArgTest) {
if (anyFailure) {
cancel
}
else try {
super.withFixture(test)
}
catch {
case ex: TestPendingException =>
throw ex
case NonFatal(t: Throwable) =>
anyFailure = true
throw t
}
}
}
既製のソリューションについては知りません。しかし、独自の Fixture をかなり簡単に作成できます。
スイート トレイトの javadoc の「スタック可能なフィクスチャ トレイトの構成」を参照してください。
このようなフィクスチャは、たとえば、最初のテスト実行後のすべてのテスト実行を次の呼び出しに置き換えることができます。pending