web-dev-qa-db-ja.com

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

RESTful APIのさまざまなエンドポイントをテストする一連のscalatestテストがあります。最良の編成のために、それらを異なるファイルに分けてほしい。

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

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

-テストの前にhttpサーバーを起動します
-すべてのテストスイートを実行する
-httpサーバーをシャットダウンします

68
Greg

これを行う目的は、ネストされたスイートを使用することです。 Suiteには、IndexedSeq [Suite](2.0では1.9.1ではList [Suite])を返すnestedSuitesメソッドがあります。スイートには、ネストされたスイートの実行を担当するrunNestedSuitesメソッドもあります。デフォルトでは、runNestedSuitesはnestedSuitesを呼び出し、返された各Suiteでrunを直接呼び出すか、Distributorが渡された場合、ネストされたスイートをディストリビューターに配置して、並列実行できるようにします。

したがって、おそらく本当にやりたいことは、FooとBarをクラスにして、EndpointTestsのnestedSuitesメソッドからそれらのインスタンスを返すことです。スイートと呼ばれる簡単なクラスがあります。その使用例を次に示します。

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
  }         
}

ただし、潜在的な問題の1つは、検出を使用して実行するスイートを見つけると、EndpointTests、Foo、およびBarの3つすべてが検出されることです。 ScalaTest 2.0では、@ DoNotDiscoverでFooとBarに注釈を付けることができ、ScalaTestのランナーはそれらを検出しません。しかし、sbtはまだそうです。現在、sbtを拡張して、DoNotDiscoverの注釈が付けられている他の発見可能なスイートを通過するようにしていますが、これはまだリリースされていないsbt 0.13になります。それまでは、未使用のコンストラクタパラメータをFooとBarに追加することで、sbtにそれらを無視させることができます。

51
Bill Venners

または、オブジェクトを使用することもできます。

object TestServer {
  startServer()
}

オブジェクトにアクセスすると、オブジェクトが初期化され、サーバーが起動します。オブジェクトにアクセスする本体に共通の特性を作成するだけです。次に、その特性をすべてのテストにミックスインします。できた.

サーバーがデーモンモードで実行されている場合(テストモードのPlay!アプリケーションなど)、すべてのテストの実行後に自動的にシャットダウンされます。

11
Machisuji

OK、方法を見つけました。 Scalatestには「マスター」スイートの機能がないようです(ここで誰かが私を修正できない限り)。しかし...あなたはちょっと構築することができます。

特性からスイートを作成できます。だから私のエンドポイントの例を使用して:

class EndpointTests extends FunSpec with MustMatchers with BeforeAndAfterAll 
      with Foo with Bar {
        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
        }   
}

わかりましたが、テストはどうですか? with Foo with Barに注意してください。依存テストを特性として取り入れています。こちらをご覧ください:

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

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