Sbt 中的 ScalaTest: 有没有办法在没有标记的情况下运行单个测试?

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

testOnly *class -- -n Tag

是否有办法告诉 sbt/scalatest 运行一个没有标记的测试? 例如:

testOnly *class -- -X 2

意思是“运行课堂上的第二个测试”。不管是什么”。我们有很多测试,但是没有人费心去标记它们,那么有没有一种方法可以运行一个没有标记的测试呢?

145997 次浏览

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

在 sbt 会议上:

test:testOnly *YourTestClass

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

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

test:testQuick

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

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

如果在一个测试类中有太多的测试方法,那么可以将它们分解成单独的类或者适当地标记它们。(这可能是一个信号,表明所测试的类违反了 单一责任原则单一责任原则,因此可以使用重构。)

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

testOnly *MySuite -- -z foo

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

对于精确匹配而不是子字符串,使用 -t而不是 -z


如果从命令行运行它,它应该是 sbt 的单个参数:

sbt 'testOnly *MySuite -- -z foo'

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

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

Play Project

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

test:testOnly *LoginServiceSpec

如果在 SBT 控制台之外运行该命令,则需要执行以下操作:

sbt "test:testOnly *LoginServiceSpec"

简单来说就是泰勒的例子。

不需要 test:前缀。

根据他的例子:

sbt控制台:

testOnly *LoginServiceSpec

在终点站:

sbt "testOnly *LoginServiceSpec"

这是关于 用跑步机关于 ABC0和 -z选项的扩展讨论的 Scalatest 页面。

这篇文章展示了使用 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"

看起来当测试不嵌套在 describe块中时,-t选项可以工作。让我们看看另一个测试文件:

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"

如果你想运行这些例子,请参阅 这个回购。你可以找到更多关于运行测试 给你的信息。