sbt 中的 ScalaTest:有没有办法在没有标签的情况下运行单个测试?
Posted
技术标签:
【中文标题】sbt 中的 ScalaTest:有没有办法在没有标签的情况下运行单个测试?【英文标题】:ScalaTest in sbt: is there a way to run a single test without tags? 【发布时间】:2012-06-24 23:22:48 【问题描述】:我知道可以通过在 sbt 中运行来运行单个测试,
testOnly *class -- -n Tag
有没有办法告诉 sbt/scalatest 在没有标签的情况下运行单个测试?例如:
testOnly *class -- -X 2
这意味着“运行班级中的第二个测试。不管它是什么”。我们有一堆测试,没有人费心标记它们,那么有没有办法在没有标记的情况下运行单个测试?
【问题讨论】:
你的主题说“Scalatest-sbt”。当 sbt 连字符时,人们通常会想到一个插件。但是,为了澄清一点,您说的是使用现代版本的 sbt(如 sbt 0.12)中的 ScalaTest,而不是 4 年前编写的用于 sbt 0.5.2-p3 的插件 joshcough/scalatest-sbt。对吗? 正确。这是一个老问题,从那时起我就发现不,这是不可能的(据我所知)。我没有关闭它,以防有人确实设法找到了方法,但我不再需要回答这个问题。 groups.google.com/forum/#!topic/scalatest-users/1oRMkudFAXM 有一个关于此的主题(Bill Venners 和 Mark Harrah 都参与其中),但还没有解决方案 还有一个一般支持运行单个测试 sbt#911 (github.com/sbt/sbt/issues/911) 的案例。 请注意,如果您从命令行运行,you have to enclose everything aftersbt
in quotes,例如sbt "test-only *SingleTestSuite"
【参考方案1】:
现在在交互模式下支持(从 ScalaTest 2.1.3 开始):
testOnly *MySuite -- -z foo
只运行名称中包含子字符串“foo”的测试。
对于完全匹配而不是子字符串,使用-t
而不是-z
。
【讨论】:
@SethTisue 您能否发布一个使用-t
进行精确匹配的工作示例?我无法让它工作。
@rmin gist.github.com/SethTisue/f75cd8b72128ba0a0a81。 (如果这可以帮助您解决问题,请告诉我应该如何更新我的答案。)
澄清一下,如果你从命令行运行它,它应该是单个参数:sbt "testOnly *MySuite -- -z foo"
如果有人想要运行特定的集成测试(应该放在src/it
下),他们需要在it
前面加上testOnly
。例如,在命令行上:sbt "it:testOnly *MyIntegrationTestSuite"
.
如何过滤多个子字符串?测试可以按层次结构(WordSpec)分组,由when
和should
分隔的名称部分可以在测试之间重复。要选择一个特定的测试,我需要说“名称包含这个和那个”。【参考方案2】:
我想添加一个具体的例子来配合其他答案
您需要指定要测试的类的名称,所以如果您有以下项目(这是一个 Play 项目):
您可以通过从 SBT 控制台运行以下命令来仅测试 Login
测试:
test:testOnly *LoginServiceSpec
如果您从 SBT 控制台外部运行该命令,您将执行以下操作:
sbt "test:testOnly *LoginServiceSpec"
【讨论】:
赞成,因为显然双引号是必要的:sbt "test:testOnly *LoginServiceSpec"
这里对我最有用的答案。 ? 但是命令可以稍微简化;在 SBT 控制台中:testOnly *LoginServiceSpec
,在外部:sbt "testOnly *LoginServiceSpec"
看来这是 sbt 0.13 的语法。使用sbt "Test/testOnly *LoginServiceSpec
或更好的事件,如其他地方提到的sbt "testOnly *LoginServiceSpec"
【参考方案3】:
我看不到在测试类中运行单个未标记测试的方法,但我提供了我的工作流程,因为它似乎对遇到此问题的任何人都有用。
在 sbt 会话中:
test:testOnly *YourTestClass
(星号是通配符,可以指定完整路径com.example.specs.YourTestClass
。)
该测试类中的所有测试都将被执行。大概你最关心失败的测试,所以更正任何失败的实现,然后运行:
test:testQuick
... 只会执行失败的测试。 (在这种情况下,重复最近执行的test:testOnly
命令将与test:testQuick
相同,但是如果您将测试方法分解为适当的测试类,则可以使用通配符使test:testQuick
成为更有效的重新- 运行失败的测试。)
请注意,ScalaTest 中的 test 命名法是一个测试类,而不是特定的测试方法,因此所有未标记的方法都会被执行。
如果您在测试类中有太多测试方法,请将它们分成单独的类或适当地标记它们。 (这可能表明被测类违反了single responsibility principle 并且可以使用重构。)
【讨论】:
对于面临“未执行测试”的人:*YourTestClass
必须是类名。不是文件名。
对我来说是 testOnly 而不是 test-only。
喜欢*的含义。【参考方案4】:
只是为了简化 Tyler 的例子。
test:
-prefix 不需要。
所以按照他的例子:
在sbt
-console:
testOnly *LoginServiceSpec
在终端中:
sbt "testOnly *LoginServiceSpec"
【讨论】:
【参考方案5】:这是using the runner 和the extended discussion on the -t
and -z
options 上的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"
看起来-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"
如果您想运行这些示例,请参阅this repo。你可以找到更多关于运行测试的信息here。
【讨论】:
哇,伙计!这真的是我在生活中遇到的一个创新的测试套件。脱帽致敬。以上是关于sbt 中的 ScalaTest:有没有办法在没有标签的情况下运行单个测试?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ScalaTest / SBT 中按顺序运行测试套件?
如何使用 scalatest 运行 sbt 测试?我有一个错误:对象 scalatest 不是包 org 的成员
如何使用 SBT Jenkins 插件运行特定测试以进行 ScalaTest 测试