Concurrency 使用SBT标记控制specs2测试并发性

Concurrency 使用SBT标记控制specs2测试并发性,concurrency,sbt,specs2,Concurrency,Sbt,Specs2,我想使用SBT标记控制我的一些规范的并发性 例如,我不希望同时运行多个使用数据库的测试 用ScalaTest,我就可以了 @TagAnnotation("database") @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) public @interface DatabaseTest { } @DatabaseTest class MyDatabaseTest1 ... @DatabaseTest class M

我想使用SBT标记控制我的一些规范的并发性

例如,我不希望同时运行多个使用数据库的测试

用ScalaTest,我就可以了

@TagAnnotation("database")
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface DatabaseTest { }

@DatabaseTest
class MyDatabaseTest1 ...

@DatabaseTest
class MyDatabaseTest2 ...
然后在build.sbt中

concurrentRestrictions in Global += exclusiveGroups(Tag("database"))
大多数测试是并行执行的,但是
MyDatabaseTest1
MyDatabaseTest2
不会与其他测试同时运行


我可以用specs2做这件事吗?

我自己添加了功能。(针对内置支持的问题:)

src/test/java/test/Tag.scala

首先定义要使用的注释。(我相信这只能用Java实现。)

src/test/scala/test/TaggingFramework.scala

然后定义一个
sbt.testing.Framework
的实现,它包装了一个
Framework
并为注释添加标记。(注意:这取决于。如果您已经引入了specs2,那么它应该已经存在了。)

project/TaggingTestFramework.scala

然后在构建定义中,定义
sbt.TestFramework
TaggingTestFramework
子类。这将加载
标记框架
(如果存在)。否则,它只使用原始框架

import sbt.TestFramework
import sbt.testing._
import scala.language.existentials
import scala.util.Try

class TaggingTestFramework(testFramework: TestFramework) extends TestFramework() {
  override def create(loader: ClassLoader, log: sbt.Logger) = testFramework.create(loader, log).map { framework =>
    Try(
      Class.forName("test.TaggingFramework", true, loader).asInstanceOf[Class[Framework]]
        .getConstructor(classOf[Framework]).newInstance(framework)
    ).getOrElse(framework)
  }

  override def toString = s"TaggingTestFramework($testFramework)"
}
构建.sbt

并包装
testFrameworks

testFrameworks := testFrameworks.value.map(new TaggingTestFramework(_))
这主要适用于任何Scala或Java框架,包括specs2


src/test/scala/example/MySpec.scala

最后,要使用向测试任务添加标记,只需将注释添加到类中即可

import org.specs2.mutable.Specification
import test.Tag

@Tag(name = "database")
class MySpec extends Specification ...

注意1:这目前不适用于继承


注2:SBT分叉测试的工作方式非常不同。此功能和许多其他测试功能不适用于分叉测试。

您是否尝试使用相同的标记对规范进行注释?事实上,我并不知道您可以使用此方法降低规范的并发级别。请注意,除非使用
sequential
参数,否则每个规范都保持并发。@Eric,呃,
TagAnnotation
是一个ScalaTest注释,它(我假设)由ScalaTest运行程序使用并暴露于SBT。我应该说清楚。是的,规范中示例的执行是由规范2控制的,而不是SBT。我发现这很容易控制,因为所有的例子都可以在一个文件中看到。这还不受支持。在specs2中实现这一点的一种方法是创建一个带有数据库spec链接的父spec,并按顺序执行该spec。缺点是您必须维护此父规范,并在有新规范时添加新规范。因此,更好的方法是等待我来实现:-)我在
3.7.3-20160413201225-0d1765e
中添加了缺少的对标记的支持,但是以specs2已经知道的标记的形式:。我试图观察sbt的“无并发”行为,但看不到任何东西(但我看到标签被找到了)。
testFrameworks := testFrameworks.value.map(new TaggingTestFramework(_))
import org.specs2.mutable.Specification
import test.Tag

@Tag(name = "database")
class MySpec extends Specification ...