sbt中的ScalaTest:有没有办法运行没有标签的单个测试?


150

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

testOnly *class -- -n Tag

有没有办法告诉sbt / scalatest运行不带标签的单个测试?例如:

testOnly *class -- -X 2

这将意味着“运行班级中的第二个测试。无论它是什么”。我们有很多测试,没有人打扰他们,所以有没有办法在没有标签的情况下运行单个测试?


1
您的主题为“ Scalatest-sbt”。当sbt被连字时,人们通常会想到一个插件。但是,为了澄清起见,您是在谈论使用sbt的现代版本(例如sbt 0.12)中的ScalaTest,而不是使用 4年前编写的sbt 0.5.2-p3插件joshcough / scalatest-sbt。正确?
2013年

正确。这是一个古老的问题,从那以后我就知道不行,这是不可能的(据我所知)。万一有人确实设法找到一种方法,我还没有关闭它,但是我不再需要回答这个问题。
Nacht

有关这个问题(Bill Venners和Mark Harrah都有参加),请访问groups.google.com/forum/#!topic/scalatest-users/1oRMkudFAXM,但目前尚无解决方案
Seth Tisue 2014年

1
在运行单个测试sbt#911(github.com/sbt/sbt/issues/911)时,也需要一般支持。
Eugene Yokota 2014年

14
请注意,如果您是从命令行运行的,则必须sbt用引号将所有内容括起来,例如sbt "test-only *SingleTestSuite"
Chris Martin

Answers:


202

现在(在ScalaTest 2.1.3起)在交互模式下受支持:

testOnly *MySuite -- -z foo

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

要获得完全匹配而不是子字符串,请使用-t代替-z


@SethTisue您能否发布一个-t用于精确匹配的工作示例?我无法使其正常工作。
rmin 2015年

@rmin gist.github.com/SethTisue/f75cd8b72128ba0a0a81。(如果这可以帮助您解决问题,请让我知道如何更新答案。)
赛斯·提苏

10
为了澄清一下,如果您从命令行运行它,则应将其作为单个参数:sbt“ testOnly * MySuite--z foo”
Sogartar

2
如果有人要运行特定的集成测试(假定放置在下方src/it),则需要添加ittestOnly。例如,在命令行上:sbt "it:testOnly *MyIntegrationTestSuite"
–laylaylom

2
如何过滤多个子字符串?测试可以按层次结构(WordSpec)进行分组,名称部分之间用分隔,when并且should 可以在测试之间重复。要选择一个特定的测试,我需要说“名称包含此AND那”。
Vituel

97

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

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

玩项目

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

test:testOnly *LoginServiceSpec

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

sbt "test:testOnly *LoginServiceSpec"

27
赞成,因为显然必须使用双引号:sbt "test:testOnly *LoginServiceSpec"
Jason Wheeler

5
在这里对我来说最有用的答案。👍但是命令可以稍微简化一些;在SBT控制台中:testOnly *LoginServiceSpec和外部:sbt "testOnly *LoginServiceSpec"
Jonik

49

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

在sbt会话中:

test:testOnly *YourTestClass

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

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

test:testQuick

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

请注意,ScalaTest中用于测试的术语是测试类,而不是特定的测试方法,因此将执行所有未标记的方法。

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


10
对于面临“未执行测试”的用户:*YourTestClass必须为类名。不是文件名。
MKatleast3 '17

1
对我来说,这是testOnly而不是仅测试。
Jan Clemens Stoffregen

11

只是为了简化Tyler的示例。

test:-prefix不需要。

因此,根据他的示例:

sbt-console中:

testOnly *LoginServiceSpec

在终端中:

sbt "testOnly *LoginServiceSpec"

0

这是有关使用跑步小人的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)""")
    }

  }

}

此命令在iLikedescribe块中运行四个测试(从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"

如果您想运行这些示例,请参阅此仓库

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.