scalaTest in sbt:有没有办法在没有标签的情况下运行单个测试?

Nac*_*cht 135 testing sbt scalatest

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

testOnly *class -- -n Tag
Run Code Online (Sandbox Code Playgroud)

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

testOnly *class -- -X 2
Run Code Online (Sandbox Code Playgroud)

这意味着"在课堂上进行第二次测试.无论是什么".我们有一堆测试,没有人费心去标记它们,所以有没有办法在没有标签的情况下运行单个测试?

Set*_*sue 192

现在支持(自ScalaTest 2.1.3起):

testOnly *MySuite -- -z foo
Run Code Online (Sandbox Code Playgroud)

仅运行名称包含子字符串"foo"的测试.

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

  • 只是为了澄清,如果你从命令行运行它,它应该是单个参数:sbt"testOnly*MySuite - -z foo" (8认同)
  • 如果有人想要运行特定的集成测试(据说放在 `src/it` 下),他们需要在 `testOnly` 前面加上 `it`。例如,在命令行上:`sbt "it:testOnly *MyIntegrationTestSuite"`。 (2认同)
  • 如何过滤多个子字符串?测试可以按层次结构(WordSpec)进行分组,用“ when”和“ should”分隔的名称部分可以在测试之间重复。要选择一个特定的测试,我需要说“名称包含此与那个”。 (2认同)

Tyl*_*ler 81

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

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

玩项目

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

test:testOnly *LoginServiceSpec
Run Code Online (Sandbox Code Playgroud)

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

sbt "test:testOnly *LoginServiceSpec"
Run Code Online (Sandbox Code Playgroud)

  • Upvote因为显然双引号是必要的:``sbt"test:testOnly*LoginServiceSpec"``` (21认同)
  • 在这里对我来说最有用的答案。但是命令可以略微简化。在SBT控制台中:`testOnly * LoginServiceSpec`,在外部:`sbt“ testOnly * LoginServiceSpec”` (4认同)

cfe*_*uke 46

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

在sbt会话中:

test:testOnly *YourTestClass
Run Code Online (Sandbox Code Playgroud)

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

将执行该测试类中的所有测试.大概你最关心的是测试失败,所以纠正任何失败的实现然后运行:

test:testQuick
Run Code Online (Sandbox Code Playgroud)

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

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

如果测试类中有太多测试方法,请将它们分解为单独的类或适当地标记它们.(这可能是一个信号,表明被测试的课程违反了单一责任原则,可以使用重构.)

  • 谁面临"没有执行任何测试":`*YourTestClass`必须是类名.不是文件名. (10认同)

Pow*_*ers 9

这是关于使用 runner的 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)""")
    }

  }

}
Run Code Online (Sandbox Code Playgroud)

此命令运行iLikedescribe 块中的四个测试(来自 SBT 命令行):

testOnly *CardiBSpec -- -z iLike
Run Code Online (Sandbox Code Playgroud)

您也可以使用引号,因此这也适用:

testOnly *CardiBSpec -- -z "iLike"
Run Code Online (Sandbox Code Playgroud)

这将运行一个测试:

testOnly *CardiBSpec -- -z "works with multiple arguments"
Run Code Online (Sandbox Code Playgroud)

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

testOnly *CardiBSpec -- -z "works with"
Run Code Online (Sandbox Code Playgroud)

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

testOnly *CardiBSpec -- -t "works with multiple arguments"
Run Code Online (Sandbox Code Playgroud)

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

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

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

testOnly *CalculatorSpec -- -t "adds two numbers"
Run Code Online (Sandbox Code Playgroud)

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

testOnly *CalculatorSpec -- -z "adds two numbers"
Run Code Online (Sandbox Code Playgroud)

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


pme*_*pme 7

只是为了简化Tyler的示例。

test:-prefix不需要。

因此,根据他的示例:

sbt-console中:

testOnly *LoginServiceSpec
Run Code Online (Sandbox Code Playgroud)

在终端中:

sbt "testOnly *LoginServiceSpec"
Run Code Online (Sandbox Code Playgroud)