Concurrency 使用SBT标记控制specs2测试并发性
我想使用SBT标记控制我的一些规范的并发性 例如,我不希望同时运行多个使用数据库的测试 用ScalaTest,我就可以了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
@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 ...