ScalaTest:了解测试的执行顺序

思凡

我正在努力理解为什么我的安装拆卸程序无法按我期望的那样在ScalaTest中运行。基本上,我的测试代码如下所示:

class UserManagerTest extends FlatSpec with ManagerBehaviors[User, UserDAO] {

  "An entity manager" should behave like allFindingManager(UserManager)

  "An entity manager" should behave like countingManager(UserManager)
}


trait ManagerBehaviors[T <: IEntity, D <: AbstractDAO[T]] {

this: FlatSpec =>

   private def withClearDB(entityManager: BasicManager[T, D], testFunction: () => Unit) = {
    try {
      clearDB(entityManager)
      testFunction()
    } finally {
      clearDB(entityManager)
    }
  }

  private def clearDB(manager: BasicManager[T, D]) = {
    manager.all match {
      case Some(entities) => for (entity <- entities) manager.remove(entity.getId)
    }
  }

  def allFindingManager(manager: BasicManager[T, D]) {
    withClearDB(manager,
      () => it should "properly return all elements in the database for the entity" in {

        // Add 10 entities to the database
        for (i <- 1 to 10) manager.persist(manager.defaultEntity)

        manager.all match {
          case Some(entities) => assert(entities.length == 10)
          case None => fail()
        }
      })
  }

  def countingManager(manager: BasicManager[T, D]) {
    withClearDB(manager,
      () => it should "properly count the number of entities managed" in {

        // Add 10 entities to the database
        for (i <- 1 to 10) manager.persist(manager.defaultEntity)

        assert(manager.count == 10)
      })
  }
}

我期望的是以下顺序:

  1. 清除数据库

  2. allFindingManager

  3. 清除数据库

  4. 清除数据库

  5. 计数管理器

  6. 清除数据库

当以隔离方式运行时,测试将按预期工作-启动时将清除数据库,并在测试结束时将其保留为空。

但是,在运行整个UserManagerTest类时,由于某种原因,它会失败并显示以下内容:

org.scalatest.exceptions.TestFailedException: 20 did not equal 10

这样做的原因是,某种程度上,测试是在彼此之间立即调用的,而没有间断的clearDB调用。我不知道为什么会这样。

使用调试器并在finally块中放置断点时,可能会发现发生的情况:此块确实按预期运行了两次,但这是在执行测试方法之前发生的!全部:

  1. 清除数据库

  2. 清除数据库

  3. 清除数据库

  4. 清除数据库

  5. allFindingManager

  6. 计数管理器

谁能帮我阐明一下吗?

斯皮罗·米恰洛夫(Spiro Michaylov)

如果你改变

def countingManager(manager: BasicManager[T, D]) {
  withClearDB(manager,
    () => it should "properly ..." in {

      // Add 10 entities to the database
      for (i <- 1 to 10) manager.persist(manager.defaultEntity)

      assert(manager.count == 10)
    })
}

def countingManager(manager: BasicManager[T, D]) {

  it should "properly ..." in withClearDB(manager,
    () => {
      // Add 10 entities to the database
      for (i <- 1 to 10) manager.persist(manager.defaultEntity)

      assert(manager.count == 10)
    }
  )

}

同样在其他函数中,执行顺序将与您期望的一样。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ScalaTest:了解测试的执行顺序

来自分类Dev

了解Javascript代码执行顺序

来自分类Dev

按顺序执行测试

来自分类Dev

如何测试流程/执行顺序?

来自分类Dev

Python生成器:了解执行顺序

来自分类Dev

了解管道:行读取和执行顺序

来自分类Dev

了解管道:行读取和执行顺序

来自分类Dev

在并行执行测试时获取顺序日志

来自分类Dev

phpunit测试按什么顺序执行?

来自分类Dev

使用Arquillian TestRunner TestNG顺序执行测试

来自分类Dev

JUnit的5:指定执行顺序嵌套测试

来自分类Dev

集成测试的执行顺序在Srping Boot(

来自分类Dev

phpunit测试按什么顺序执行?

来自分类Dev

如何指定测试中方法的执行顺序?

来自分类Dev

在 Junit 中维护测试的执行顺序

来自分类Dev

AT命令响应(了解Arduino上代码执行的顺序)

来自分类Dev

Visual Studio 2012顺序测试,如何监视测试执行

来自分类Dev

Visual Studio 2012顺序测试,如何监视测试执行

来自分类Dev

Scalatest中止测试处理

来自分类Dev

如何使用ScalaTest执行OR

来自分类Dev

Boost单元测试框架依赖关系执行顺序

来自分类Dev

Symfony2-测试用例的执行顺序

来自分类Dev

我可以更改junit测试的执行顺序吗?

来自分类Dev

mxunit测试用例中的函数执行顺序

来自分类Dev

为什么在TestNG中此测试的执行顺序如此?

来自分类Dev

以其他顺序执行时测试失败

来自分类Dev

如何在Selenium中设置执行测试的顺序

来自分类Dev

mxunit测试用例中的函数执行顺序

来自分类Dev

我可以更改junit测试的执行顺序吗?