26

SBT が私の specs2 テストを並行して実行していることに気付きました。私のテストの1つがファイルからの読み取りと書き込みを伴うため、予期せず失敗することを除いて、これは良いようです。たとえば、以下を参照してください。

より良いオプションはありますか

  1. すべてのテストを連続して実行するように設定し、
  2. テストごとに個別のファイル名とティアダウンを使用していますか?
class WriteAndReadSpec extends Specification{
  val file = new File("testFiles/tmp.txt")

  "WriteAndRead" should {
    "work once" in {
      new FileWriter(file, false).append("Foo").close
      Source.fromFile(file).getLines().toList(0) must_== "Foo"
    }
    "work twice" in {
      new FileWriter(file, false).append("Bar").close
      Source.fromFile(file).getLines().toList(0) must_== "Bar"
    }
  }

  trait TearDown extends After {
    def after = if(file.exists) file.delete
  }
}
4

5 に答える 5

36

上記で sbt について書かれていることに加えて、specs2 はデフォルトで仕様のすべての例を同時に実行することを知っておく必要があります。

特定の仕様について、例を順番に実行する必要があることを宣言することもできます。sequentialこれを行うには、仕様の先頭に追加するだけです。

class WriteAndReadSpec extends Specification{
  val file = new File("testFiles/tmp.txt")

  sequential

  "WriteAndRead" should {
   ...
  }
}
于 2011-11-06T22:28:23.800 に答える
4

スイートの固定された一連のテストは、テスト ケースの相互依存性とメンテナンスの負担につながる可能性があります。

ファイルシステムに触れずにテストすることをお勧めします (ビジネス ロジックまたはシリアライゼーション コードに関係なく)。または、それが避けられない場合 (ファイル フィードとの統合のテストに関して) は、一時ファイルの作成を使用します。

// Create temp file.
File temp = File.createTempFile("pattern", ".suffix");
// Delete temp file when program exits.
temp.deleteOnExit();
于 2011-12-05T12:36:27.497 に答える
3

Pablo Fernandez回答で示したwiki リンク は非常に優れていますが、例には小さなエラーがあり、1 つが失敗する可能性があります (ただし、wiki であるため、修正できますし、実際に修正しました)。テストで実際に試したことはありませんが、実際にコンパイルして予想されるフィルターを生成するa を次に示します。project/Build.scala

import sbt._
import Keys._

object B extends Build
{
  lazy val root =
    Project("root", file("."))
      .configs( Serial )
      .settings( inConfig(Serial)(Defaults.testTasks) : _*)
      .settings(
         libraryDependencies ++= specs,
         testOptions in Test := Seq(Tests.Filter(parFilter)),
         testOptions in Serial := Seq(Tests.Filter(serialFilter))
       )
      .settings( parallelExecution in Serial := false : _*)

  def parFilter(name: String): Boolean = !(name startsWith "WriteAndReadSpec")
  def serialFilter(name: String): Boolean = (name startsWith "WriteAndReadSpec")

  lazy val Serial = config("serial") extend(Test)

  lazy val specs = Seq(
        "org.specs2" %% "specs2" % "1.6.1",
        "org.specs2" %% "specs2-scalaz-core" % "6.0.1" % "test"
      )
}
于 2011-11-06T19:41:55.130 に答える
2

シリアル テストを構成にグループ化し、残りを並行して実行しながら個別に実行する 3 番目のオプションがあるようです。

この wikiをチェックして、 「Application to parallel execution」を探してください。

于 2011-11-06T13:43:08.800 に答える