2012-06-22 163 views
93

我知道,一个单一的测试可以通过运行,在SBT跑出,ScalaTest in sbt:有没有一种方法可以在没有标签的情况下运行单个测试?

test-only *class -- -n Tag 

有没有告诉SBT/scalatest运行而不需要标记单个测试的方法吗?例如:

test-only *class -- -X 2 

这意味着“在课堂上进行第二次测试,不管它是什么”。我们有一堆测试,没有人打扰它们,所以有没有办法在没有标签的情况下运行单个测试?

+1

你的主题说:“Scalatest-SBT”。当sbt被连字符连接时,人们通常会想到一个插件。但是,为了澄清一下,你正在讨论如何使用[ScalaTest](http://www.scalatest.org/)从sbt 0.12这样的现代版本,而不是[joshcough/scalatest-sbt](https:// github.com/joshcough/scalatest-sbt)为4年前写的sbt 0.5.2-p3插件。正确? –

+0

正确。这是一个古老的问题,我从那时起就知道没有,这是不可能的(据我所知)。如果有人确实设法找出了方法,我还没有关闭它,但我不再需要这样做来回答。 – Nacht

+0

https://groups.google.com/forum/#!topic/scalatest-users/1oRMkudFAXM上有一个帖子(来自Bill Venners和Mark Harrah的参与),但还没有解决方案 –

回答

120

这是现在支持(因为ScalaTest 2.1.3)有:

testOnly *MySuite -- -z foo 

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

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

+2

适用于我,如果使用'testOnly * MySuite',而不是'只测试* MySuite' – cevaris

+2

修复,谢谢@cevaris。 sbt 0.13从连字风格转变为骆驼风格。 –

+0

@SethTisue你能发布一个使用'-t'进行精确匹配的工作示例吗?我无法得到它的工作。 – rmin

39

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

从SBT会话中:

test:test-only *YourTestClass 

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

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

test:test-quick 

...这将只执行失败的测试。 (在这种情况下重复最近执行的test:test-only命令将与test:test-quick相同,但是如果将测试方法分解为相应的测试类,则可以使用通配符使test:test-quick成为重新运行失败测试的更有效方法。)

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

如果在测试类中有太多的测试方法,请将它们分成不同的类或适当标记它们。 (这可能是一个信号,即被测类是违反single responsibility principle和可以使用的重构。)

+4

谁正面临“未执行测试”:'* YourTestClass'必须是类名称。不是文件名。 – MKatleast3

+0

@ MKatleast3我可以upvote你100次 – dangonfast

30

我想补充一个具体的例子来陪伴其他答案

您需要指定要测试的类名,所以如果你有以下的项目(这是一个游戏项目):

Play Project

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

test:testOnly *LoginServiceSpec 

如果您正在从SBT控制台之外的命令,你会做以下几点:

sbt "test:testOnly *LoginServiceSpec" 
+11

Upvote因为显然需要双引号:'''sbt“test:testOnly * LoginServiceSpec”'''' –

相关问题