1. ホーム
  2. scala

すべてのScalatestテストの前または後に何かをしている

2023-10-09 13:52:27

質問

RESTful API の異なるエンドポイントをテストする scalatest のテストスイートを持っています。 私は本当に最高の構成のために異なるファイルにそれらを分離したい。

私の問題は、すべてのテストの前に何か(私の場合はHTTPサーバーですが、それが何であるかは重要ではありません)を開始し、すべてのテストが終了した後にそれをシャットダウンする方法です。

私はBeforeAndAfterAllについて知っていますが、それは1つのテストファイル内でbefore/afterを達成するのみです。 私はそのようなものを必要としますが、たとえば、すべてのテストについてです。

-- テストの前にhttpサーバーを開始する

-- すべてのテストスイートを実行する

-- httpサーバーのシャットダウン

どのように解決するのですか?

意図した方法は、ネストされたスイートを使用することです。Suite には IndexedSeq[Suite] を返す nestedSuites メソッドがあります (2.0 では、1.9.1 では List[Suite] だった)。また、SuiteにはrunNestedSuitesメソッドがあり、ネストされたスイートを実行する役割を担っています。デフォルトでは、runNestedSuites は nestedSuites を呼び出し、返された各スイートに対して run を直接呼び出すか、または Distributor が渡された場合は、並行して実行できるように入れ子スイートを Distributor 内に配置します。

ですから、おそらく本当にやりたいことは、FooとBarをクラスにして、EndpointTestsのnestedSuitesメソッドからそれらのインスタンスを返すことです。それを簡単にするためにSuitesというクラスがあります。以下はその使用例です。

import org.scalatest._
import matchers.MustMatchers

class Foo extends FunSpec with MustMatchers {
  describe("Message here...") {
    it("Must do something") {  }
    it("Must be ok") {  }
  }
}

class Bar extends FunSpec with MustMatchers {
  describe("Hello you...") {
    it("One more!") {  }
  }
}

class EndpointTests extends Suites(new Foo, new Bar) with BeforeAndAfterAll {

  override def beforeAll(configMap: Map[String, Any]) {
    println("Before!")  // start up your web server or whatever
  }     

  override def afterAll(configMap: Map[String, Any]) {
    println("After!")  // shut down the web server
  }         
}

しかし、潜在的な問題として、実行するSuitesを見つけるためにディスカバリーを使用している場合、EndpointTests、Foo、Barの3つ全てが発見されてしまうということがあります。ScalaTest 2.0では、FooとBarに@DoNotDiscoverのアノテーションを付けると、ScalaTestのRunnerはそれらを検出しない。しかし、sbtは発見する。現在、DoNotDiscoverでアノテーションされたSuiteを発見できるようにsbtを改良しているが、これはまだリリースされていないsbt 0.13で行う予定だ。その間に、FooとBarに未使用のコンストラクタ・パラメータを追加することで、sbtにそれらを無視させることができます。