sbt testOnly 带标签的排除列表不起作用

day*_*mer 4 scala sbt scalatest

我有一个测试班

import org.scalatest.FlatSpec

import scala.collection.mutable

class Tags101Spec extends FlatSpec {
  "A Stack" should "pop values in last-in-first-out order" in {
    val stack = new mutable.Stack[Int]
    stack.push(1)
    stack.push(2)
    assert(stack.pop() === 2)
    assert(stack.pop() === 1)
  }

  it should "throw NoSuchElementException if an empty stack is popped" in {
    val emptyStack = new mutable.Stack[String]
    intercept[NoSuchElementException] {
      emptyStack.pop()
    }
  }

  "A String" should "return 0 size when empty" taggedAs (Fast) in {
    assert("".size === 0)
  }

  "A Sorted List of 10 numbers" must "return 10 as the first element when reversed" taggedAs (Slow) in {
    assert(10 === (1 to 10).toList.reverse.head)
  }

}
Run Code Online (Sandbox Code Playgroud)

在同一目录中,我有一个名为的类Tags,看起来像

import org.scalatest.Tag

object Slow extends Tag("Slow Tests")
object Fast extends Tag("Fast Tests")
Run Code Online (Sandbox Code Playgroud)

sbt通过包含使用-n标志的标签来运行我的测试,它可以工作

sbt:Unit Testing in Scala> testOnly -- -n Fast
[info] Tags101Spec:
[info] A Stack
[info] A String
[info] A Sorted List of 10 numbers
[info] Run completed in 137 milliseconds.
[info] Total number of tests run: 0
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 0, failed 0, canceled 0, ignored 0, pending 0
Run Code Online (Sandbox Code Playgroud)

由于唯一的1测试是taggedAs(Fast),因此该测试仅运行一项测试。

现在,我想做相反的事情,排除Fast标签并运行剩余的测试。这是我尝试过的

sbt:Unit Testing in Scala> testOnly -- -l Fast
[info] Tags101Spec:
[info] A Stack
[info] - should pop values in last-in-first-out order
[info] - should throw NoSuchElementException if an empty stack is popped
[info] A String
[info] - should return 0 size when empty
[info] A Sorted List of 10 numbers
[info] - must return 10 as the first element when reversed
[info] Run completed in 252 milliseconds.
[info] Total number of tests run: 4
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 4, failed 0, canceled 0, ignored 0, pending 0
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它运行了4测试,这是所有测试,包括1 Fast标记测试。

我在这里缺少什么?如何使排除标签与 一起使用sbt

谢谢

Mar*_*lic 5

-lor的参数-n应该是name传递给Tags 构造函数的字符串参数,而不是对象的名称。例如,给定

object Slow extends Tag("SlowTests")
object Fast extends Tag("FastTests")
Run Code Online (Sandbox Code Playgroud)

然后排除

testOnly -- -l FastTests
Run Code Online (Sandbox Code Playgroud)

代替

testOnly -- -l Fast
Run Code Online (Sandbox Code Playgroud)

哪个输出

[info] Tags101Spec:
[info] A Stack
[info] - should pop values in last-in-first-out order
[info] - should throw NoSuchElementException if an empty stack is popped
[info] A String
[info] A Sorted List of 10 numbers
[info] - must return 10 as the first element when reversed
[info] Run completed in 187 milliseconds.
[info] Total number of tests run: 3
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 3, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
Run Code Online (Sandbox Code Playgroud)

我们看到A string测试没有执行。

name就我个人而言,在构造s 时,我会使用完全限定名称作为参数Tag,如下所示

package example

import org.scalatest.Tag

object Slow extends Tag("example.Slow")
object Fast extends Tag("example.Fast")
Run Code Online (Sandbox Code Playgroud)

并执行

testOnly -- -n example.Fast
Run Code Online (Sandbox Code Playgroud)

哪个输出

[info] Tags101Spec:
[info] A Stack
[info] A String
[info] - should return 0 size when empty
[info] A Sorted List of 10 numbers
[info] Run completed in 158 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
Run Code Online (Sandbox Code Playgroud)