26

我注意到 SBT 正在并行运行我的 specs2 测试。这看起来不错,除了我的一个测试涉及从文件读取和写入,因此会意外失败,例如见下文。

有没有比这更好的选择

  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 链接 非常好,尽管示例中有一个小错误可能会导致错误(尽管作为一个 wiki,我可以并且确实纠正了它)。这是一个实际编译并生成预期过滤器的,尽管我实际上并没有通过测试进行尝试。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

似乎还有第三种选择,即将串行测试分组到一个配置中,然后分别运行它们,同时并行运行其余的测试。

检查这个 wiki,寻找“并行执行的应用程序”

于 2011-11-06T13:43:08.800 回答
0

其他答案解释了如何使用使它们按顺序运行。

虽然它们是有效的答案,但我认为最好更改您的测试以让它们并行运行。(如果可能的话)

在您的示例中 - 为每个测试使用不同的文件。如果您涉及数据库 - 使用不同(或随机)用户(或任何隔离)等......

于 2015-01-02T15:27:28.313 回答