Tags 覆盖ScalaTest中测试的标记

Tags 覆盖ScalaTest中测试的标记,tags,hook,scalatest,Tags,Hook,Scalatest,我想将DRY原则应用到我的ScalaTest测试定义中。具体来说,我想定义一个抽象测试类,它定义了一系列测试。所有的测试都会调用一些函数,其中的参数表示要测试的条件。该函数的定义留给扩展类。到目前为止,这是可行的 接下来,我想将任何失败的测试标记为“回归”测试,这样如果我愿意,我就可以运行这些测试 但是测试最初是在抽象类中标记的。我需要在实现类中重写标记或添加标记 有没有一个干净的方法可以做到这一点?文档暗示有,但到目前为止,我找不到如何做的示例。我从未找到关于如何做的文档,但ScalaDocs

我想将DRY原则应用到我的ScalaTest测试定义中。具体来说,我想定义一个抽象测试类,它定义了一系列测试。所有的测试都会调用一些函数,其中的参数表示要测试的条件。该函数的定义留给扩展类。到目前为止,这是可行的

接下来,我想将任何失败的测试标记为“回归”测试,这样如果我愿意,我就可以运行这些测试

但是测试最初是在抽象类中标记的。我需要在实现类中重写标记或添加标记


有没有一个干净的方法可以做到这一点?文档暗示有,但到目前为止,我找不到如何做的示例。

我从未找到关于如何做的文档,但ScalaDocs中有足够的信息,我能够理解。为了让那些可能想做类似事情的人受益,以下是您需要知道的:

首先,你需要定义你自己的特质,你可以将这些特质混合在一起,从而获得这种额外的行为。它将覆盖tag()的定义,如下所示:

trait _____ extends SuiteMixin with Informing { this: Suite with Informing =>
  // with Informing, etc. is so that you can call info() 
  // to add comments to tests - not strictly needed for this

  abstract override def tags : Map[String, Set[String]] = {
    // implementation
  }
}
实现必须调用
super.tags
,然后在返回结果数据结构之前将需要添加的内容添加到结果数据结构中。结果的键将是测试名称,值将是标记字符串集。注意:没有标记的测试将不存在,因此您将无法依赖于对该对象进行迭代来找到要操作的测试。您将不得不调用
this.testNames
并对其进行迭代

下面是我编写的一个代码示例,展示了如何实现这一点

  abstract override def tags : Map[String, Set[String]] = {
    val original = super.tags
    val matching = <list of what to automatically add tags to>
    if ( matching.isEmpty ) original
    else {
      val tests = this.testNames.toList
      def extend( result: Map[String, Set[String]], test_list: List[String] ) : Map[String, Set[String]] = 
        if ( test_list.isEmpty ) result
        else {
          val matches = ( for ( p <- matching if ( <applicable> ) ) yield true ) contains true
          if ( ! matches ) extend( result, test_list.tail )
          else extend( 
            result.updated( 
              test_list.head,
              result.getOrElse( test_list.head, Set[String]() )
                + "<tag-to-be-added>" ),
            test.tail 
          )
        }
      extend( original, tests )
    }
  }
abstract override def标记:Map[String,Set[String]={
val original=super.tags
val匹配=
如果(匹配.i空)原件
否则{
val tests=this.testNames.toList
def extend(结果:Map[String,Set[String]],test_list:list[String]):Map[String,Set[String]=
if(test_list.isEmpty)结果
否则{
val匹配=(对于(p