184

我知道可以通过在 sbt 中运行来运行单个测试,

testOnly *class -- -n Tag

有没有办法告诉 sbt/scalatest 在没有标签的情况下运行单个测试?例如:

testOnly *class -- -X 2

这意味着“在课堂上运行第二个测试。不管它是什么”。我们有一堆测试,没有人费心标记它们,那么有没有办法在没有标记的情况下运行单个测试?

4

5 回答 5

233

现在在交互模式下支持(从 ScalaTest 2.1.3 开始):

testOnly *MySuite -- -z foo

仅运行名称包含子字符串“foo”的测试。

对于完全匹配而不是子字符串,请使用-t代替-z.

于 2014-03-18T20:59:03.587 回答
127

我想添加一个具体的例子来配合其他答案

您需要指定要测试的类的名称,因此如果您有以下项目(这是一个 Play 项目):

播放项目

您可以Login通过从 SBT 控制台运行以下命令来仅测试测试:

test:testOnly *LoginServiceSpec

如果您从 SBT 控制台外部运行该命令,您将执行以下操作:

sbt "test:testOnly *LoginServiceSpec"
于 2017-03-29T20:54:13.933 回答
53

我看不到在测试类中运行单个未标记测试的方法,但我提供了我的工作流程,因为它似乎对遇到这个问题的任何人都有用。

在 sbt 会话中:

test:testOnly *YourTestClass

(星号是通配符,您可以指定完整路径com.example.specs.YourTestClass。)

该测试类中的所有测试都将被执行。大概您最关心失败的测试,因此更正任何失败的实现,然后运行:

test:testQuick

...只会执行失败的测试。(重复最近执行的test:testOnly命令与test:testQuick本例相同,但如果您将测试方法分解为适当的测试类,则可以使用通配符以test:testQuick更有效的方式重新运行失败的测试。)

请注意,ScalaTest 中的 test 命名法是一个测试类,而不是特定的测试方法,因此所有未标记的方法都会被执行。

如果您在测试类中有太多测试方法,请将它们分成单独的类或适当地标记它们。(这可能表明被测类违反了单一职责原则,可以使用重构。)

于 2013-08-26T14:27:51.480 回答
21

只是为了简化泰勒的例子。

test:-prefix 不是必需的。

所以根据他的例子:

sbt- 控制台中:

testOnly *LoginServiceSpec

在终端:

sbt "testOnly *LoginServiceSpec"
于 2019-03-07T15:18:49.327 回答
14

这是关于使用跑步者的 Scalatest 页面以及关于选项的扩展讨论-t-z

这篇文章展示了哪些命令适用于使用FunSpec.

这是测试文件:

package com.github.mrpowers.scalatest.example

import org.scalatest.FunSpec

class CardiBSpec extends FunSpec {

  describe("realName") {

    it("returns her birth name") {
      assert(CardiB.realName() === "Belcalis Almanzar")
    }

  }

  describe("iLike") {

    it("works with a single argument") {
      assert(CardiB.iLike("dollars") === "I like dollars")
    }

    it("works with multiple arguments") {
      assert(CardiB.iLike("dollars", "diamonds") === "I like dollars, diamonds")
    }

    it("throws an error if an integer argument is supplied") {
      assertThrows[java.lang.IllegalArgumentException]{
        CardiB.iLike()
      }
    }

    it("does not compile with integer arguments") {
      assertDoesNotCompile("""CardiB.iLike(1, 2, 3)""")
    }

  }

}

此命令在iLike描述块中运行四个测试(来自 SBT 命令行):

testOnly *CardiBSpec -- -z iLike

您也可以使用引号,所以这也可以:

testOnly *CardiBSpec -- -z "iLike"

这将运行一个测试:

testOnly *CardiBSpec -- -z "works with multiple arguments"

这将运行以 "works with" 开头的两个测试:

testOnly *CardiBSpec -- -z "works with"

我无法-t选择在CardiBSpec文件中运行任何测试。此命令不运行任何测试:

testOnly *CardiBSpec -- -t "works with multiple arguments"

-t当测试没有嵌套在describe块中时,该选项似乎有效。我们再来看看另一个测试文件:

class CalculatorSpec extends FunSpec {
  it("adds two numbers") {
    assert(Calculator.addNumbers(3, 4) === 7)
  }
}

-t可用于运行单个测试:

testOnly *CalculatorSpec -- -t "adds two numbers"

-z也可用于运行单个测试:

testOnly *CalculatorSpec -- -z "adds two numbers"

如果您想运行这些示例,请参阅此 repo 。您可以在此处找到有关运行测试的更多信息。

于 2020-03-16T20:05:29.823 回答