74

RESTfulAPIのさまざまなエンドポイントをテストする一連のscalatestテストがあります。最適な整理のために、それらを別々のファイルに分けてほしいと思っています。

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

私はBeforeAndAfterAllについて知っていますが、それは1つのテストファイル内でのみ達成されます。私はそのようなものが必要ですが、すべてのテストについて、例えば:

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

4

3 に答える 3

57

これを行うための意図された方法は、ネストされたスイートを使用することです。Suite には、IndexedSeq[Suite] を返すネストされたSuites メソッドがあります (2.0 では、1.9.1 では List[Suite] でした)。Suite には、ネストされたスイートの実行を担当する 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 の Runner はそれらを発見しません。しかし、sbt はまだそうするでしょう。私たちは現在、sbt を拡張して、DoNotDiscover のアノテーションが付けられた他の方法で検出可能なスイートを通過するようにしていますが、これはまだリリースされていない sbt 0.13 になります。当面は、未使用のコンストラクタ パラメータを Foo と Bar に追加することで、sbt にそれらを無視させることができます。

于 2013-03-21T19:27:19.807 に答える
12

わかりました、方法を見つけました。(ここの誰かが私を訂正できない限り)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
        }   
}

わかりました、しかしテストはどうですか?withwithに注意しFooBarください。依存テストを特性として取り入れています。ここを参照してください:

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!") {  }
    }
}
于 2013-03-15T02:31:11.670 に答える