【问题标题】:How to programmatically ignore/skip tests with ScalaTest?如何使用 ScalaTest 以编程方式忽略/跳过测试?
【发布时间】:2015-12-04 06:51:52
【问题描述】:

我正在使用 ScalaTest 运行一些测试,这些测试依赖于存在的测试服务器连接。我目前创建了自己的规范,类似于:

abstract class ServerDependingSpec extends FlatSpec with Matchers {

  def serverIsAvailable: Boolean = {
    // Check if the server is available
  }
}

当此方法返回 false 时,是否可以忽略(但不会失败)测试?

目前我以“hackish”的方式进行操作:

"Something" should "do something" in {
  if(serverIsAvailable) {
    // my test code
  }
}

但我想要类似的东西

whenServerAvailable "Something" should "do something" in { 
  // test code
}

"Something" should "do something" whenServerAvailable { 
  // test code
}

我想我应该定义我的自定义标签,但我只能参考inignore的源代码,我不明白我应该如何插入我的自定义实现。

我应该如何做到这一点?

【问题讨论】:

    标签: scala scalatest


    【解决方案1】:

    您可以使用assumeconditionally cancel a test

    "Something" should "do something" in {
      assume(serverIsAvailable)
    
      // my test code
    }
    

    或者你可以自己测试一些条件,然后使用cancel

    "Something" should "do something" in {
      if(!serverIsAvailable) {
        cancel
      }
    
      // my test code
    }
    

    【讨论】:

    • 也为此提供了假设:assume(server.isAvailable)
    • 很好,我已调整解决方案以显示完整示例。
    • 应该没有!。我尝试编辑它,但可惜编辑必须至少有 6 个字符。
    • 感谢您的提示。固定。
    • 失败的assume 的结果是org.scalatest.exceptions.TestCanceledException,整个套件最终被中止,结果整个构建失败。不知道这与fail 有何不同(除了文本输出略有不同)
    【解决方案2】:

    您可以使用标签来实现:

    如何使用标签的文档:http://www.scalatest.org/user_guide/tagging_your_tests

    使用命令行参数添加和删除标记测试:http://www.scalatest.org/user_guide/using_the_runner#specifyingTagsToIncludeAndExclude

    示例代码

    import org.scalatest.Tag
    
    object ServerIsAvailable extends Tag("biz.neumann.ServerIsAvailable")
    
    "Something" should "do something" taggedAs(ServerIsAvailable) in { 
      // your test here
    }
    

    运行测试

    运行测试有点棘手。它仅适用于 testOnlytestQuick,不适用于 test。 在示例中 testOnlytestOnly *

    的缩写
     sbt "testOnly -- -l biz.neumann.ServerAvailable"
    

    【讨论】:

    • 我也发现了这个,但是文档只提到了如何在命令行上做。但是,我在 Jenkins 上运行 sbt test,并且我想在服务器不可用时以编程方式跳过测试。
    • 那么程序应该在服务器可用时做出反应,还是您想配置 Jenkins 以推断服务器是否可用,然后让 jenkins 适应相应地运行测试?
    • 哦,现在我明白了。目前我以编程方式启动和关闭测试服务器(通过 SSH 在测试服务器上使用 Docker 完成),但使用 Jenkins 是更清洁的解决方案。
    • 关于编辑:无论如何我都使用testQuick。谢谢!
    【解决方案3】:

    这里有一些技巧可以根据条件跳过测试:

    object WhenServerAvailable extends Tag(if (serverIsAvailable) "" else classOf[Ignore].getName)
    
    "Something" should "do something" taggedAs WhenServerAvailable in { ... }
    

    【讨论】:

      猜你喜欢
      • 2015-02-02
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 2015-12-19
      • 2016-02-22
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      相关资源
      最近更新 更多